Cppcheck 是什么
Cppcheck 是面向 C 与 C++ 的静态分析工具,通过解析源代码查找缺陷:数组越界、未初始化变量、资源泄漏、冗余代码等。它用 --enable 选择检查类别,配合 --error-exitcode 可以让发现问题时构建直接失败。由于不依赖完整编译,它对 include 路径与宏定义敏感,解析配置不全时会产生大量误报。
基本信息
| 适用平台 | Windows / Linux / macOS,C 与 C++ 源码 |
|---|---|
| 检查类别 | warning / style / performance / portability / information |
| 门禁参数 | --error-exitcode=1 发现问题即返回非零 |
| 报告格式 | --xml、--template 便于 CI 解析 |
| 抑制方式 | --suppress=标识 或抑制文件 |
典型使用场景
- CI 中对 C / C++ 代码做缺陷扫描并阻断明显问题
- 排查未初始化变量、越界访问这类低级但危险的缺陷
- 重构前评估冗余代码、未使用函数与重复分支
- 老项目难以完整构建时,用不依赖编译数据库的方式先扫一遍
- 与基于编译数据库的工具分工,覆盖构建困难的部分
基础用法
基础用法
cppcheck --enable=warning,style,performance --error-exitcode=1 src/ # 常用类别 + 发现问题即失败
cppcheck --enable=all --inconclusive src/ # 打开更多类别(误报也会增加)
cppcheck --suppress=missingIncludeSystem src/ # 抑制系统头文件找不到的提示
cppcheck --xml --output-file=report.xml src/ # 生成可被 CI 解析的报告
cppcheck -I include -D __GNUC__ src/ # 补齐 include 路径与宏定义选项与使用建议
| 选项 | 作用 | 使用建议 |
|---|---|---|
| --enable=style | 风格与冗余代码问题 | CI 中长期开启 |
| --enable=performance | 性能相关建议 | 按项目需要开启 |
| --error-exitcode=1 | 发现问题返回非零退出码 | 用于门禁阻断构建 |
| --inconclusive | 输出不确定的问题 | 先本地观察,不要直接进门禁 |
| --suppress= | 按标识抑制告警 | 写明原因并定期复核 |
误报大多来自解析配置:先补 -I 头文件路径、-D 宏定义,或抑制系统头文件的提示,再看剩余告警是否真实;跳过这一步,报告会变成没人看的噪声。
与基于编译器前端的工具相比,Cppcheck 不要求代码可完整编译,适合构建资料缺失的老项目;反过来,它对模板展开与类型推导的覆盖有限,两者组合使用覆盖面更完整。