此文總結在平時開發過程中使用到的程式碼分析工具,分為靜態分析和動態分析兩個部分,本文只介紹Windows
平臺的工具。
靜態程式碼分析
CppCheck
CppCheck是一款經典的C/C++靜態程式碼檢查工具,筆者最開始使用的檢查工具,幫助檢查出了許多潛在缺陷,推薦首選,當前最新版本為 2.16.0.
下面介紹下筆者的使用經驗,該工具主介面如下:
最常用的是分析->目錄
功能,再點選檢視->全部展開
,工具欄上有不同警告級別的圖示,可依次過濾檢視。
在感興趣的條目上,右鍵可支援直接開啟、隱藏選中的Id等功能,方便快捷檢視檢查報告。
該軟體還有付費版本 [Cppcheck Premium]( www.cppcheck.com )
,支援更多檢測規則和規範。
TscanCode
這是騰訊出品的一款靜態分析軟體TscanCode,支援C/C++、C#、Lua等程式碼。
在筆者的平時使用感受中,不如CppCheck
,檢查出來的問題一般般。
下圖給軟體介面:
PVS-Studio
這款分析軟體是最近上手使用的,雖說是商業軟體,但對個人開發者、教育教學等人員還是友好的。
免費使用的前提是在原始碼開頭加上特定註釋,可在 how-to-use-pvs-studio-free 上下載工具,一鍵增加註釋。
在工程實踐中,推薦建立兩個目錄,一個開發目錄,一個檢查目錄。在檢查目錄應用上述工具更新程式碼倉庫,同時透過git同步最新更改,找到疑似問題,在開發目錄中增加斷點用於標註,在實際執行中校驗正確與否,在開發目錄中更改提交,同步改動到檢查目錄中,這樣讓主線開發和靜態檢查兩不誤。
在工程實踐中,優先檢查高階別的警告。屬於自己負責的模組,可自己修改,屬於別人負責的模組,可告知別人修改。
這款工具能檢查出來的錯誤較多,配合Cppcheck
一起使用,效果更好。
動態程式碼檢測工具
DrMemory
DrMemory是一款跨平臺的動態記憶體除錯工具。
為了更好進行檢測,需要開啟除錯資訊、關閉內聯擴充套件、禁用幀指標最佳化等操作。
在使用時遇到無法啟動的錯誤,就此作罷。
Sanitizer
Visual Studio
從 2019.16.9
版本中引入的 AddressSanitizer
工具(以下簡稱ASan
),它可以發現下列記憶體問題:
- 分配/釋放不匹配,新建/刪除型別不匹配
- 雙重釋放、釋放後使用
- 全域性變數溢位、堆疊緩衝區溢位
- 超出作用域使用堆疊
該功能相容x86和x64所有級別的最佳化和配置,但與 編輯並繼續、增量連結和 /RTC 不相容。
下圖為關閉 編輯並繼續
功能入口:
下圖為 關閉增量連結
的兩個功能入口:
下圖為 關閉RTC檢查
功能入口:
完成上述前置環境準備後,透過下圖配置,開啟VS的AddressSanitizer
功能:
完成上述設定後,啟動測試程式,提示如下:
在這裡找到原因,本機Win7系統的Kernel32.dll
不包含PssQuerySnapshot這個函式,這個函式是Windows 8.1
才引進的。
鑑於本地開發環境和系統限制,針對此工具的使用,暫且放一放。
Memory Validator
Memory Validator是一款動態記憶體檢查工具,可在官網下載30天的試用版。它具備以下功能:
- 檢測記憶體洩漏和控制代碼洩漏
- 支援原生模式、.Net以及混合模式應用
- 檢查雙重刪除/釋放、對已刪除物件的呼叫以及相關記憶體錯誤
此項功能與 VLD
的記憶體檢測功能有衝突,因此,在啟動時,需要去掉對 VLD
的引用。
執行很簡單,見下圖:
一路next啟動程式,正常執行相關操作後,最後退出程式,等待它收集資料後,就自己看著整理修改。
小結
本文總結了在日常工作中用到的靜態/動態程式碼分析工具,推薦使用PVS-Studio
、Cppcheck
和 Memory Validator
這三款工具。
優先更正確定性高的錯誤和缺陷,對於不那麼重要的問題,可先放一放。注意,不是自己負責的錯誤,不要擅自改動,給別人指出來就行。