程式碼品質不佳,會導致無法預料的行為。從使用者的角度來看,這通常表現為可用性不佳。對於攻擊者而言,這提供了以意想不到的方式向系統施加壓力的機會。
void clean_up()
{
char tmp[256];
...
free(tmp);
return;
}
System.Object.Equals()
:
public boolean Equals(string obj) {
...
}
System.Object.Equals()
需要一個 object
類型的引數,因此將永遠不會呼叫此方法。Object.equals()
:
public boolean equals(Object obj1, Object obj2) {
...
}
Object.equals()
只需要一個引數,因此將永遠不會呼叫 Example 1
中的方法。ISerializable
介面但不聲明 [Serializable]
屬性的類別將不會序列化。[Serializable]
屬性的物件進行序列化。如果類別能夠透過由 .NET 框架定義的預設序列化方法來序列化,則物件也可正確地序列化。如果類別要求自訂的序列化方法,則它必須執行 ISerializable
介面。不過,類別仍然必須聲明 [Serializable]
屬性。CustomStorage
類別執行 ISerializable
介面。不過,因為它沒有聲明 [Serializable]
屬性,所以它不會序列化。
public class CustomStorage: ISerializable {
...
}
java.io.Serializable
的內部類別可能導致問題並從外部類別洩漏資訊。
...
class User implements Serializable {
private int accessLevel;
class Registrator implements Serializable {
...
}
}
Example 1
中,當序列化內部類別 Registrator
時,也會從 User
外部類別序列化 accessLevel
欄位。synchronized
,保證多個執行緒存取相同實例時可正確運作。也應該宣告所有的取代方法為 synchronized
,否則可能會發生意外行為。Foo
類別會取代 Bar
類別,但是不會宣告 synchronizedMethod
方法為 synchronized
:
public class Bar {
public synchronized void synchronizedMethod() {
for (int i=0; i<10; i++) System.out.print(i);
System.out.println();
}
}
public class Foo extends Bar {
public void synchronizedMethod() {
for (int i=0; i<10; i++) System.out.print(i);
System.out.println();
}
}
Foo
的實例轉換為 Bar
類型。若向兩個不同的執行緒提供同一實例,並重複執行 synchronizedMethod
,則行為將無法預測。obj.Equals(null)
將永遠為 false。Equals()
方法將物件與 null
做比較。Equals()
方法的約定將要求此比較永遠傳回 false。obj.equals(null)
將永遠為 false。equals()
方法將物件與 null
做比較。由於該物件不是 null
,因此,此比較將永遠傳回 false。(如果該物件為 null
,程式會拋出 NullPointerException
)。pthread_exit()
,就會先終止由主處理 main()
函數的 pthread_create()
所呼叫而洐生的執行緒。呼叫 pthread_exit()
保證主處理會持續進行,直到所有執行緒完成執運作方式止。或者,主處理可呼叫所有子執行緒上的 pthread_join
,並確定這些執行緒將在處理結束前完成。pthread_create()
來建立執行緒,然後正常結束。如果子執行緒在 main()
函數回傳時沒有完整執行,就會先被終止。
void *Simple(void *threadid)
{
...
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
int rc;
pthread_t pt;
rc = pthread_create(&pt, NULL, Simple, (void *)t);
if (rc){
exit(-1);
}
}