静态分析-从约会到整合

厌倦了无休止的代码审查或调试,有时您想知道如何简化您的生活。进行了一些搜索或偶然发现后,您会看到一个神奇的短语:“静态分析”。让我们看看它是什么以及它如何与您的项目交互。



演化

事实上,如果您使用任何现代语言编写代码,那么您甚至都不知道它是通过静态分析器传递的。事实是,任何现代编译器都只提供很少的关于代码中潜在问题的警告。例如,在Visual Studio中编译C ++代码,您可以看到以下内容:



问题

在此输出中,我们看到var变量从未在函数中的任何位置使用。因此,实际上,您几乎总是使用简单的静态代码分析器。但是,与诸如Coverity,Klocwork或PVS-Studio之类的专业分析仪不同,编译器提供的警告只能指示一小部分问题。



如果您不确定什么是静态分析以及如何执行静态分析,请阅读本文以了解有关此方法的更多信息。



为什么需要静态分析?



简而言之:加速和简化。



静态分析使您可以在代码中发现很多不同的问题:从滥用语言构造到拼写错误。例如,代替



auto x = obj.x;
auto y = obj.y;
auto z = obj.z;


您编写了以下代码:



auto x = obj.x;
auto y = obj.y;
auto z = obj.y;


如您所见,最后一行有一个错字。例如,PVS-Studio发出以下警告:



V537考虑查看'y'项目用法的正确性。



如果您想弄清楚这个错误,请在Compiler Explorer中尝试一个现成的示例:*单击*。



正如您所了解的那样,并非总是可以立即注意代码的这些部分,因此您可以坐下来调试一整个小时,想知道为什么一切如此奇怪。



但是,这是一个明显的错误。如果开发人员由于忘记了某种语言的精巧性而编写了次优的代码该怎么办?甚至在代码中允许未定义的行为不幸的是,这种情况非常普遍,大部分时间都花在了调试包含错别字,典型错误或未定义行为的特定工作代码上。



对于这些情况,出现了静态分析。这是开发人员的助手,他将指出代码中的各种问题,并在文档中解释为什么不需要这种方式编写,它可以导致什么以及如何解决它。这是外观的示例:*单击*。



您可以在文章中找到分析器可以检测到的更多有趣的错误:





现在,在阅读了该材料并确信静态分析的有用性之后,您可能需要对其进行测试。但你从哪儿开始呢?如何将新工具集成到正在进行的项目中?以及如何向他介绍团队?您将在下面找到这些问题的答案。



注意。静态分析不会替代或否定代码审查这样有用的东西。它通过帮助提前发现并纠正错别字,错误和危险构造来补充此过程。在查看代码时,专注于算法和代码可理解性比寻找错误的括号或阅读无聊的比较功能要更有效率



0.了解仪器



一切都从试用版开始。的确,如果您以前从未见过该工具,则很难决定在开发过程中实现某些功能。因此,第一步是下载试用版



在此阶段您将学到什么:



  • 与分析仪交互的方式有哪些?
  • 分析仪与您的开发环境兼容吗?
  • 现在您的项目中存在什么问题。


安装完所需的一切之后,第一步是对整个项目(WindowsLinuxmacOS)进行分析。对于Visual Studio中的PVS-Studio,您将看到类似的图片:



清单

事实是,通常静态分析器会对具有大量代码库的项目发出大量警告。由于您的项目已经在工作,因此无需全部修复,这意味着这些问题并不严重。但是,您可以查看最有趣的警告并在必要时进行修复。为此,您需要过滤输出并仅保留最可靠的消息。在Visual Studio的PVS-Studio插件中,这是通过按错误级别和类别进行过滤来完成的。为了获得最准确的输出,请仅启用常规



清单

实际上,比几千个更容易查看178警告...



选项卡中通常可以找到良好的警告,但是这些类别包括准确性(可靠性)较低的诊断。有关警告级别和在Windows下使用的选项的更多信息,可以在这里找到:*单击*。



在成功检查了最有趣的错误(并成功修复它们)之后,有必要消除其余警告这是为了确保新的警告不会在旧警告中丢失。而且,静态分析器是程序员的帮手,而不是错误列表。:)



1.自动化



会议结束后,该配置插件并集成到CI了。这必须在程序员开始使用静态分析器之前完成。关键是程序员可能会忘记打开分析或根本不愿意进行分析。为此,您需要对所有内容进行一些最终验证,以使未经验证的代码无法进入常规开发分支。



在此阶段您将学到什么:



  • 该工具提供哪些自动化选项;
  • 分析仪与您的构建系统兼容吗?


由于没有完善的文档,有时您必须写信给support这是正常现象,我们很乐意为您提供帮助。:)



现在开始讨论持续集成(CI)服务。任何分析仪都可以嵌入其中,而不会出现重大问题。为此,您需要在管道中创建一个单独的阶段,通常在组装和单元测试之后才能找到。这是使用各种控制台实用程序完成的。例如,PVS-Studio提供以下实用程序:





要将分析集成到CI中,您需要做三件事:



  • 安装分析仪;
  • 运行分析;
  • 交付结果。


例如,要在Linux(Debian-base)上安装PVS-Studio,需要运行以下命令:



wget -q -O - https://files.viva64.com/etc/pubkey.txt \
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list \
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio


在Windows系统上,无法从程序包管理器安装分析器,但是可以从命令行部署分析器:



PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications


您可以在此处*了解更多有关在Windows系统上部署PVS-Studio的信息



安装后,您需要直接运行分析。但是,建议仅在编译和测试通过后才执行此操作。这是因为静态分析通常花费的时间是编译时间的两倍。



由于启动方法取决于平台和项目的具体情况,因此我将以C ++(Linux)选项为例:



pvs-studio-analyzer analyze -j8 \
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w


第一个命令将执行分析,并且所述第二将所述转换报告成文本格式,在屏幕上显示它,并在警告的情况下返回0以外的返回代码。类似的机制对于在出现错误消息时阻止程序集很有用。但是,您始终可以删除-w标志,而不阻塞包含警告的程序集。



注意。文字格式不方便。这只是一个例子。请注意更有趣的报告格式-FullHtml。它允许您浏览代码。



您可以在文章“ PVS-Studio和持续集成”(Windows)或“如何在Travis CI中设置PVS-Studio”中阅读有关在CI上设置分析的更多信息。“(Linux)。



好吧,您已经在构建服务器上设置了分析器。现在,如果有人上载了未经验证的代码,则验证阶段将落下,您可以找到问题所在,但这不是很方便,因为这样可以更有效地检查项目在分支请求阶段合并分支的方式以及在分支之前,



通常,设置分支请求分析与通常在CI上启动分析没有太大区别,除了需要获取已更改文件的列表外,通常可以通过请求差异来获得使用git在分支之间:



git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list


现在,您需要将此文件列表传递给分析器。例如,在PVS-Studio中,这是使用-S标志实现的



pvs-studio-analyzer analyze -j8 \
                            -o PVS-Studio.log \
                            -S .pvs-pr.list


您可以在此处*了解有关拉取请求分析的更多信息即使您的CI不在本文中指定的服务列表中,有关这种类型的分析理论的常规部分对您也很有用。



通过配置对拉取请求的分析,您可以阻止包含警告的提交,从而创建未经验证的代码无法跨越的边界。



一切都很好,但是我希望能够在一处查看所有警告。不仅来自静态分析仪,还来自单元测试或动态分析仪。有各种服务和插件。例如,PVS-Studio具有用于集成到SonarQube插件



2.在开发人员机器上的集成



现在是时候为日常开发使用安装和配置分析仪了。至此,您已经熟悉了大多数工作方式,因此这可以称为最简单的部分。



作为最简单的选择,开发人员可以自己安装所需的分析仪。但是,这将花费很长时间并且使他们无法进行开发,因此您可以使用安装程序和必要的标志来自动执行此过程。 PVS-Studio有各种标记用于自动安装。但是,总是有像Chocolatey(Windows),Homebrew(macOS)之类的软件包管理器,或Linux的许多选项。



然后,您将需要安装必要的插件,例如,用于Visual StudioIDEA骑手



3.日常使用



在此阶段,是时候谈谈加快分析仪日常使用性能的方法了。对整个项目进行完整的分析需要很长时间,但是在整个项目中一次更改代码的频率是多少?几乎没有如此大规模的重构,它会立即影响整个代码库。一次更改的文件数量很少超过10,因此分析它们是有意义的。对于这种情况,存在增量分析模式只是不要惊慌,这不是另一个工具。这是一种特殊模式,它允许您仅分析已更改的文件及其依赖性,如果在IDE中安装了插件,则在构建后会自动发生。



如果分析仪在最近更改的代码中检测到问题,它将自行报告。例如,PVS-Studio会通过通知告知您:



通知

不用说告诉开发人员使用该工具还不够。我们需要以某种方式告诉他们这是什么以及如何。例如,以下是有关PVS-Studio快速入门的文章,但是您可以找到您喜欢的任何工具的类似教程:





这样的文章提供了日常使用所需的所有信息,并且不需要花费很多时间。:)



即使在了解该工具的阶段,我们在第一次启动中也抑制了很多警告。static,静态分析器并不完美,因此它们会不时产生误报。通常,抑制它们很容易,例如,在Visual Studio的PVS-Studio插件中,单击一个按钮就足够了:



压制

但是,您不仅可以抑制它们。例如,您可以报告问题以寻求支持。如果有可能纠正误报,那么在以后的更新中,您应该注意一个事实,即每次特定于代码库的误报越来越少。



整合后



因此,我们经历了将静态分析集成到开发过程的所有阶段。尽管在CI中设置此类工具非常重要,但是开发人员的计算机是最重要的起点。毕竟,静态分析器不是一个判断者,他在远离您的地方说代码毫无价值。相反,如果您累了,它会提示您,如果您忘记了某些东西,它会提醒您。



但是,如果不定期使用,静态分析不太可能极大地简化开发。毕竟,它对开发人员而言最重要的好处不在于查找复杂且有争议的代码段,而在于对它们的早期发现。同意在进行编辑测试后发现问题不仅令人不快,而且时间很长。定期使用静态分析时,它会查看计算机上的所有更改,并在处理代码时报告可疑的地方。



而且,如果您或您的同事仍然不确定是否值得实施该分析器,那么建议您继续阅读文章“在开发过程中实施PVS-Studio静态代码分析器的原因”。“。它解决了开发人员的典型问题,即静态分析将花费他们的时间,依此类推。







如果您想与讲英语的读者分享本文,请使用翻译链接:Maxim Zvyagintsev。静态分析:从入门到集成



All Articles