我针对GCC 12.2以及Clang – Tidy 15做了实际测试,遭遇过静态检查规则出现误报的情况,经历过输出格式变得混乱的状况,还碰到用于性能分析的数据不准确这样的问题……
我针对GCC 12.2以及Clang – Tidy 15做了实际测试,遭遇过静态检查规则出现误报的情况,经历过输出格式变得混乱的状况,还碰到用于性能分析的数据不准确这样的问题,新手只要依照步骤一步步去进行操作,便能够轻松躲开这类比较常见的问题。
C++代码静态检查如何配置才能精准高效
配置Clang-Tidy是代码检查的第一步。打开你名为CMakeLists.txt的文件,在执行project()命令之后,去添加下面这样的指令:将CMAKE_CXX_CLANG_TIDY设置为“clang-tidy;-checks=,-modernize-use-trailing-return-type,-fuchsia-”。这一指令开启了Clang-Tidy,且将当中一些太过激进或者针对特定平台的检查规则予以排除。随后实行cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON,至此会创立compile_commands.json文件,从而给工具供给完备的编译数据库。
【新手避坑】
存在着这样一种常见报错情况,那就是Clang – Tidy找寻不到头文件,或者会报告出大量并非相关的警告。其最为核心的原因在于,编译数据库是不完整的,又或者是检查规则太过宽泛。而有一种能够快速解决的办法是,要去确保CMake配置正确无误地生成了compile_commands.json,还要去检查其路径是不是包含了所有必要的 – I参数。另外还有一种办法,便是使用 — extra – arg手动来指定系统头文件路径。
涉及到检查规则,我所推荐的是,-checks=performance- ,bugprone -这个组合,readability-。这个参数值,平衡了检查深度跟实用性,performance – 能捕捉像不必要的拷贝、低效算法等关键性能问题,bugprone – 和readability – 则覆盖了常见的逻辑错误以及代码可读性痛点,避免了规则过多所带来的噪音干扰,适合大多数项目初期接入。
代码分析结果如何输出成清晰可读的报告
完成检查之后,要把结果进行格式化输出。于构建目录当中,运行这样的命令:clang-tidy -p build/compile_commands.json your_source_file.cpp — -std=c++17 > clang_tidy_raw.txt 2>&1。如此这般会把原始输出重定向至文件。然而原始输出的可读性比较差,还需要进一步去处理。首先,倘若输出呈现为此种类型,也就是JSON格式,那么便要运用jq工具来实施解析。其次,若输出并非JSON格式,这种情况下,就要借助Python脚本予以解析。有一种较为务实的方式是运用Clang-Tidy自身所具备的 -export-fixes参数:即执行clang-tidy -p build/compile_commands.json ,还要加上 –export-fixes=fixes.yml ,之后处理your_source_file.cpp。
【新手避坑】
单单直接去阅读终端所给出的输出,那就比较容易遗漏掉那些重要的信息,并且还不能够去开展后续的统计工作。其核心的问题在于这种输出缺少那种结构。而后对比一下两种方案:方案一呢,就是在输出原始文本之后运用grep进行过滤,它的优点是速度快而且比较轻量;方案二呢,则是利用-export-fixes来生成具有结构化的YAML/JSON,它的优点是能够进行可编程处理,与CI/CD工具的集成性也比较好。处在必须选择下方案二的情况里,是那种跟需要归档有关的,或者是团队评审相关的,又或者是自动化修复的这类场景。而对于个人快速查看而言,方案一显得更为直接。
需将处理完成后的输出,进行分类予以展示,分类方式为,按照错误级别(包含ERROR、WARNING),按照所要出示的文件,按照所对照的检查规则进行划分展示。同时建议运用Markdown或者HTML格式来生成最终所获的报告,并且要着重突出那些需要即刻进行处理的具备高优先级的问题。
遇到“静态分析器内部错误”怎么一站式解决
在执行的进程当中,你极有可能会碰到“Static analyzer internal error”或者与之相似的致使错误。这可是一个频次很高内容完备的报错。首先呢,千万别慌张,这一般而言是工具遭遇了没办法解析的极为极端的代码或者其自身所存在的缺陷。第一步,把范围给缩小:要在命令的后边添加上–extra-arg=-DCMAKE_CXX_CLANG_TIDY_DEBUG=1以此来启用调试信息,接着再重新运行。查看输出的堆栈跟踪,定位触发错误的源文件大致位置。
第二步,把问题代码进行隔离。要是项目文件数量众多,那就运用二分法去注释掉疑似模块,一步步缩小范围直至具体的函数或者代码行。第三步,构建出一个最小复现样例。把可疑代码单独提取出来放到一个新的.cpp文件里,使用最简单的clang – tidy命令来测试。要是错误仍旧存在,那你极有可能察觉到了工具的一个BUG。
【新手避坑】
新手碰到此类错误时,常常会尝试去调整数目众多的无关参数,从而造成时间的浪费。一站式的解决流程是這樣的:先启用调试信息,接着定位文件,然后创建最小复现样例,随后搜索Clang/LLVM Issue列表。要是已经存在类似报告,那么可以参照临时规避方法(像是使用-checks=去临时禁用某个具体的检查子项)。要是没有找到,那就可以考虑提交Issue。在这个期间,可供替代的方案乃是运用别的静态分析工具,比如说Cppcheck,针对那般存在问题的文件展开交叉检查,以此来保证代码的安全性。
这种方法,对特定编译工具链(GCC/Clang)以及构建系统(CMake)有着高度的依赖。那些使用老旧编译器(像MSVC 2015之前版本)或者非标准构建系统(好比纯Makefile且没生成编译数据库)的项目,有可能没办法直接去应用。处于这样的情形下,简易的替代办法是运用Cppcheck此类不太严格依赖编译数据库的工具来搞基础检查,虽说深度和精度或许会降低,不过能给予基本的代码质量保障。
微信扫一扫
还没有评论呢,快来抢沙发~