1. 程式人生 > >靜態程式碼檢查cppcheck整體瞭解

靜態程式碼檢查cppcheck整體瞭解

cppcheck是一個C++開源的靜態程式碼檢查工具。基本上編譯器不檢查的問題他都檢查,效果還是不錯的。

工作中用到cppcheck作為程式碼檢查,網上現在能搜到的關於cppcheck相關資訊也不多,自己也在這裡記錄一下。其實引入cppcheck確實能為程式碼提供一些基本風險檢測

比如

  1. 自動變數檢查
  2. 陣列的邊界檢查
  3. class類檢查
  4. 過期的函式,廢棄函式呼叫檢查
  5. 異常記憶體使用,釋放檢查
  6. 記憶體洩漏檢查,主要是通過記憶體引用指標
  7. 作業系統資源釋放檢查,中斷,檔案描述符等
  8. 異常STL 函式使用檢查
  9. 程式碼格式錯誤,以及效能因素檢查

最重要的是還能自己定製專案中對應的規則,這也是我們引入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,規則實現者通過匹配需要的字元找到感興趣的程式碼,然後通過計算查詢

bug注意點:

其中Cppcheck會做預處理和簡化程式碼的操作,比如include標頭檔案,展開巨集,在每一個token直接用一個空格分隔等。u匹配token一般用Token::Match這個方法,支援一些特定pattern,在宣告處有註釋開發中使用主要的類有:

Tokenizer類: 程式碼token化, 計劃程式碼

SymbolDatabase類:符號資料庫,生成和儲存各種符號:scope,function, variable

Scope類: 各種程式碼block。最常用的有functionScopesclassAndStructScopes

Token類: 裡面有str(), next(), previous(),

tokAt(), link(),Match()等常用函式

Variable類:getTypeString() --C++相關的程式碼經常需要

Function類:可以找到實現的scope

Value類: token可以通過getValue()得到可能的值

開發其實就是按套路走:

舉個例子:0 bug

1.從函式scope(函式的list)出發,遍歷每一個token(符號)2.使用Token::Match方法和變數型別來判斷是否是除號3.檢查使用除號除以的變數是否判04.如果沒有的話,如果沒有判別式否是0那就是bug

好多規則都可以按這個套路寫。只是如果判別是否是除號,以及如何判斷被除的變數是否判0,這個有很多不同的形式,這得根據專案中的程式碼風格、規則來做對應的判斷了。判斷的不好會有很多誤報或者遺漏。所以自定義規則可能更適合長期開發的大專案。