代码质量不佳会导致不可预测的行为。对于用户来说,通常表现为可用性差。对于攻击者来说,提供了以意外方式对系统施加压力的机会。
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
进行比较。这种比较将始终返回 false,因为该对象并不是 null
。(如果对象为 null
,则程序将抛出 NullPointerException
异常)。main()
函数调用 pthread_create()
而产生的线程,如果父进程没有调用 pthread_exit()
而早于任何线程结束执行,则这些线程会过早终止。调用 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);
}
}