Cppcheck 使用教程:本地 + CMake + GitHub Actions 自動分析實戰

Cppcheck 是一款強大的 C/C++ 靜態分析工具,專注于發現內存泄漏、未初始化變量、死代碼、未使用函數等問題。它不依賴編譯器,適合在持續集成和本地開發中快速定位潛在 Bug。

本文將手把手教你如何:

  • 安裝 Cppcheck

  • 在命令行中使用

  • 集成到 CMake 構建系統

  • 使用 .cppcheck-suppress 管理誤報

  • 配置 GitHub Actions 自動執行靜態分析

  • 生成 HTML 報告進行可視化展示

目錄

📚 一、Cppcheck 安裝方式

🔍 二、命令行使用示例

🔧 三、CMake 構建系統集成 Cppcheck

🧾 四、.cppcheck-suppress 文件使用

🤖 五、GitHub Actions 自動運行 Cppcheck

📊 六、生成 HTML 圖形化報告(可選)

? 七、總結建議

📎 附:Cppcheck 官方資料


📚 一、Cppcheck 安裝方式

? Ubuntu / Debian

sudo apt update
sudo apt install cppcheck

🍎 macOS(Homebrew)

brew install cppcheck

🪟 Windows

前往官方下載地址:https://cppcheck.sourceforge.io/ 下載 GUI 或 CLI 版本。


🔍 二、命令行使用示例

下面是一條完整的 cppcheck 命令,可對 src/ 目錄進行全面檢查,并輸出報告:

cppcheck \--enable=all \--inconclusive \--std=c++17 \--inline-suppr \--force \-j4 \--suppressions-list=.cppcheck-suppress \-I include -I src \src 2> cppcheck_report.txt

參數說明:

參數含義
--enable=all啟用所有檢測
--inconclusive顯示不確定的問題
--inline-suppr支持在代碼中內聯屏蔽
--force強制分析所有代碼路徑
--suppressions-list使用外部 suppress 文件屏蔽特定警告
-j4并行分析線程數
-I指定頭文件路徑

🔧 三、CMake 構建系統集成 Cppcheck

示例 CMakeLists.txt 添加如下內容:

set(CPPCHECK_COMMAND cppcheck)
set(CPPCHECK_OPTIONS --enable=all --inconclusive --std=c++17 --inline-suppr --force -j4--suppressions-list=${CMAKE_SOURCE_DIR}/.cppcheck-suppress
)set(CPPCHECK_OUTPUT_FILE ${CMAKE_BINARY_DIR}/cppcheck_report.txt)set(SOURCE_DIRS${CMAKE_SOURCE_DIR}/src${CMAKE_SOURCE_DIR}/include
)set(CPPCHECK_FULL_COMMAND ${CPPCHECK_COMMAND} ${CPPCHECK_OPTIONS})
foreach(DIR ${SOURCE_DIRS})set(CPPCHECK_FULL_COMMAND "${CPPCHECK_FULL_COMMAND} -I ${DIR} ${DIR}")
endforeach()add_custom_target(cppcheckCOMMAND ${CPPCHECK_FULL_COMMAND} 2>&1 | tee ${CPPCHECK_OUTPUT_FILE}COMMENT "Running Cppcheck..."WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}VERBATIM
)

運行方式

cmake -B build
cmake --build build --target cppcheck

🧾 四、.cppcheck-suppress 文件使用

用于集中屏蔽誤報項,防止報告中充斥無效告警。

示例內容:

unreadVariable:src/utils/logger.cpp
unusedFunction:src/core/debug.cpp
missingIncludeSystem

支持模糊路徑和通配符,可結合版本控制管理誤報。

🤖 五、GitHub Actions 自動運行 Cppcheck

適合團隊協作項目,每次提交或 PR 自動執行靜態檢查,保證主干代碼質量。

.github/workflows/cppcheck.yml 中添加:

name: Cppcheck Static Analysison:push:paths:- '**.cpp'- '**.h'pull_request:paths:- '**.cpp'- '**.h'jobs:cppcheck:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v4- name: Install cppcheckrun: sudo apt-get update && sudo apt-get install -y cppcheck- name: Run cppcheckrun: |cppcheck \--enable=all \--inconclusive \--std=c++17 \--inline-suppr \--force \-j4 \--suppressions-list=.cppcheck-suppress \-I include -I src \src 2> cppcheck_report.txt- name: Upload cppcheck reportuses: actions/upload-artifact@v4with:name: cppcheck-reportpath: cppcheck_report.txt
  • 每次提交都會觸發該流程

  • 可在 Actions 頁面下載分析報告


