之前在https://blog.csdn.net/fengbingchun/article/details/8887843 介紹過Cppcheck,那時還是1.x版本,現在已到2.x版本,這裡再總結下。
Cppcheck是一個用于C/C++代碼的靜态分析工具,源碼位址為https://github.com/danmar/cppcheck ,最新釋出版本為2.10,License為GPL-3.0.它支援在Windows、Linux、Mac上安裝。
Cppcheck提供了獨特的代碼分析來檢測bugs,并專注于檢測未定義的行為和危險的編碼結構。它的目标是僅檢測代碼中的真正錯誤,并生成盡可能少的誤報。Cppcheck關注bug而不是代碼風格。
靜态分析是一個非常大的領域,Cppcheck隻涵蓋了其中的一部分。沒有一種工具能覆寫整個領域。每個工具都有獨特的代碼分析,使用一組工具比使用一種工具要好,是很好的補充。
未定義的行為(undefined behaviour)包括:
(1).dead pointers;
(2).除以0;
(3).整數溢出;
(4).無效的位移操作;
(5).無效的轉換;
(6).STL的用法無效;
(7).記憶體管理;
(8).空指針解引用;
(9).越界檢查;
(10).未初始化的變量;
(11).寫const資料;
安裝:從https://github.com/danmar/cppcheck/releases/tag/2.10 下載下傳cppcheck-2.10-x64-Setup.msi,輕按兩下進行安裝,并将安裝路徑即cppcheck.exe所在路徑加入到系統環境變量中。
結果消息(messages)包括:
(1).error: 執行代碼時未定義的行為或其它錯誤,如記憶體洩漏;
(2).warning: 執行代碼時可能存在未定義的行為;
(3).style: 風格問題,例如未使用的函數、備援代碼、constness、運算符優先級、可能的錯誤;
(4).performance: 基于常識(common knowledge)的運作時性能建議;
(5).portability: 可移植性警告;
(6).information: 配置問題,與文法正确性無關.
注意事項:
(1).通過執行cppcheck.exe --help 可檢視支援哪些輸入參數;
(2).文法: cppcheck.exe [options] [files or paths]
(3).--file-filter=<str>: 設定檔案過濾器,并且僅檢查與過濾器比對的檔案;如--file-filter=*bar.cpp 隻分析以bar.cpp結尾的檔案;
(4).--cppcheck-build-dir=<dir>: Cppcheck将分析資訊儲存在該檔案夾中,推薦使用.優點:加快分析速度,使增量分析成為可能;使用多個線程時也可以進行全程式(whole program)分析;
(5).--enable=<id>: id可為all, warning, style, performance, portability, information, missingInclude; all啟用所有檢查,當掃描整個程式時,建議隻使用all,因為這會啟用unusedFunction;可以指定多個id,用逗号分開;
(6).--file-list=<file>: 在文本檔案中指定要check的檔案;
(7).-I <dir>: 給出搜尋include檔案的路徑,可有多個-I;
(8).--include=<file>: 在checked檔案之前強制include一個檔案;
(9).--output-file=<file>: 将結果寫入檔案;
(10).-v或--verbose: 輸出更詳細的錯誤資訊.
這裡使用GitHub Messy_Test/demo/Messy_Test 中的代碼進行測試,執行指令如下所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5cTMykDMyIzNyEDOzIDN4UTOhRDMkJmMmlTY0MWZxczLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
在目前的results目錄生成一些檔案,打開其中的result.txt,内容如下:對有問題的代碼行給出原因說明
GitHub: https://github.com/fengbingchun/Messy_Test