17.5 程序在一台机器上执行完美, 但在另一台上却得到怪异的结果。更奇怪的是,
增加或去除调试的打印语句, 就改变了症状……
许多地方有可能出错。下面是一些通常的检查要点:
- 未初始化的局部变量, 参见问题 7.1。
- 整数上溢, 特别是在一些 16 比特的机器上, 一些中间计算结果可能上溢,
象 a * b / c, 参见问题 3.11。
- 未定义的求值顺序, 参见问题 3.1 到 3.5。
- 忽略了外部函数的说明, 特别是返回值不是 int 的函数, 或是参数
``缩小" 或可变的函数。参见问题 1.8, 11.4 和 15.1。
- 复引用空指针, 参见第 5 章。
- malloc/free 的不适当使用: 假设 malloc 的内存都被清零、
已释放的内存还可用、再次释放已释放内存、malloc 的内部被破坏, 参见
问题 7.16 和 7.17。
- 指针类常规问题, 参见问题 16.7。
- printf() 格式与参数不符, 特别是用 %d 输出 long int,
参见问题 12.7。
- 试图分配的内存大小超出一个 unsigned int 类型的范围,
特别是在内存有限的机器上, 参见问题 7.14和 19.27。
- 数组边界问题, 特别是暂时的小缓冲, 也许用于 sprinf() 来构造一个字符串,
参见问题 7.1 和 12.19。
- 错误的假设了 typedef 的映射类型, 特别是 size_t。
- 浮点问题, 参见问题 14.1 和 14.4。
- 任何你自己认为聪明的在特定机器上的机器代码生成小技巧。
正确使用函数原型说明能够捕捉到一些以上的问题。lint 会捕捉到更多。
参见问题 16.3, 16.4 和 18.4。
翻译朱群英、孙云, LaTeX2HTML 编译 朱群英 (2005-06-23)