📊 六、生成 HTML 圖形化報告(可選)

如果你希望以網頁形式查看分析結果,可使用 cppcheck-htmlreport 工具:

安裝

pip install cppcheck-htmlreport

生成報告

cppcheck-htmlreport \--file=cppcheck_report.txt \--report-dir=cppcheck_html \--source-dir=.

打開 cppcheck_html/index.html 即可查看報告頁面。


? 七、總結建議

場景推薦做法
本地檢查命令行或 CMake 構建后手動運行
忽略誤報.cppcheck-suppress 配合版本控制管理
持續集成GitHub Actions / GitLab CI 自動化執行
項目交付使用 HTML 圖形化報告提升可讀性


📎 附:Cppcheck 官方資料

  • 官網:https://cppcheck.sourceforge.io/

  • GitHub:https://github.com/danmar/cppcheck


如果你覺得這篇文章對你有幫助,歡迎點贊 👍 收藏 ? 關注我獲取更多 C/C++ 工程化實戰技巧!

如需擴展:GitLab CI / Jenkins / SonarQube 的 Cppcheck 集成方案,歡迎留言或私信我繼續更新~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86067.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mac Parallels Desktop Kali 2025 代理設置

Mac Parallels Desktop Kali 2025 代理設置 核心步驟: kali設置橋接wifi 查看kali和主機ip 運行命令ifconfig查看kali ip: mac主機ip: kali設置proxy ip填寫主機ip,port為主機proxy端口 enjoy

通義靈碼編程智能體深度評測(Qwen3模型+終端操作+MCP工具調用實戰)

1 引言 隨著AI編程助手進入工具鏈集成時代,通義靈碼作為阿里云推出的智能編程解決方案,其Qwen3模型與MCP(Multi-tool Calling Platform)的協同能力引發開發者關注。本文將基于真實開發場景,從代碼理解、終端操作和工具鏈調用三個維度展開深度…

SpringBoot電腦商城項目--商品詳情+加入購物車

商品詳情 1. 持久層 1.1. 規劃sql語句 根據id查詢商品詳情 1.2 mapper層編寫抽象方法 /*** 根據商品id查詢商品詳情* param id 商品id* return 匹配的id商品詳情,如果沒有匹配的數據,則返回null*/Product findById(Integer id); 1.3 xml文件中編寫sq…

上交卡爾動力聯合提出FastDrive!結構化標簽實現自動駕駛端到端大模型更快更強

最近將類人的推理能力融入到端到端自動駕駛系統中已經成為了一個前沿的研究領域。其中,基于視覺語言模型的方法已經吸引了來自工業界和學術界的廣泛關注。 現有的VLM訓練范式嚴重依賴帶有自由格式的文本標注數據集,如圖1(a)所示。雖然這些描述能夠捕捉豐…

C# 委托(什么是委托)

什么是委托 可以認為委托是持有一個或多個方法的對象。當然,一般情況下你不會想要“執行”一個對 象,但委托與典型的對象不同。可以執行委托,這時委托會執行它所“持有"的方法。 本章將揭示創建和使用委托的語法和語義。在本章后面&am…

iTwin briefcase, checkpoint ,standalone

在 iTwin.js 中,briefcase 和 checkpoint 都是 IModel 的不同連接類型,但它們的用途和特性不同: Briefcase 用途:用于本地編輯和同步。通常是用戶從 iModelHub 檢出(Check-out)后在本地生成的可寫副本。特…

媒體AI關鍵技術研究

一、引言 隨著人工智能技術的迅猛發展,媒體行業正經歷前所未有的變革。AI技術不僅重塑了內容生產和傳播模式,更為媒體創意發展提供了全新可能。在數字化、移動化和信息爆炸的大背景下,傳統媒體面臨巨大挑戰,而AI技術為行業帶來了…

Cargo 與 Rust 項目

一、Rust 項目:現代化的系統編程單元 Rust 項目 是用 Rust 語言編寫的軟件工程單元,具有以下核心特征: 核心組件: src/ 目錄:存放 Rust 源代碼(.rs 文件) Cargo.toml:項目清單文件…

uni-app總結6-配合iOS App項目開發apple watch app

