2010-08-12 34 views
0

我有興趣瞭解我需要專注於調試c代碼而不需要調試器。有什麼要尋找的東西?在給定c代碼中發現錯誤

一般來說,我看以下:

  1. 檢查是否正確的類型和值被傳遞給函數。
  2. 查找未分配和未初始化的變量
  3. 檢查函數語法和函數是否正確使用。
  4. 檢查返回值
  5. 檢查鎖是否以正確的方式使用。
  6. 檢查串端接
  7. 一個錯誤,從函數返回堆棧內存varible
  8. 普通語法錯誤
  9. 函數聲明錯誤

任何結構化的方法非常多讚賞。

+0

這是沒有編譯器以及沒有調試器?因爲你檢查的大部分東西都是由大多數或所有編譯器定期檢查的! – 2010-08-12 04:58:56

+0

是的,它沒有編譯器和調試器 – mousey 2010-08-12 05:03:30

回答

3

通過將相應的warning flags傳遞給編譯器,大部分這些錯誤將被拾取。

從原始列表

然而,點1,5,6,7,8是非常值得檢查作爲一個人,一些編譯器/標誌組合但是會拿起上未處理的值,指針到自動存儲器,和場外在數組索引等錯誤。

您可能想看看諸如mudflap,valgrind,efence和其他捕捉你不知道的運行時情況。您也可以嘗試splint,以增強您的靜態分析。

對於事物的未自動化的一面,請針對特定情況(尤其是角落情況)靜態地跟蹤程序的流程,並向自己證實它看起來做的是正確的事情。嘗試編寫unit tests /測試腳本。如上所述,務必使用一些自動檢查。

如果你的重點是沒有任何測試執行的測試,splint可能是最好的開始。你想研究的技術叫做static code analysis

+0

非常感謝 – mousey 2010-08-12 07:17:40

1

我建議嘗試其中一種靜態代碼分析器。那些我個人使用,並且能夠推薦:

  • cppcheck - 自由和開放源碼,已CMD-行程序和Windows圖形用戶界面
  • Clang Static Analyzer - 蘋果的免費和開源,在Mac上最好的支持,還內置在最近的XCode版本
  • Visual Studio的靜態檢查,只有在Premium和Ultimate可用(即昂貴的)版本
  • Coverity - 昂貴

如果你想了解更多的細節,你可以閱讀an article I wrote關於這個問題。

+0

@kryz靜態分析器做了什麼,它有什麼用處? – mousey 2010-08-12 05:16:21

+0

引用我鏈接到的文章「靜態代碼分析工具可以分析C/C++代碼而不運行它(因此是」靜態「部分),並發現許多問題,如內存泄漏,使用未初始化的變量,釋放內存兩次等「。 – 2010-08-12 05:22:11

+0

@ kryz他們如何在不編譯或運行的情況下做到這一點? – mousey 2010-08-12 05:42:02

1

你遺漏的一個大問題是整數溢出。這包括來自已簽名表達式溢出的未定義行爲,以及已定義但可能危險的無符號溢出行爲,這些行爲都被減少了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)。
  • 使用有符號的除法/模通常帶有負數,因爲C的版本不同意通常的代數定義,當負數除以正數時,很少給出期望的結果。
+0

非常感謝。 – mousey 2010-08-12 07:17:24