Clang-Tidy 是 LLVM 提供的 C++ 静态分析工具,依赖 compile_commands.json 实现代码检查、自动修复与规则配置,支持命令行、编辑器集成及 CI/CD 流程。

Clang-Tidy 是 LLVM 项目提供的 C++ 静态分析工具,能自动检查代码风格、潜在 bug、性能问题和现代 C++(如 C++11/14/17/20)合规性。它不依赖完整编译,但需要 编译命令数据库(compile_commands.json) 来理解项目上下文。
一、安装 Clang-Tidy
多数主流平台都可直接获取:
-
Linux(Ubuntu/Debian):
sudo apt install clang-tidy -
macOS(Homebrew):
brew install llvm(Clang-Tidy 包含在 llvm 套件中,路径通常为/opt/homebrew/bin/clang-tidy或/usr/local/bin/clang-tidy) - Windows:安装 LLVM 官方预编译包,勾选 “Add LLVM to the system PATH”
-
CMake 项目推荐方式:启用
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON,自动生成compile_commands.json
二、生成 compile_commands.json(关键前提)
Clang-Tidy 需要知道每个源文件的包含路径、宏定义、语言标准等——这些都来自编译命令。没有它,检查会失败或不准。
- CMake 项目:在构建目录运行
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .. && make(或ninja),生成compile_commands.json - 非 CMake 项目:可用
compdb从 Ninja/Make 日志提取,或手动编写(不推荐) - 确保该文件位于项目根目录或 Clang-Tidy 当前工作目录下
三、常用运行方式
基础命令结构:compdb
立即学习“C++免费学习笔记(深入)”;
-
检查单个文件:
clang-tidy [options]-- [extra-clang-args] -
检查整个项目(推荐):
clang-tidy src/main.cpp --(clang-tidy -p . 'src/**.cpp' --指定 compile_commands.json 所在目录) -
只启用特定检查项:
-p . -
自动修复可安全修改的问题:
clang-tidy -p . -checks="-*,cppcoreguidelines-*,modernize-loop-convert" src/test.cpp --(如 auto 类型推导、nullptr 替换 NULL) -
导出 JSON 报告:
clang-tidy -p . -fix src/utils.cpp --,后续可用clang-tidy -p . -export-fixes=fixes.yaml src/*.cpp --批量应用
四、配置检查规则(.clang-tidy 文件)
在项目根目录放一个 clang-apply-replacements 文件,避免每次输长参数。YAML 格式示例:
Checks: >-
-'*',
-'cppcoreguidelines-*',
-'llvm-*',
+'cppcoreguidelines-avoid-magic-numbers',
+'modernize-use-auto',
+'readability-identifier-naming'
CheckOptions:
- key: readability-identifier-naming.VariableCase
value: lower_case
- key: readability-identifier-naming.FunctionCase
value: camelCase
-
.clang-tidy支持通配符和 +/- 增量控制;默认禁用所有(Checks),再显式启用需要的 -
-'*'可微调规则行为,比如命名规范、作用域范围等 - 完整规则列表见:Clang-Tidy Checks Reference
五、集成到开发流程
让它真正发挥作用,不是只跑一次:
-
编辑器集成:VS Code 安装 C/C++ Extension Pack + 设置
CheckOptions;CLion 内置支持 -
CI/CD 中运行:在 GitHub Actions / GitLab CI 加一步:
"C_Cpp.clang_tidy.enabled": true,失败时中断构建 -
预提交钩子:用
clang-tidy -p build/ 'src/**/*.cpp' -- | grep -E "(warning|error)"工具调用 clang-tidy,仅检查暂存文件,避免阻塞开发节奏











