如何使用 Cppcheck 進行 C/C++ 程式碼靜態分析

Cppcheck 是一個強大的靜態程式碼分析工具,用於檢查 C 和 C++ 程式碼中的錯誤和潛在問題。這篇文章 ShengYu 將詳細介紹如何使用 Cppcheck 來提升你的程式碼質量,並提供一些常用的選項和實用範例。

為什麼選擇 Cppcheck?

靜態程式碼分析工具對於保持程式碼質量和減少潛在錯誤至關重要。Cppcheck 能夠幫助你發現記憶體洩漏、未定義的行為和使用未初始化的變數等問題。它適用於各種平台,並且可以與多種 IDE 集成,極大地提升開發效率。

安裝 Cppcheck

在 Linux 上:你可以使用包管理器來安裝 Cppcheck。例如,在 Ubuntu 上執行以下指令:

1
sudo apt-get install cppcheck

在 macOS 上:使用 Homebrew 安裝 Cppcheck:

1
brew install cppcheck

在 Windows 上:你可以從 Cppcheck 官方網站 下載並安裝 Windows 版本。

如何使用 Cppcheck

安裝完成後,你可以在命令列中使用 Cppcheck 來檢查你的 C 或 C++ 程式碼。這裡有一些基本的用法範例:

檢查單個檔案

1
cppcheck myfile.cpp

檢查整個目錄

1
cppcheck /path/to/project

常用選項

–enable=all:啟用所有檢查,包括警告和性能問題等。

1
cppcheck --enable=all myfile.cpp

–inconclusive:包括不確定的結果,進一步深入檢查。

1
cppcheck --enable=all --inconclusive myfile.cpp

-j n:多執行緒。

1
cppcheck -j 4

–force:即使檔案包含語法錯誤,仍強制檢查所有檔案。

1
cppcheck --force /path/to/project

–xml:以 XML 格式輸出結果,這對於與 IDE 集成非常有用。

1
cppcheck --xml myfile.cpp 2> result.xml

–output-file=filename:將檢查結果輸出到指定檔案。

1
cppcheck myfile.cpp --output-file=cppcheck_report.txt

-i <path>:排除某資料夾不掃描。

1
cppcheck -i /path/3rdparty

--file-filter=<str>:指定只掃描特定檔案或資料夾。

1
cppcheck --file-filter=*bar.cpp

--std=<standard>:選擇掃描C++標準的版本。

1
cppcheck --std=c++17

--cppcheck-build-dir=<dir>:用 build 資料夾來分析掃描。
可以加快速度,重新檢查時僅分析更改的檔案,它使增量分析成為可能。當使用多執行緒時也可以分析整個程式。

1
2
3
mkdir build
cppcheck --cppcheck-build-dir=build src # <- All files are analyzed
cppcheck --cppcheck-build-dir=build src # <- Faster! Results of unchanged files are reused

常見使用範例,

1
2
cppcheck -j 2 --enable=all --inconclusive --xml --xml-version=2 libzmq 2> result.xml
cppcheck-htmlreport -–file=result.xml -–title=testHTML -–source-dir=libzmq -–report-dir=report/xml/index.xml

使用 Cppcheck GUI

Cppcheck 提供了一個圖形使用者界面(GUI),使得不熟悉命令列的使用者也能輕鬆使用。以下是如何使用 Cppcheck GUI 的步驟:

  1. 啟動 Cppcheck GUI
    在安裝 Cppcheck 後,找到並啟動 Cppcheck GUI。你可以在開始選單(Windows)或應用程式清單中(Linux 和 macOS)找到它。

  2. 選擇要檢查的檔案或目錄
    點擊 GUI 界面上的“Add file”或“Add folder”按鈕,選擇你希望檢查的檔案或目錄。

  3. 設定檢查選項
    在 GUI 中,你可以設定各種檢查選項。例如,選擇“Settings”選單中的“Enable all checks”以啟用所有檢查,或選擇“Enable inconclusive checks”以包括不確定的結果。

  4. 開始檢查
    設定完成後,點擊“Start”按鈕開始檢查。Cppcheck 將分析選定的檔案或目錄,並在結果面板中顯示發現的問題。

  5. 查看結果
    檢查完成後,結果會顯示在 GUI 界面的下半部分。你可以點擊每個問題查看詳細資訊,包括檔案名、行號和問題描述。

產生 HTML 報告

Cppcheck 支持產生 HTML 格式的報告,使得分析結果更加直觀和易於分享。以下是產生 HTML 報告的步驟:

  1. 安裝 cppcheck-htmlreport
    Cppcheck 提供了一個名為 cppcheck-htmlreport 的工具,用於產生 HTML 報告。首先,確保你已經安裝了 Python。

  2. 執行 Cppcheck 並產生 XML 檔案
    你需要先執行 Cppcheck 並產生 XML 格式的輸出:

    1
    cppcheck --enable=all --xml myfile.cpp 2> cppcheck_results.xml
  3. 使用 cppcheck-htmlreport 產生 HTML 報告
    使用 cppcheck-htmlreport 工具來產生 HTML 報告:

    1
    cppcheck-htmlreport --file=cppcheck_results.xml --report-dir=cppcheck_report --source-dir=/path/to/source

    這將會在 cppcheck_report 目錄中產生 HTML 報告,你可以使用瀏覽器打開 index.html 檔案來查看報告。

實用範例

假設有一個簡單的 C++ 檔案 example.cpp,其內容如下:

1
2
3
4
5
6
#include <iostream>
int main() {
int x;
std::cout << x << std::endl; // 使用未初始化的變數
return 0;
}

你可以使用 Cppcheck 來檢查這個檔案:

1
cppcheck example.cpp

結果可能顯示如下警告:

1
[example.cpp:4]: (error) Uninitialized variable: x

這說明在 example.cpp 的第 4 行使用了未初始化的變數 x,應該進行修正。

與 IDE 集成

Cppcheck 可以與多種 IDE 集成,例如 Visual Studio、Visual Studio Code、Eclipse、CLion 等。具體集成方法可以參考相應 IDE 的插件或擴展文件。

結論

Cppcheck 是一個強大的工具,能夠幫助你提升 C 和 C++ 程式碼的質量。透過簡單的命令列參數或 GUI,你可以靈活地控制它的檢查範圍和輸出格式,從而更有效地發現和修正程式碼中的潛在問題。此外,透過產生 HTML 報告,你可以更直觀地分析和分享檢查結果。

以上就是如何使用 Cppcheck 進行 C/C++ 程式碼靜態分析介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
如果你想學習 C/C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
如何消除C/C++未使用變數的編譯錯誤訊息
C/C++ scanf 用法與範例
C/C++ sscanf 用法與範例
C/C++ 程式的常見陷阱與範例
C/C++ 程式的常見陷阱與範例 下篇
C++17 的新特性:讓寫程式更簡潔、更高效
C++ std::swap 用法與範例