当前位置: 首页 > 科技观察

静态分析利器ClangStaticAnalyzer(四)Clang-Tidy

时间:2023-03-19 20:00:45 科技观察

了解更多开源请访问:开源基础软件社区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-。例如,由编译选项-Wliteral-conversion控制的Clang警告由名为clang-diagnostic-literal-conversion的检查器进行分析和报告。-fix标志指示clang-tidy在相应检查支持的情况下修复发现的错误。还有一个更重要的选项--fix,启用这个选项clang-tidy会在相应的检查器支持的情况下修复发现的错误。哪些检查器支持自动修复,您可以参考下面检查器列表中的提供修复字段。使用clang-tidy--help查看帮助信息。这里主要看--fix相关的帮助信息。启用此选项--fix后,clang-tidy将修复发现的错误。当未指定--fix-errors选项时,如果发现编译错误,clang-tidy将跳过修复。当指定--fix-errors选项时,即使发现编译错误,修复也会继续。--fix-应用建议的修复。如果没有-fix-errors,如果发现任何编译错误,clang-tidy将退出。--fix-errors-即使发现编译错误也应用建议的修复。如果编译器错误附加了fix-its,clang-tidy也会应用它们。我没有亲身经历过。执行以下命令。如果在usingdeclarations的警告信息中发现了示例文件中未使用的语句,则会自动修复并删除。//查找simple.cc中所有未使用的using声明并自动修复(删除)$clang-tidy-checks="-*,misc-unused-using-decls"-fixpath/to/simple.cc--4.检查器列表Clang-Tidy现在支持四到五百个检查器。详细列表请访问clang-tidy-Clang-TidyChecks—ExtraClangTools16.0.0git文档获取。您可以查看这些检查器是否支持自动修复错误。对于这些跳棋者来说,也是很好的学习资源。您可以看到这些检查器将修复哪些类型的缺陷。以后写代码的时候,可以避免写出这些缺陷,提高自己的编程能力和素养。Clang-TidyCheckslistfragmentNameOffersfixesabseil-cleanup-ctad是的……android-cloexec-creat是的……android-comparison-in-temp-failure-retryboost-use-to-string是bugprone-argument-comment是……cert-dcl21-cpp是……clang-analyzer-core.DynamicTypePropagation……5.了解更多检查器正在使用clang-tidy来检查报告,您可以了解更多有关检查器的知识,这可以帮助我们了解这些检查规则以及如何修复它们。挑几个。(1)readability-duplicate-include的详细链接在https://clang.llvm.org/extra/clang-tidy/checks/readability/duplicate-include.html。查找重复的包含并删除它们。该检查维护包含文件的列表并查找重复项。如果宏已定义或未定义,则清除包含文件的列表。此检查器维护包含文件的列表,然后查找重复项。如果宏已定义或未定义,则清理包含文件列表。例子如下:#include#include#include修复方法:#include#include下面这个例子,因为中间有宏定义,不会识别重复包含,代码不会被自动修复。#undefNDEBUG#include"assertion.h"//...启用断言的代码#defineNDEBUG#include"assertion.h"//...禁用断言的代码(2)readability-delete-null-pointer详细链接在https://clang.llvm.org/extra/clang-tidy/checks/readability/delete-null-pointer.html。在if语句中,如果检测到指针是否存在,则将其删除。这样的检查是不必要的,因为删除空指针与它无关,是可以删除的冗余代码。诠释*p;如果(p)删除p;(3)misc-unused-parameters的详细链接在https://clang.llvm.org/extra/clang-tidy/checks/misc/unused-parameters.html。查找未使用的函数参数。未使用的参数可能表示代码缺陷,例如,当使用不同的参数代替时。建议的修复方法是注释掉参数名称或完全删除参数,只要函数的调用者在同一个翻译单元中并且可以修改。此检查器类似于编译器诊断选项-Wunused-parameter,可用于准备代码库以启用此诊断。默认情况下,检查器是宽松的。示例1:voida(inti){/*一些不使用`i`的代码*/}//变为voida(int/*i*/){/*一些不使用`i的代码`*/}Example2:staticvoidstaticFunctionA(inti);staticvoidstaticFunctionA(inti){/*一些不使用`i`的代码*/}//变成staticvoidstaticFunctionA()staticvoidstaticFunctionA(){/*一些没有使用`i`的代码*/}更多开源信息请访问:开源基础软件社区https://ost.51cto.com。