其他
C/C++ 静态分析接入与告警治理:在需要运行…
适用于 C/C++ 代码库质量加固、静态分析告警分诊、误报抑制以及将 clang-tidy/cppcheck/scan-build 接入 CI 的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
C/C++ 静态分析接入与告警治理:在需特定
解决思路
- 生成 compile_commands.json:用 CMake 时运行 `cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON`,然后 `ln -s build/compile_commands.json .`。
- 生成 compile_commands.json:Make 项目用 `bear -- make`。
- 生成 compile_commands.json:Make 项目也可用 `pip install compiledb` 后运行 `compiledb make`。
- 运行 clang-tidy 单文件:`clang-tidy src/foo.c -- -std=c11 -I include/`。
- 运行 clang-tidy 整项目(依赖 compile_commands.json):`run-clang-tidy -p build/ -j$(nproc)`。
- 运行 clang-tidy 并启用指定检查:`clang-tidy -checks='bugprone-*,modernize-*,performance-*' src/foo.cpp`。
- 运行 clang-tidy 并应用自动修复:`clang-tidy -checks='modernize-use-nullptr' -fix src/foo.cpp`。
- 按目标选择 clang-tidy 检查类别:找真实 bug 用 `bugprone-*`、`clang-analyzer-*`;现代化 C++ 用 `modernize-*`;遵循 Core Guidelines 用 `cppcoreguidelines-*`;性能问题用 `performance-*`;安全加固用 `cert-*`、`hicpp-*`;可读性/风格用 `readability-*`、`llvm-*`。
- 按类别理解关键检查:`bugprone-*` 关注 `use-after-move`、`integer-division`、`suspicious-memset-usage`;`modernize-*` 关注 `use-nullptr`、`use-override`、`use-auto`;`cppcoreguidelines-*` 关注 `avoid-goto`、`pro-bounds-*`、`no-malloc`;`performance-*` 关注 `unnecessary-copy-initialization`、`avoid-endl`;`clang-analyzer-*` 关注 `core.*`、`unix.*`、`security.*`;`cert-*` 关注 `err34-c`、`str51-cpp`。
- 配置 .clang-tidy 文件:放在项目根目录,设置 `Checks: > bugprone-*, modernize-*, performance-*, -modernize-use-trailing-return-type, -bugprone-easily-swappable-parameters`,`WarningsAsErrors: 'bugprone-*,clang-analyzer-*'`,`HeaderFilterRegex: '^(src|include)/.*'`。
- 配置 .clang-tidy 的 CheckOptions:设置 `modernize-loop-convert.MinConfidence: reasonable` 和 `readability-identifier-naming.VariableCase: camelCase`。
- 抑制单行误报:在代码行尾加 `// NOLINT(bugprone-signed-char-misuse)`。
- 抑制下一行/代码块误报:在上一行加 `// NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers)`,例如 `constexpr int BUFFER_SIZE = 4096;`。
- 抑制整个函数误报:在函数前加 `[[clang::suppress("bugprone-*")]]`,例如 `void legacy_code() { /* ... */ }`。
- 在 .clang-tidy 中排除第三方目录:设置 `HeaderFilterRegex: '^(src|include)/.*'`。
- 在 .clang-tidy 中禁用特定检查:设置 `Checks: '-bugprone-easily-swappable-parameters'`。
- 运行 cppcheck 基础检查:`cppcheck --enable=all --std=c11 src/`。
- 运行 cppcheck 并使用 compile_commands.json:`cppcheck --project=build/compile_commands.json`。
- 运行 cppcheck 指定检查并抑制噪声:`cppcheck --enable=warning,performance,portability --suppress=missingIncludeSystem --suppress=unmatchedSuppression --error-exitcode=1 src/`。
- 生成 cppcheck XML 报告供 CI 使用:`cppcheck --xml --xml-version=2 src/ 2> cppcheck-report.xml`。
- 理解 cppcheck `--enable=` 取值:`warning` 检查未定义行为和坏实践;`performance` 检查冗余操作和低效模式;`portability` 检查不可移植构造;`information` 输出配置和使用说明;`all` 包含以上全部。
- 用 scan-build 拦截 Make 构建:`scan-build make`。
- 用 scan-build 拦截 CMake 构建:`scan-build cmake --build build/`。
- 查看 scan-build HTML 报告:`scan-view /tmp/scan-build-*/`。
- 用 scan-build 启用特定 checker:`scan-build -enable-checker security.insecureAPI.gets -enable-checker alpha.unix.cstring.BufferOverlap make`。
- 理解 scan-build 定位:它比 clang-tidy 找更深层 bug,例如跨函数 use-after-free、逻辑错误导致的 dead stores、复杂路径上的 null dereference。
- 在 CI 中集成 clang-tidy:在 GitHub Actions 运行 `cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON`,再运行 `run-clang-tidy -p build -j$(nproc) -warnings-as-errors '*'`。
- 在 CI 中集成 cppcheck:运行 `cppcheck --enable=warning,performance --suppress=missingIncludeSystem --error-exitcode=1 src/`。
- 需要 clang-tidy 检查细节时查看 references/clang-tidy-checks.md;相关技能:clang 工具链见 skills/compilers/clang,GCC 警告见 skills/compilers/gcc,运行时检测见 skills/runtimes/sanitizers,CMake 的 CMAKE_EXPORT_COMPILE_COMMANDS 设置见 skills/build-systems/cmake。
适用边界 · 注意事项
- 非 C/C++ 项目,或没有 clang-tidy/cppcheck/scan-build 工具链时不适用。
- 无法生成 compile_commands.json 时,clang-tidy 的整项目分析和基于编译数据库的 cppcheck 不适用。
- 不要用它替代运行时检测、并发测试和动态分析;这些静态工具无法覆盖所有运行时缺陷。