靜態程式碼檢查cppcheck整體瞭解
cppcheck是一個C++開源的靜態程式碼檢查工具。基本上編譯器不檢查的問題他都檢查,效果還是不錯的。
工作中用到cppcheck作為程式碼檢查,網上現在能搜到的關於cppcheck相關資訊也不多,自己也在這裡記錄一下。其實引入cppcheck確實能為程式碼提供一些基本風險檢測
比如
- 自動變數檢查
- 陣列的邊界檢查
- class類檢查
- 過期的函式,廢棄函式呼叫檢查
- 異常記憶體使用,釋放檢查
- 記憶體洩漏檢查,主要是通過記憶體引用指標
- 作業系統資源釋放檢查,中斷,檔案描述符等
- 異常STL 函式使用檢查
- 程式碼格式錯誤,以及效能因素檢查
最重要的是還能自己定製專案中對應的規則,這也是我們引入cppcheck的原因。
參考了一些網上的資源cppcheck的基本使用:
https://www.cnblogs.com/freedomabcd/p/7771121.html
http://blog.csdn.net/liang19890820/article/details/52778149
https://sourceforge.net/p/cppcheck/wiki/ListOfChecks/
上面得連線都已經介紹一些cppcheck的基本使用。
在這裡我就記錄一下如何用cppcheck開發定製自己的規則。
原理:Cppcheck先是分析拆解程式碼,將每個有效字元作為一個token(token是抽象程式碼中所有字元的類,包含字元的字串,型別等),提供tokenlist,規則實現者通過匹配需要的字元找到感興趣的程式碼,然後通過計算查詢
Tokenizer類: 程式碼token化, 計劃程式碼
SymbolDatabase類:符號資料庫,生成和儲存各種符號:scope,function, variable等
Scope類: 各種程式碼block。最常用的有functionScopes, classAndStructScopes等
Token類: 裡面有str(), next(), previous(),
Variable類:getTypeString() --C++相關的程式碼經常需要
Function類:可以找到實現的scope
Value類: token可以通過getValue()得到可能的值
開發其實就是按套路走:
舉個例子:除0 bug
1.從函式scope(函式的list)出發,遍歷每一個token(符號)2.使用Token::Match方法和變數型別來判斷是否是除號3.檢查使用除號除以的變數是否判04.如果沒有的話,如果沒有判別式否是0那就是bug好多規則都可以按這個套路寫。只是如果判別是否是除號,以及如何判斷被除的變數是否判0,這個有很多不同的形式,這得根據專案中的程式碼風格、規則來做對應的判斷了。判斷的不好會有很多誤報或者遺漏。所以自定義規則可能更適合長期開發的大專案。