程式碼分析工具小結

浩天之家發表於2024-11-15

此文總結在平時開發過程中使用到的程式碼分析工具,分為靜態分析和動態分析兩個部分,本文只介紹Windows平臺的工具。

靜態程式碼分析

CppCheck

CppCheck是一款經典的C/C++靜態程式碼檢查工具,筆者最開始使用的檢查工具,幫助檢查出了許多潛在缺陷,推薦首選,當前最新版本為 2.16.0.

下面介紹下筆者的使用經驗,該工具主介面如下:

image.png

最常用的是分析->目錄功能,再點選檢視->全部展開,工具欄上有不同警告級別的圖示,可依次過濾檢視。

在感興趣的條目上,右鍵可支援直接開啟、隱藏選中的Id等功能,方便快捷檢視檢查報告。

該軟體還有付費版本 [Cppcheck Premium]( www.cppcheck.com ),支援更多檢測規則和規範。

TscanCode

這是騰訊出品的一款靜態分析軟體TscanCode,支援C/C++、C#、Lua等程式碼。

在筆者的平時使用感受中,不如CppCheck,檢查出來的問題一般般。

下圖給軟體介面:

image.png

PVS-Studio

這款分析軟體是最近上手使用的,雖說是商業軟體,但對個人開發者、教育教學等人員還是友好的。

免費使用的前提是在原始碼開頭加上特定註釋,可在 how-to-use-pvs-studio-free 上下載工具,一鍵增加註釋。

在工程實踐中,推薦建立兩個目錄,一個開發目錄,一個檢查目錄。在檢查目錄應用上述工具更新程式碼倉庫,同時透過git同步最新更改,找到疑似問題,在開發目錄中增加斷點用於標註,在實際執行中校驗正確與否,在開發目錄中更改提交,同步改動到檢查目錄中,這樣讓主線開發和靜態檢查兩不誤。

在工程實踐中,優先檢查高階別的警告。屬於自己負責的模組,可自己修改,屬於別人負責的模組,可告知別人修改。

這款工具能檢查出來的錯誤較多,配合Cppcheck一起使用,效果更好。

動態程式碼檢測工具

DrMemory

DrMemory是一款跨平臺的動態記憶體除錯工具。

為了更好進行檢測,需要開啟除錯資訊、關閉內聯擴充套件、禁用幀指標最佳化等操作。

image.png

在使用時遇到無法啟動的錯誤,就此作罷。

Sanitizer

Visual Studio2019.16.9 版本中引入的 AddressSanitizer工具(以下簡稱ASan),它可以發現下列記憶體問題:

  • 分配/釋放不匹配,新建/刪除型別不匹配
  • 雙重釋放、釋放後使用
  • 全域性變數溢位、堆疊緩衝區溢位
  • 超出作用域使用堆疊

該功能相容x86和x64所有級別的最佳化和配置,但與 編輯並繼續、增量連結和 /RTC 不相容。

下圖為關閉 編輯並繼續 功能入口:

image.png

下圖為 關閉增量連結 的兩個功能入口:

image.png

image.png

下圖為 關閉RTC檢查 功能入口:

image.png

完成上述前置環境準備後,透過下圖配置,開啟VS的AddressSanitizer功能:

image.png

完成上述設定後,啟動測試程式,提示如下:

image.png

這裡找到原因,本機Win7系統的Kernel32.dll不包含PssQuerySnapshot這個函式,這個函式是Windows 8.1才引進的。

鑑於本地開發環境和系統限制,針對此工具的使用,暫且放一放。

Memory Validator

Memory Validator是一款動態記憶體檢查工具,可在官網下載30天的試用版。它具備以下功能:

  • 檢測記憶體洩漏和控制代碼洩漏
  • 支援原生模式、.Net以及混合模式應用
  • 檢查雙重刪除/釋放、對已刪除物件的呼叫以及相關記憶體錯誤

此項功能與 VLD 的記憶體檢測功能有衝突,因此,在啟動時,需要去掉對 VLD 的引用。

執行很簡單,見下圖:

image.png

一路next啟動程式,正常執行相關操作後,最後退出程式,等待它收集資料後,就自己看著整理修改。

小結

本文總結了在日常工作中用到的靜態/動態程式碼分析工具,推薦使用PVS-StudioCppcheckMemory Validator 這三款工具。

優先更正確定性高的錯誤和缺陷,對於不那麼重要的問題,可先放一放。注意,不是自己負責的錯誤,不要擅自改動,給別人指出來就行。

相關文章