假設你已經用uni-app開發好了一個iOS端的app,現在想要開發一個配套的apple watch app。改怎么去開發呢?是不是一頭霧水,這篇文章就會介紹一些apple watch app開發的知識以及如何在uni-app開發的iOS app基礎上去開發配套的watch app。 一、apple watch 開發知識 apple watc…

神經網絡的本質 邏輯回歸 python的動態展示

神經網絡的本質 邏輯回歸 python的動態展示 邏輯回歸運行圖相關代碼什么是邏輯回歸和ai的關系邏輯回歸公式流程與實際案例解析**一、邏輯回歸的數學公式流程**1. **線性組合階段**2. **激活函數(Sigmoid)**3. **概率預測與決策**4. **交叉熵損失函數**5.…

sql server中的with 鎖各種區別

📘 SQL Server 常用 WITH (Hint) 用法與組合場景對照表 Hint 組合作用說明常見用途是否阻塞他人是否讀臟數據備注WITH (NOLOCK)不加共享鎖,允許讀取未提交數據報表導出、大數據分頁??等價于 READ UNCOMMITTED,臟讀風險高WITH (HOLDLOCK)保持…

KES數據庫部署工具使用

一、啟動部署工具 Windows系統 #命令行 ${安裝目錄}/ClientTools/guitools/DeployTools/deploy.exeLinux系統 #命令行 [rootnode ~]# ${安裝目錄}/ClientTools/guitools/DeployTools/deploy二、環境配置 1.硬件要求 #都是最小配置 CPU:主流32或64位 內存&#…

TB62211FNG是一款采用時鐘輸入控制的PWM斬波器的兩相雙極步進電機驅動器

TB62211FNG是一款采用時鐘輸入控制的PWM斬波器的兩相雙極步進電機驅動器。該器件采用BiCD工藝制造,額定電壓為40伏/1.0安培。片上電壓調節器允許使用單一VM電源控制步進電機。 特點: ? 雙極性步進電機驅動器 ? 脈沖寬度調制(PWM&#xf…

uni-app項目實戰筆記24--uniapp實現圖片保存到手機相冊

前提條件:微信小程序要想實現保存圖片到本地相冊需要到微信公眾平臺--小程序--開發管理中配置服務器域名中的downloadFile合法域名: \uniapp提供了saveImageToPhotosAlbum API實現保存的圖片到本地相冊。下面是它的配置參數: 參數名類型必填…

面試題-定義一個函數入參數是any類型,返回值是string類型,如何寫出這個函數,代碼示例

在 TypeScript 里,要定義一個入參為any類型、返回值為string類型的函數,可參考下面幾種實現方式: 1. 基礎實現 直接把入參轉換為字符串返回。 function anyToString(input: any): string {return String(input); // 使用String()進行類型轉…

TensorFlow深度學習實戰——Transformer模型評價指標

TensorFlow深度學習實戰——Transformer模型評價指標 0. 前言1. 質量1.1 GLUE1.2 SuperGLUE1.3 SQuAD1.4 RACE1.5 NLP-progress2. 參數規模3. 服務成本相關鏈接0. 前言 可以使用多種類型的指標評估 Transformer 模型。在本節中,我們將學習一些用于評估 Transformer 的關鍵因素…

linux內核學習(一)---內核社區介紹及補丁提交

目錄 一、引言 二、內核源碼 三、內核社區 ------>3.1、社區的組織架構 ------>3.2、內核社區的工作方式 ------>3.3、內核社區核心網站 ------------>3.3.1、Linux Kernel 官網 ------------>3.3.2、Linux Kernel 郵件列表(LKML) ------------>3.3…

輕量級web開發框架之Flask web開發框架學習:get請求數據的發送

Flask是一個使用 Python 編寫的輕量級 Web 應用框架,簡介靈活,可快速構建開發框架。 協作流程示例 客戶端請求 → Web服務器(Nginx) → WSGI服務器(Gunicorn/uWSGI)↓WSGI協議傳遞請求數據(env…

Vue 3 異步三劍客:Suspense、async setup() 和 await 的戲劇性關系,白屏的解決

文章目錄 🎭 Vue 3 異步三劍客:Suspense、async setup() 和 await 的戲劇性關系,白屏的解決🎬 角色介紹🎭 正常演出流程(有 Suspense 時)💥 災難場景(缺少 Suspense 時&a…

【JavaScript-Day 48】告別 Ajax,擁抱現代網絡請求:Fetch API 完全指南

Langchain系列文章目錄 01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…