跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

c++怎么使用clang-tidy静态分析_c++ 代码规范检查与错误预防【教程】

clang-tidy 是基于 Clang 的 C++ 静态分析工具,用于检测代码规范、潜在缺陷(如 nullptr 解引用、未使用变量)和现代 C++ 用法问题,依赖 compile_commands.json 获取编译参数,并通过可配置的检查项(如 cppcoreguidelines-、modernize-)实现精准诊断。 clang-tidy 是什么,它能帮你发现哪些问题 clang-tidy 不是编译器,而是一个基于 Clang 的 C++ 静态分析工具,专为检查 代码规范 、潜在缺陷和现代 C++ 用法设计。它不替代
g++
或
clang++
编译,但能提前暴露
nullptr
解引用、未使用的变量、遗漏的
override
、裸指针误用、不安全的类型转换等真实风险。 它通过“检查项(checks)”工作,比如
cppcoreguidelines-pro-bounds-array-to-pointer-decay
检查数组退化为指针的问题,
modernize-use-auto
提示可改用
auto
的地方。这些检查大多对应《C++ Core Guidelines》或 Google C++ Style Guide 等规范。 如何让 clang-tidy 真正跑起来并接入项目 直接运行
clang-tidy
命令却报错“no compile commands”,这是最常见卡点——它需要知道每个源文件的完整编译参数(尤其是头文件路径、宏定义、C++ 标准版本),不能靠猜。 对 CMake 项目:在配置时加
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
,生成
compile_commands.json
对非 CMake 项目:可用
bear --make
或
compiledb make
拦截编译过程生成该文件 运行时指定路径:
clang-tidy -p build/ main.cpp
(
-p
后跟含
compile_commands.json
的目录) 不带
-p
直接传文件名,clang-tidy 会用默认参数尝试解析,几乎必然失败。 立即学习 “ C++免费学习笔记(深入) ”; go语言参考手册 中文CHM版 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译 下载 怎么选检查项,避免被警告刷屏 开箱即用的
clang-tidy
默认只启用少量基础检查,实际需主动启用有意义的规则集。盲目启用全部(如
-checks='*'
)会导致大量低价值告警(比如所有
using namespace std;
都报),反而掩盖真正危险的问题。 推荐组合策略: 按规范选:用
-checks='-*,cppcoreguidelines-*,modernize-*,bugprone-*,performance-*,readability-*
,再手动排除个别干扰项(如
-cppcoreguidelines-pro-type-vararg
) 按严重性分层:先聚焦
bugprone-
和
performance-
类别,它们指向真 bug 或性能隐患;
readability-
可后期逐步接入 用 配置文件 统一管理:在项目根目录放
.clang-tidy
,内容如
Checks: '-*,cppcoreguidelines-*,modernize-use-auto,bugprone-unused-raii' WarningsAsErrors: false HeaderFilterRegex: '^(include|src)/'
,后续所有
clang-tidy
调用自动读取 集成到开发流程中容易忽略的关键点 很多人把 clang-tidy 当成“偶尔跑一下”的工具,结果问题反复出现。真正起效要嵌入日常环节,但有三个细节常被跳过:
clang-tidy
对 C++ 标准版本敏感:如果项目用
c++17
,必须确保
compile_commands.json
中对应条目含
-std=c++17
,否则
std::optional
等特性会被误判为未声明 头文件修改后,仅运行
clang-tidy file.cpp
不会重新检查其包含的头文件;需配合
--header-filter=.*
并显式列出头文件,或使用
clang-tidy -fix
时加
--header-filter
控制范围 CI 中若用
clang-tidy -fix
自动修复,务必确认目标文件权限可写,且
compile_commands.json
是最新生成的——旧缓存会导致修复应用到错误上下文 它不会替你决定是否该用
std::shared_ptr
,但能指出某处裸指针正在跨函数传递且无所有权说明——这个信号是否处理,取决于你对模块边界的判断,而不是工具本身。

相关文章