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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…