了解更多开源请访问:开源基础软件社区https://ost.51cto.com前面介绍CodeChecker的时候用的是Clang-整齐的。让我们来看看这个工具是什么以及如何使用它。主要是理解其背后的知识点,使用CodeChecker已经非常好用了。一、Clang-Tidy简介Clang-Tidy是一个基于Clang的C++“linter”工具。大多数lint工具只能在代码中出现问题的地方给出提示,然后需要手动修改,而clang-tidy可以自动修复功能。当然,如何解决这个问题需要检查作者提供。clang-tidy的目的是提供一个可扩展的框架,用于诊断和修复典型的编程错误,例如风格违规、接口误用或静态分析可以推断出的缺陷。clang-tidy是模块化的,提供了一个方便的界面来添加新的检查器。如果用户想给clang-tidy增加一个新的检测功能,只需要写一个clang-tidy检测实现即可。每一个check检测一个问题,比如检测一个pattern违反Codestyle,检测一些API没有正确使用的方法等等。2.开始使用Clang-Tidyclang-tidy是一个基于LibTooling的工具。如果你为你的项目设置了一个编译命令数据库,clang-tidy会更容易使用。有关如何设置编译命令数据的示例,请参阅如何设置LLVM工具。也可以在命令行的--符号后指定编译选项clang-tidytest.cpp---Imy_project/include-DMY_DEFINES--clang-tidy有自己的检查检查器,也可以运行ClangStaticAnalyzer的检查检查器。每个检查器都有一个名称,可以使用选项-checks=选择要运行的检查,该选项指定正负(以-为前缀)glob的逗号分隔模式。positive模式是添加棋子的集合,negative模式会删除棋子的集合。例如,以下将禁用所有检查(-*),并启用除clang-analyzer-cplusplus*之外的所有匹配clang-analyzer-*模式的检查器。$clang-tidytest.cpp-checks=-*,clang-analyzer-*,-clang-analyzer-cplusplus*命令行选项-list-checks列出所有启用的检查。如果没有选项-checks=,它会显示默认启用的检查器。当使用-checks=*时,将检查所有可用的检查器;当指定特定值-checks=XXX时,将检查与模式值匹配的跳棋。你可以自己体验一下。clang-tidy-list-checksclang-tidy-list-checks-checks=*clang-tidy-list-checks-checks=-*,clang-analyzer-*,-clang-analyzer-cplusplus*目前有以下检查组:(1)举个具体的例子,可以用前面的hello.c看看怎么用。上面说了clang-tidy一般不会直接用,用CodeChecker比较好,需要了解即可。intmain(){intx=7/0;//bugherereturn0;}执行以下命令:clang-tidyhello.cclang-tidy--checks=*hello.c选择要执行的命令,输出类似于以下内容。可以看到输出了各种检查器诊断出的缺陷或警告信息。zhushangyuan@DESKTOP-RPE9R4O:~/CSA$clang-tidy--checks=*hello.c5warningsgenerated./home/zhushangyuan/CSA/hello.c:2:7:warning:Valuestoredto'x'duringitsinitialization中永远不会读取[clang-analyzer-deadcode.DeadStores]intx=7/0;//bughere^/home/zhushangyuan/CSA/hello.c:2:7:注意:初始化期间存储到'x'的值永远不会被读取/home/zhushangyuan/CSA/hello.c:2:11:警告:7是一个神奇的数字;考虑用命名常量替换它[cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers]intx=7/0;//错误在这里^/home/zhushangyuan/CSA/hello.c:2:13:警告:除以零[clang-analyzer-core.DivideZero]intx=7/0;//bughere^/home/zhushangyuan/CSA/hello.c:2:13:注意:除以零/home/zhushangyuan/CSA/hello.c:2:13:警告:除以零未定义[clang-诊断除零]intx=7/0;//bughere^3、检查器分组目标前面有以下检查器分组。不同的人群可以针对不同的检查对象,不同的开源项目如Android和Fuchsia,不同的编码标准。名称前缀描述abseil-Abseil库相关检查。altera-FPGAOpenCL编程相关检查。android-Android相关检查。boost-Boost库相关检查.bugprone-检查目标容易出错的代码构造。cert-检查与CERT安全编码指南相关。clang-analyzer-Clang静态分析器检查。concurrency-检查并发编程相关(包括线程、纤程、协程等)。cppcoreguidelines-C++核心指南相关检查darwin-编码约定相关检查fuchsia-检查相关到Fuchsia编码约定。google-与Google编码约定相关的检查。hicpp-与高完整性C++编码标准相关的检查。linuxkernel-与Linux内核编码约定相关的检查。llvm-与LLVM编码约定相关的检查。llvmlibc-与LLVM-libc编码标准相关的检查。misc-Checks,我们没有更好的类别。modernize-检查提倡使用现代(当前“现代”表示“C++11”)语言结构。mpi-与MPI(消息传递接口)相关的检查).objc-检查与Objective-C编码约定相关。openmp-检查与OpenMPAPI相关。性能-检查目标性能相关问题。可移植性-检查该目标与任何特定编码风格无关的可移植性相关问题。可读性-检查目标可读性相关问题,与任何特定编码风格无关。锆石-与Zircon内核编码相关的检查惯例。Clang语言静态分析和clang-tidychecker静态分析类似Clang的静态分析会被clang-tidy显示出来,也会被选项-checks=过滤掉。但是,这些检查器的过滤不会影响已编译的引用,因此它无法打开已在构建配置中关闭的Clang警告开关。-warnings-as-errors=选项会将-checks=选项的检查器检测到的警告消息升级为错误消息。Clang静态分析诊断的检查程序名称以clang-diagnostic-开头。每个warning选项对应的分析诊断,其命名格式为clang-diagnostic-
