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)