1. Clang-tidy 是什么?
Clang-tidy 是一个开源工具,用于 C++ 代码的静态分析。它是 Clang 项目的一部分,可以检测代码中的错误、风格问题、性能问题等,并自动修复一些常见问题。Clang-tidy 的可扩展性使其能够编写自定义检查器来适应特定的编程需求,还能与编辑器和持续集成系统集成,以自动执行代码检查和修复,从而提高代码质量并减少编程错误。
2. Clang-tidy 检测流程
Clang-tidy检测一个文件的过程大致如下:
➢ 预处理:Clang-tidy首先对源代码进行预处理,解析出宏定义、头文件包含等信息。
➢ 语法分析:然后,Clang-tidy对预处理后的代码进行语法分析,生成抽象语法树(AST)。
➢ 静态分析:接着,Clang-tidy对AST进行静态分析,检查可能的编程错误、风格问题等。
➢ 报告和修复:最后,Clang-tidy报告检测到的问题,并尝试自动修复一些问题。
3. 安装和使用
● 命令行安装
sudo pip install clang-tidy # 或者
sudo apt-get install clang-tidy
● Clang-tidy命令使用
使用 clang-tidy 检测某个文件时需要知道头文件路径等编译信息,这是因为它需要了解代码的上下文环境,以便正确地解析代码并检测潜在的问题。例如,如果代码中使用了某个库的函数,Clang-tidy需要知道该库的头文件路径才能正确地解析函数的声明和定义。如果缺少这些编译信息,Clang-tidy可能会产生误报或漏报的问题。
因此一个 clang-tidy 检查的命令大概是这样的:
clang-tidy --checks='-*' test.cpp -- -I ./src/ -x c++
命令的含义如下:
➢ clang-tidy:调用clang-tidy工具。
➢ –checks=‘-*’:指定要执行的检查器。这里的-*表示不执行任何检查器,即关闭所有检查器。
➢ test.cpp:指定要检查的源文件名。
➢ –:用于分隔clang-tidy的选项和编译器的选项。
➢ -I ./src/:指定编译器的头文件搜索路径,即将./src/目录添加到头文件搜索路径中。
➢ -x c++:指定编译器要编译的源文件类型为C++。
在实际使用 clang-tidy 中,搭配cmake将事半功倍。clang-tidy中有个 -p 参数-p build-path参数是用于指定Clang-tidy读取编译命令数据库的路径。编译命令数据库通常是一个名为compile_commands.json的文件,它包含了编译每个源文件所需的完整命令行,包括编译器选项、头文件路径等信息。例如,如果你使用CMake进行构建,可以通过设置-DCMAKE_EXPORT_COMPILE_COMMANDS=ON选项来生成compile_commands.json文件。然后,你可以使用-p参数告诉Clang-tidy在哪里找到这个文件,如clang-tidy -p /path/to/build/directory。
如果没有指定-p参数,Clang-tidy会尝试在第一个输入文件的所有父路径中搜compile_commands.json文件。这个参数的主要目的是让Clang-tidy能够正确解析源代码。因为C++的语法和语义很大程度上取决于编译上下文,如果没有正确的编译信息,Clang-tidy可能无法正确解析源代码,也就无法进行准确的静态分析。
通过 -p 参数指定编译命令数据库路径,使 Clang-tidy 能够正确解析代码。可以使用 CMake 生成 compile_commands.json 文件:
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON /path/to/source
然后使用 Clang-tidy
clang-tidy -p /path/to/build test.cpp
4. 总结
Clang-tidy 是一个用于 C++ 代码静态分析的强大工具。通过预处理、语法分析、静态分析和报告修复,Clang-tidy 能够检测和修复代码中的多种问题。安装后,通过提供正确的编译信息,Clang-tidy 可以高效地检查和优化代码质量。使用 CMake 生成编译命令数据库可以进一步简化 Clang-tidy 的使用。