Clang-Tidy如何在c++项目中进行静态代码检查 提升代码质量【工程化】

18次阅读

Clang-Tidy 是 LLVM 提供的 c++ 静态分析工具,需嵌入构建流程、统一规则并持续反馈;推荐通过 CMake 集成,支持配置文件、CI 门禁、本地实时检查及自动修复,核心是规则可配、执行可嵌、结果可溯、修复可自动化

Clang-Tidy如何在c++项目中进行静态代码检查 提升代码质量【工程化】

Clang-Tidy 是 LLVM 项目提供的 C++ 静态分析工具,能自动检测代码中潜在的 bug、风格问题、性能隐患和不安全用法。在工程化实践中,它不是“跑一次就完事”的玩具,而是需要嵌入构建流程、统一规则、持续反馈的基础设施。

集成到 CMake 构建系统(推荐方式)

现代 C++ 项目多用 CMake,Clang-Tidy 可通过 CMAKE_CXX_CLANG_TIDY 变量直接启用:

  • CMakeLists.txt 根目录添加:
    set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=-*,cppcoreguidelines-*,modernize-*,performance-*,bugprone-*,cert-*" CACHE String "Clang tidy checks")
  • 确保使用 Ninja 或 Make 等支持编译数据库(compile_commands.json)的生成器:
    cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
  • 构建时,Clang-Tidy 会自动对每个编译单元执行检查,并将结果输出到终端或日志中

定制检查规则并维护配置文件

编码在 CMake 中不易维护,建议抽离为独立配置文件:

  • 创建 .clang-tidy 文件(放在项目根目录),内容示例:
    Checks: '-*,cppcoreguidelines-*,modernize-use-nodiscard,-cppcoreguidelines-owning-memory,-modernize-use-auto'
    WarningsAsErrors: true
    HeaderFilterRegex: '^(include|src)'

  • 该文件会被 Clang-Tidy 自动识别,优先级高于命令行参数
  • - 前缀禁用特定检查,用 , 分隔多个规则,支持通配符

与 CI/CD 流水线结合实现门禁控制

避免低质量代码合入主干,需在 CI 中强制执行并阻断失败构建:

立即学习C++免费学习笔记(深入)”;

  • gitHub Actions / gitlab CI 中调用:
    run-clang-tidy -p build/ -fix -quiet | tee clang-tidy-report.txt
  • 使用 -fix 自动修复可安全修改的问题(如添加 override[[nodiscard]]
  • 配合 clang-tidy-diff.py(LLVM 提供脚本)只检查本次 PR 修改的代码,提升效率和精准度
  • 将报告转为 SARIF 格式,接入 github Code Scanning,实现问题直接标注在 PR diff 上

开发者本地高效使用习惯

静态检查的价值取决于是否被开发者真正感知和响应:

  • vs code 安装 C/C++ Extension Pack + Clang-Tidy 插件,编辑时实时高亮问题
  • 在终端快速对单个文件检查:
    clang-tidy src/main.cpp -- -Iinclude -std=c++17
  • 定期运行全量扫描并生成 html 报告:
    run-clang-tidy -p build/ -export-fixes=fixes.yaml && clang-tidy -export-fixes=report.html
  • 把常用检查组合成别名,例如:
    alias ct-check='clang-tidy -p build/ -checks="cppcoreguidelines-*,modernize-*"'

Clang-Tidy 的工程化落地核心是:规则可配置、执行可嵌入、结果可追溯、修复可自动化。它不替代 Code Review,但能把重复性、机械性的质量判断交给机器,让团队聚焦更高阶的设计与逻辑问题。

text=ZqhQzanResources