16.2更换计算机,程序出现怪异的结果
许多地方有可能出错。下面是一些通常的检查要点:
1、未初始化的局部变量, 参见问题7.1。
2、整数上溢, 特别是在一些16 比特的机器上, 一些中间计算结果可能上溢, 象a* b / c, 参见问题3.11。
3、未定义的求值顺序, 参见问题3.1 到3.5。
4、忽略了外部函数的说明, 特别是返回值不是int 的函数, 或是参数“缩小” 或可变的函数。参见问题1.8, 11.4 和15.1。
5、复引用空指针, 参见第5 章。
6、malloc/free 的不适当使用: 假设malloc 的内存都被清零、已释放的内存还可用、再次释放已释放内存、malloc 的内部被破坏, 参见问题7.16 和7.17。
7、指针类常规问题, 参见问题16.7。
8、printf() 格式与参数不符, 特别是用%d 输出long int, 参见问题12.7。
9、试图分配的内存大小超出一个unsigned int 类型的范围, 特别是在内存有限的机器上, 参见问题7.14和19.27。
10、数组边界问题, 特别是暂时的小缓冲, 也许用于sprinf() 来构造一个字符串,参见问题7.1 和12.19。
11、错误的假设了typedef 的映射类型, 特别是size t。
12、浮点问题, 参见问题14.1 和14.4。
13、任何你自己认为聪明的在特定机器上的机器代码生成小技巧。
正确使用函数原型说明能够捕捉到一些以上的问题。lint 会捕捉到更多。参见问题16.3, 16.4 和18.4。
1、未初始化的局部变量, 参见问题7.1。
2、整数上溢, 特别是在一些16 比特的机器上, 一些中间计算结果可能上溢, 象a* b / c, 参见问题3.11。
3、未定义的求值顺序, 参见问题3.1 到3.5。
4、忽略了外部函数的说明, 特别是返回值不是int 的函数, 或是参数“缩小” 或可变的函数。参见问题1.8, 11.4 和15.1。
5、复引用空指针, 参见第5 章。
6、malloc/free 的不适当使用: 假设malloc 的内存都被清零、已释放的内存还可用、再次释放已释放内存、malloc 的内部被破坏, 参见问题7.16 和7.17。
7、指针类常规问题, 参见问题16.7。
8、printf() 格式与参数不符, 特别是用%d 输出long int, 参见问题12.7。
9、试图分配的内存大小超出一个unsigned int 类型的范围, 特别是在内存有限的机器上, 参见问题7.14和19.27。
10、数组边界问题, 特别是暂时的小缓冲, 也许用于sprinf() 来构造一个字符串,参见问题7.1 和12.19。
11、错误的假设了typedef 的映射类型, 特别是size t。
12、浮点问题, 参见问题14.1 和14.4。
13、任何你自己认为聪明的在特定机器上的机器代码生成小技巧。
正确使用函数原型说明能够捕捉到一些以上的问题。lint 会捕捉到更多。参见问题16.3, 16.4 和18.4。