clang-tidy
文章目录
- clang-tidy
- 1. 什么是clang-tidy
- 2. clang-tidy可以解决什么问题
- 3. 工作原理
- 4. 如何使用clang-tidy
- 4. 总结
- 5. 举例说明:
1. 什么是clang-tidy
Clang-Tidy是一个由LLVM项目提供的开源工具,是一个静态分析工具,用于进行静态代码分析和代码质量改进。它利用Clang编译器的强大功能,对C++代码进行静态分析,并提供了一系列的代码改进建议和警告。Clang-Tidy是基于Clang的AST(抽象语法树)进行分析,并能检测出许多常见的编码错误和代码风格问题。包括语法错误、逻辑错误、性能问题和风格问题。
2. clang-tidy可以解决什么问题
clang-tidy可以解决各种类型的代码问题,包括:
- 代码风格问题:例如缩进、空格、命名规范等。
- 可维护性问题:例如不必要的拷贝、错误的类型转换等。
- 潜在的编程错误:例如空指针引用、数组越界等。
- 性能问题:例如慢速算法、重复计算等。
clang-tidy可以帮助开发人员在编译时发现代码中的错误,这可以帮助开发人员提高代码质量和可靠性。clang-tidy还可以帮助开发人员提高代码风格,这可以使代码更易于阅读和维护。
3. 工作原理
Clang-tidy的工作原理是将源代码传递给Clang编译器,然后通过静态分析找到代码中的问题。Clang编译器是一个基于LLVM的项目,它提供了了一个强大的C++前端,能够解析、编译和优化C++代码。而Clang-tidy则利用了Clang编译器的这些功能,对源代码进行深度分析,并找出其中可能存在的问题。
具体来说,Clang-tidy使用了以下技术:
- 静态分析:Clang-tidy使用静态分析技术对源代码进行解析,从而构建出抽象语法树(Abstract Syntax Tree,AST)。通过AST,Clang-tidy能够深入理解代码的逻辑,找出其中可能存在的问题。
- 规则引擎:Clang-tidy还使用了一套规则引擎,用来检查代码是否符合特定的规则。这些规则可以是检查潜在的错误、风格问题或性能优化点等。
- 修复建议:对于发现的问题,Clang-tidy能够提供一些修复建议。例如,对于一个未初始化的变量,Clang-tidy可以建议将其初始化为零。
4. 如何使用clang-tidy
如何在mac上安装c lang-tidy
我是直接使用brew install llvm
后,将工具直接软连接到系统路径下,因为mac本身自带clang编译器,如果将llvm放入系统路径,会对mac自身的环境造成影响。
# 安装指令:
brew install llvm
ln -s "/usr/local/opt/llvm/bin/clang-format" "/usr/local/bin/clang-format"
ln -s "/usr/local/opt/llvm/bin/clang-tidy" "/usr/local/bin/clang-tidy"
# 检查安装情况
(base) ➜ bin clang-format --version
clang-format version 16.0.6
(base) ➜ bin clang-tidy --version
Homebrew LLVM version 16.0.6
Optimized build.
find_program(CLANG_TIDY_BIN clang-tidy)
find_program(RUN_CLANG_TIDY_BIN /usr/local/Cellar/llvm/10.0.0_3/share/clang/run-clang-tidy.py)
list(APPEND RUN_CLANG_TIDY_BIN_ARGS
-clang-tidy-binary ${CLANG_TIDY_BIN}
-header-filter="\".*\\b(cpp-client/src)\""
-checks=clan*,cert*,misc*,perf*,cppc*,read*,mode*,-cert-err58-cpp,-misc-noexcept-move-constructor,-cppcoreguidelines-*)
add_custom_target(tidy
COMMAND ${RUN_CLANG_TIDY_BIN} ${RUN_CLANG_TIDY_BIN_ARGS}
COMMENT "running clang tidy")
主要有二种使用方式:
-
使用命令行
可以直接使用命令行:
clang-tidy -checks=all -p my_project my_file.cpp
但是一般会配合githook同步使用, 在用户add或者commit的时候,触发githook,触发脚本,从而扫描用户修改的文件,达到代码静态扫描的目的。
-
使用cmake
推荐参考项目: github-cmake-cpp-project-template
# 该命令会生成
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_program(CLANG_TIDY_BIN NAMES "clang-tidy")
if(CLANG_TIDY_BIN)
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_BIN}" "-checks=*")
endif()
- 使用脚本
clang-tidy官方脚本
4. 总结
Clang-tidy是一种强大的源代码自动检查与修复工具,它能够帮助开发人员发现并修复代码中的各种问题。通过使用Clang-tidy,我们可以提高开发效率,确保代码的质量和可维护性。在未来,我们期待看到Clang-tidy在更多领域的应用,以及其进一步的改进和优化。
5. 举例说明:
在没有任何特定命令行参数的情况下运行该工具将运行该实用程序启用的默认检查器集。让我们检查一下它还提供了哪些其他检查器(通过传递–checks='*'来查看所有检查器),特别是 grep 查找名称中带有现代化的检查器。这些检查器提倡使用现代语言结构:
$ clang-tidy --list-checks -checks='*' | grep "modernize"
modernize-avoid-bind
modernize-deprecated-headers
modernize-loop-convert
modernize-make-shared
modernize-make-unique
modernize-pass-by-value
modernize-raw-string-literal
modernize-redundant-void-arg
modernize-replace-auto-ptr
modernize-shrink-to-fit
modernize-use-auto
modernize-use-bool-literals
modernize-use-default
modernize-use-emplace
modernize-use-nullptr
modernize-use-override
modernize-use-using
选项列表已经令人印象深刻,不是吗?Clang-Tidy 确实开箱即用地提供了一些有趣的检查器(从 Clang/LLVM 3.9 开始),并且列表随着版本的不同而不断增长。
检查器的名称几乎是不言自明的(例如,modernize-use-auto将在适用的情况下使用auto),但如果您想探索每个检查器的含义,请查阅clang-tidy 主页上的检查器列表:
为了展示该工具的使用方式,让我们重点关注现代化使用覆盖检查器,因为它是最适用且最无争议的检查器。
% clang-tidy-3.9 -checks='modernize-use-override' test.cpp -- -std=c++11
1 warning generated.
/home/kfunk/test.cpp:5:18: warning: prefer using 'override' or (rarely) 'final' instead of 'virtual' [modernize-use-override]
virtual void reimplementMe(int a) {}
^
override
好吧。所以它注意到Derived::reimplementMe(int)
重写了基类方法但缺少override
说明符!现在我们可以手动添加…或者只是让该工具通过传递*-fix来为我们完成它!在示例上运行它(启用现代化使用覆盖*检查器和修复功能):
有几件事值得一提:
- 并非所有clang-tidy 的检查器实际上都带有修复功能,但以现代化开头的检查器都带有修复功能。
- 您可以同时使用多个检查器中的修复程序(考虑*-checks=‘modernize-use-override,modernize-use-auto’ -fix)*
- 运行 clang-tidy 会调用完整的 Clang 编译器前端,因此需要一些时间才能完成
- clang-tidy 的重构结果非常准确,因为它得到了成熟的 C++ 解析器的支持
注意:强烈建议使用run-clang-tidy.py在整个项目上运行 clang-tidy,因为它将并行运行该工具多次并确保并发执行不会相互干扰(例如通过避免并行修改共享标头并进而生成损坏的代码)。
- 参考:
clang-tidy 官网