本文转载自微信公众号《程序喵大师》,作者程序喵大师。转载本文请联系程序大师喵公众号。工欲善其事,必先利其器。优雅的代码离不开静态代码检查工具。大家可能用的比较多的是cppcheck,但是今天要给大家分享的是另一个静态代码检查工具clang-tidy。与cppcheck使用正则表达式进行静态代码分析不同,clang-tidy是一个基于语法分析树的静态代码检查工具。虽然它的速度比正则表达式慢,但检查更准确、更全面,不仅可以做静态检查,还可以自己做一些修复工作,添加一些自定义的检查规则。话不多说,上面的代码:#includeintmain(){inta=1.2;return0;}这里有隐式类型转换,可以用clang-tidy检测:~/test$clang-tidy-checks=*test_lint.cpp--7748生成的警告。/home/wangzhiqiang/test/test_lint.cpp:20:13:warning:从'double'到'int'的隐式转换将值从1.2更改为1[clang-diagnostic-literal-conversion]inta=1.2;^Suppressed7747warnings(7747innon-usercode).Use-header-filter=.*显示来自所有非系统头的错误。使用-system-headers也显示来自系统头的错误。也许你在这里有疑问。这不就是一个普通的编译警告吗?正常使用编译器就可以查出来了。再看另外一段代码:#includeintmain(){char*d=NULL;return0;}我们都知道在C++中,我们应该多使用nullptr而不是NULL。这里我们使用NULL而不是nullptr,可能我们在开发的时候没有注意到这个用法,所以clang-tidy就派上用场了:~/test$clang-tidy-checks=*test_lint.cpp--7748warningsgenerated./home/wangzhiqiang/test/test_lint.cpp:20:15:warning:usenullptr[modernize-use-nullptr]char*d=NULL;^~~~~nullptrSuppressed7747warnings(7747innon-usercode).Use-header-filter=.*todisplayerrorsfromallnon-systemheaders.使用系统标头也显示来自系统标题的错误。再举一个例子:structBase{virtualvoidfunc(){}};structDerive:Base{virtualvoidfunc(){}};这里我们乍一看可能没什么问题,其实在C++11中,派生类继承父类,在重写一些函数的时候,最好加上override关键字,还是可以被clang检测到的-整洁:~/test$clang-tidy-checks=*test_lint.cpp--7749warningsgenerated./home/wangzhiqiang/test/test_lint.cpp:14:18:warning:preferusing'override'or(rarely)'final'insteadof'virtual'[hicpp-use-override]virtualvoidfunc(){~~~~~~~~~~~~~^overrideSuppressed7747warnings(7747innon-usercode).Use-header-filter=.*todisplayerrorsfromallnon-systemheaders.Use-系统标头也显示系统标头中的错误。这个工具还可以检查代码是否符合编码标准,比如google编码标准等,看这个头文件的相关代码:#include#include#include其实有一个这里的小问题。头文件引用顺序不符合编码规范。其实这里clang-format可以检测到,但是clang-tidy也可以检测到。通过-fix也可以进行自动修复:~/test$clang-tidy-checks=*test_lint.cpp--8961warningsgenerated./home/wangzhiqiang/test/test_lint.cpp:2:1:warning:#includesarenotsortedproperly[llvm-include-命令]#include^~~~~~~~~Suppressed8960warnings(8960innon-usercode).Use-header-filter=.*todisplayerrorsfromallnon-systemheaders.Use-system-headerstodisplayerrorsfromsystemheadersaswell它还可以检测隐藏的内部漏洞:intmain(){char*ct=(char*)malloc(323);return0;}这是使用clang-tidy的检测结果:~/test$clang-tidy-checks=*test_lint.cpp--7756warningsgenerated./home/wangzhiqiang/test/test_lint.cpp:20:5:warning:initializingnon-owner'char*'withanewlycreated'gsl::owner<>'[cppcoreguidelines-owning-memory]char*ct=(char*)malloc(323);^/home/wangzhiqiang/test/test_lint.cpp:20:5:warning:用acast初始化时使用auto避免重复类型名[hicpp-use-auto]char*ct=(char*)malloc(323);^~~~~auto/home/wangzhiqiang/test/test_lint.cpp:20:11:warning:Valuestoredto'ct'duringitsinitializationisneverread[clang-analyzer-deadcode.DeadStores]char*ct=(char*)malloc(323);^/home/wangzhiqiang/test/test_lint.cpp:20:11:注意:Valuestoredto'ct'duringitsinitializationisneverread/home/wangzhiqiang/test/test_lint.cpp:20:16:warning:C-stylecastsarediscouraged;usestatic_cast[google-readability-casting]char*ct=(char*)malloc(323);^~~~~~~~~~~~~~static_cast()/home/wangzhiqiang/test/test_lint.cpp:20:16:警告:不要使用C-stylecast在无关类型之间进行转换[cppcoreguidelines-pro-type-cstyle-cast]/home/wangzhiqiang/test/test_lint.cpp:20:23:警告:donotmanagememorymanually;consideracontainerorasmartpointer[cppcoreguidelines-no-malloc]char*ct=(char*)malloc(323);^/home/wangzhiqiang/test/test_lint.cpp:21:5:warning:Potentialleakofmemorypointedtoby'ct'[clang-analyzer-unix.Malloc]return0;^/home/wangzhiqiang/test/test_lint.cpp:20:23:note:Memoryisallocatedchar*ct=(char*)malloc(323);^/home/wangzhiqiang/test/test_lint.cpp:21:5:note:Potentialleakofmemorypointedtoby'ct'return0;^Suppressed7747warnings(7747innon-usercode).Use-header-filter=.*todisplayerrorsfromallnon-systemheaders.Use-system-headerstodisplayerrorsfromsystemheadersaswellclang-tidy还有很多高端功能,大概况可以很概括250这些问题大致分为几类:abseil:检测abseil库相关问题android:检测Android相关问题boost:检测boost库相关问题cert:检测CERT代码规范cpp-core-guidelines:检测是否违反cpp-core-guidelinesgoogle:检测是否违反google编码标准llvm:检测是否违反llvm编码标准performance:检测与性能相关的问题readability:检测与可读性相关但不属于某些编码标准的问题modernize:检测是否使用现代C++11相关代码问题,适用于Windows/Linux/MacOS多平台,还支持命令行、CLion/VSCode/VSStudio插件等,检测规则也可自定义。重要的是它是免费开源的,赶快去用吧,写出优雅的C++代码吧~参考资料:https://clang.llvm.org/extra/clang-tidy/https://www.bilibili。com/视频/av96166240/