clang-tidy——静态代码分析框架

Clang-Tidy是一款基于Clang的静态代码分析工具,支持C++/C/Objective-C等语言。相较于传统的lint工具,Clang-Tidy不仅能在发现问题的同时提供自动修复功能,还能通过模块化设计轻松扩展新的检测功能。本文将详细介绍Clang-Tidy的特点、应用场景及其使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接https://hokein.github.io/clan...

clang-tidy介绍

clang-tidy是一个基于clang的静态代码分析框架,支持C++/C/Objective-C。

它是一个功能更强大的lint工具。绝大部分lint工具只能在出现问题的代码地方给出提示,之后需要人为修改,而clang-tidy则能够自动修复功能(当然这个如何修复需要该check作者提供);并且clang-tidy采用模块化设计,非常容易扩展。如果用户想往clang-tidy添加一个新的检测功能,只需要编写一个clang-tidy check实现(如何编写一个clang-tidy check以后将会有一章详细介绍),每一个check检测一种问题,例如检测某个违反Code style的模式,检测某些API不正确使用的方法等等。

clang-tidy check可以检测各式各样的问题:

  • 检测违反代码规范的代码模式(header guard不满足,include头文件顺序错误);

  • 找出不容易在编译时发现的代码错误(把int赋值给std::string, 变量定义在头文件);

  • 把deprecated的API替换成新的API,modernize模块典型例子,把C++03的代码自动转换成C++11的代码(for-range-loop, auto, nullptr, overriede, default);

Google code style提供了cpplint脚本,用于检测代码中违反code style的地方。clang-tidy也支持检测代码中违反Google code style的地方(google-*check), 它们之间有什么区别?cpplint是一个python的脚本,它是采用正则表达式匹配出违反code style的代码, 所以它能检测的功能会受限于正则表达式,它不能够检测所有的违反code style的地方,并且还会有False positive和True positive;而clang-tidy则是基于抽象语法树(AST)对源文件进行分析,相比之下,是在分析的结果更加准确,能检测的问题也更多。

这两者各有优缺点,clang-tidy需要对源代码进行语法分析(编译源文件),所以它需要知道源文件的编译命令,对于依赖较多较大的文件,花费时间会较长;cpplint则不需要源文件编译,对文件内容进行正则匹配,运行会更快。

clang-tidy每次只针对一个编译单元(TranslationUnit, 可简单理解成1个.cpp文件)进行静态分析,因此,它只能查找出一个编译单元里面的代码问题,对于那种只在跨编译单元出现的问题,就无能为力了。

现在clang-tidy实现有100+个check,请查看list列表。根据check不同种类(从check名字的前缀就能知道哪一类),分为如下几大类:

  • boost 检测boost库API使用问题

  • cert 检测CERT的代码规范

  • cpp-core-guidelines 检测是否违反cpp-core-guidelines

  • google 检测是否违反google code style

  • llvm 检测是否违反llvm code style

  • readability 检测代码上相关问题,但又不明确属于任何代码规范的

  • misc 其它一些零碎的check

  • mpi 检测MPI API问题

  • modernize 把C++03代码转换成C++11代码,使用C++11新特性

  • performance 检测performance相关问题

clang-tidy使用

clang-tidy是一个命令行工具,可以在官网下载编译好的二进制包。
我写了一个clang-tools-prebuilt的npm包,可以通过npm install clang-tools-prebuilt的命令下载(仅支持MacOS, Linux)。

// 列出所有的check
$ clang-tidy -list-checks
// 找出simple.cc中所有没有用到的using declarations. 后面的`--`表示这个文件不在compilation database里面,可以直接单独编译;
$ clang-tidy -checks="-*,misc-unused-using-decls" path/to/simple.cc --

// 找出simple.cc中所有没有用到的using declarations并自动fix(删除掉)
$ clang-tidy -checks="-*,misc-unused-using-decls" -fix path/to/simple.cc --

// 找出a.c中没有用到的using declarations. 这里需要path/to/project/compile_commands.json存在
$ clang-tidy -checks="-*,misc-unused-using-decls" path/to/project/a.cc

分析项目中的y编译单元,clang-tidy首先要知道如何编译单元(该编译单元的编译命令),它从目录下查找compliation database,这个database就是compile_commands.json文件,里面包含该项目中所有的编译单元的编译命令。在使用之前要导出这个文件。目前已经有工具帮我们做了这项工作。

  • 如果是cmake的项目,通过cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources命令导出;

  • 如果是GYP项目,通过ninja -C out/D -t compdb cc cxx objc objcxx > compile_commands.json

  • 如果是make项目,使用Bear工具;

一次命令只能分析一个文件太麻烦,要分析整个项目的所有文件?run_clang_tidy.py脚本正是你想要的,通过多进程的方法对整个项目文件进行分析。

### Clang-Tidy 静态分析工具概述 Clang-Tidy 是一款用于 C++ 代码的静态分析工具,能够帮助开发者自动发现并修复常见的编程错误和风格不一致问题。该工具通过一系列预定义的检查器来执行代码审查任务,这些检查器可以检测诸如性能优化、潜在缺陷以及编码标准等方面的问题[^1]。 ### 使用方法 为了运行 Clang-Tidy 进行静态分析,通常有两种方式: #### 命令行调用 可以直接在命令行中指定待分析的目标源文件列表,并附加必要的选项参数来进行扫描操作。基本语法如下所示: ```bash clang-tidy file.cpp --checks=-*,check_name ``` 这里 `-` 表示禁用默认所有的内置规则;而 `*` 则意味着启用所有可能适用的额外自定义或第三方插件提供的规则集;最后跟上具体的某个想要应用到项目中的特定规则名称即可完成定制化设置过程。 #### 构建系统集成 更推荐的方式是在构建过程中无缝嵌入 Clang-Tidy 工具链里去工作。这可以通过修改项目的编译脚本或者配置文件实现自动化处理流程。例如,在基于 CMake 的环境中添加以下几行指令就可以让每次重新编译时都触发一次完整的静态分析动作了: ```cmake set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-header-filter=.*;--checks=*,-llvm-header-guard" ``` 上述例子展示了如何利用 CMake 变量机制传递给 Tidy 更多控制权以便更好地适应不同场景下的需求变化情况。其中包含了对头文件过滤模式的选择(`-header-filter`) 和开启/关闭某些类别的警告信息 (`--checks=`)。 ### 常见配置 当涉及到更大规模的应用程序开发环境时,则建议采用 `.clang-tidy` 文件形式保存全局性的偏好设定。此文件应当放置于根目录下方便被各个子模块继承沿用统一的标准框架结构。其内部格式遵循 YAML 或 JSON 编码规范,允许用户灵活调整各项属性值以满足个性化要求。下面给出了一段简单的示范片段供参考学习之用: ```yaml Checks: '-*,modernize-use-override,performance-for-range-loop' CheckOptions: - key: modernize-use-override.MinAccessLevel value: public WarningsAsErrors: '*' HeaderFilterRegex: 'myproject/(include|src)/.*' FormatStyle: google ``` 这段配置说明启用了两个具体类型的检查项 (即现代C++特性支持与循环效率改进),同时也指定了仅针对当前工程范围内的路径生效条件以及其他一些辅助性质的功能开关状态等细节描述。 另外值得注意的是还有两种特殊的文件用来进一步细化局部区域的行为表现:`.clang-format` 定义了详细的代码格式化准则,可用于指导 IDE 自动美化功能;`.clang-format-ignore` 列出了不想受到任何格式转换影响的部分资源清单,从而保护特殊样式布局免遭破坏风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值