我有興趣瞭解我需要專注於調試c代碼而不需要調試器。有什麼要尋找的東西?在給定c代碼中發現錯誤
一般來說,我看以下:
- 檢查是否正確的類型和值被傳遞給函數。
- 查找未分配和未初始化的變量
- 檢查函數語法和函數是否正確使用。
- 檢查返回值
- 檢查鎖是否以正確的方式使用。
- 檢查串端接
- 一個錯誤,從函數返回堆棧內存varible
- 關
- 普通語法錯誤
- 函數聲明錯誤
任何結構化的方法非常多讚賞。
我有興趣瞭解我需要專注於調試c代碼而不需要調試器。有什麼要尋找的東西?在給定c代碼中發現錯誤
一般來說,我看以下:
任何結構化的方法非常多讚賞。
通過將相應的warning flags傳遞給編譯器,大部分這些錯誤將被拾取。
從原始列表然而,點1,5,6,7,8是非常值得檢查作爲一個人,一些編譯器/標誌組合但是會拿起上未處理的值,指針到自動存儲器,和場外在數組索引等錯誤。
您可能想看看諸如mudflap,valgrind,efence和其他捕捉你不知道的運行時情況。您也可以嘗試splint,以增強您的靜態分析。
對於事物的未自動化的一面,請針對特定情況(尤其是角落情況)靜態地跟蹤程序的流程,並向自己證實它看起來做的是正確的事情。嘗試編寫unit tests /測試腳本。如上所述,務必使用一些自動檢查。
如果你的重點是沒有任何測試執行的測試,splint可能是最好的開始。你想研究的技術叫做static code analysis。
非常感謝 – mousey 2010-08-12 07:17:40
我建議嘗試其中一種靜態代碼分析器。那些我個人使用,並且能夠推薦:
如果你想了解更多的細節,你可以閱讀an article I wrote關於這個問題。
你遺漏的一個大問題是整數溢出。這包括來自已簽名表達式溢出的未定義行爲,以及已定義但可能危險的無符號溢出行爲,這些行爲都被減少了mod TYPE_MAX+1
。特別是,如果count
來自潛在的不可信來源(如數據文件),則foo=malloc(count*sizeof *foo);
等事情可能非常危險,特別是如果sizeof *foo
很大。
一些人:在比較有符號和無符號值的
char
當做任何事情比複製值或比較平等(否則你可能想要unsigned char
或可能在極少數情況下,signed char
)。/POWER_OF_2
和%POWER_OF_2
(提示:(-3)%8==-3
但(-3)&7==5
)。非常感謝。 – mousey 2010-08-12 07:17:24
這是沒有編譯器以及沒有調試器?因爲你檢查的大部分東西都是由大多數或所有編譯器定期檢查的! – 2010-08-12 04:58:56
是的,它沒有編譯器和調試器 – mousey 2010-08-12 05:03:30