PVS-Studio for Visual Studio


我们的许多文章都专注于任何内容,但PVS-Studio工具本身并不关注。 尽管我们做了很多工作,以使开发人员可以方便地使用它。 但是,我们的努力常常被隐藏在幕后。 我决定纠正这种情况,并向您介绍有关Visual Studio的PVS-Studio插件。 如果您使用Visual Studio,则本文适合您。

什么是静态代码分析以及我们为什么需要它


静态代码分析是检测程序源代码中的错误和缺陷的过程。 静态分析可以被视为自动化代码审查的过程。 联合代码审查是一种很棒的方法。 然而,它具有明显的缺点-高成本。 修改后,有必要召集几个程序员来审查新编写或重写的代码。

一方面,我们希望定期检查代码。 另一方面,它太昂贵了。 折衷解决方案是静态分析工具。 他们认真分析程序的源代码,并向程序员推荐有关检查某些代码片段的建议。 当然,一个程序不会替代由一组开发人员完成的全面的代码审查。 但是,价格/收益比率使静态分析成为一种非常有用的实践,已被许多公司采用。 如果读者对精确数字感兴趣,建议您阅读文章“ PVS-Studio ROI ”。

有许多商业和免费的静态代码分析器。 Wikipedia上提供了大量静态分析器: 静态代码分析工具列表 。 具有静态代码分析器的语言列表非常多(C,C ++,C#,Java,Ada,Fortran,Perl,Ruby等)。 不用说,我们将向您介绍PVS-Studio 分析仪

静态代码分析的主要优点是可以大大降低消除程序缺陷的成本。 越早发现错误,纠正错误的成本就越低。 因此,根据麦康奈尔(McConnell)撰写的“代码完成”(Code Complete)一书,在代码测试阶段进行错误检测的成本是在代码设计(编码)阶段进行错误检测的十倍:

图1.纠正缺陷的平均成本取决于缺陷的出现时间和在代码中的检测时间(表中数据摘自S. McConnell的“ Code Complete”一书)

图1.纠正缺陷的平均成本取决于缺陷的出现时间和在代码中的检测时间(表中数据摘自S. McConnell的“ Code Complete”一书)

静态分析工具允许检测大量错误,这通常是代码设计阶段所要解决的,这大大降低了整个项目开发的成本。 例如,PVS-Studio静态代码分析器可以在编译后立即在后台模式下运行,如果发现潜在错误,则会通知程序员。 有关此模式的更多信息,请参见下文。

PVS-Studio静态代码分析器


PVS-Studio是一种静态分析器,可检测Windows,Linux和macOS平台上C,C ++(其他受支持的扩展名: C ++ / CLIC ++ / CX ),C#和Java中应用程序的源代码中的错误和潜在漏洞。 该分析仪已完美集成到Visual Studio 2010-2019和IntelliJ IDEA IDE中。 在本文中,我们将仔细研究PVS-Studio,以C,C ++和C#语言检查代码。 您可以在此处阅读有关如何使用PVS-Studio在IntelliJ IDEA中检查Java代码的信息

在安装PVS-Studio并将其集成到Visual Studio中之后,用户会在主菜单和用于处理错误消息的窗口中获得一个附加项“ PVS-Studio”:

图2.集成到Visual Studio中时,PVS-Studio分析器添加的主要项目。

图2.集成到Visual Studio中时,PVS-Studio分析器添加的主要项目。

初始设定


分析仪在安装后即可开始工作。 在大多数情况下,您无需为首次运行配置任何内容。 一开始您可能需要的唯一设置是排除第三方库。 您无需修复原始文件(例如jpeg库)中的任何内容,因此无需检查它。 此外,排除不必要的文件夹将加快项目分析的速度。 在此设置目录的例外:PVS-Studio>选项...>不检查文件> PathMasks(请参见图3)。

图3.编辑分析器不会检查的目录列表。

图3.编辑分析器不会检查的目录列表。

如果完整文件名中包含指定的名称之一,则不会对此文件执行分析。 默认情况下,某些目录的名称已包含在列表中。 但是,在您的项目中,具有ZLib库的目录不能称为“ zlib”,而可以称为“ zip_lib”。 因此,应编辑此列表。 要开始编辑,您需要单击三个点的按钮。

PathMasks列表可接受的掩码的示例:

  • c:\ Libs \-将排除此目录及其子目录中的所有文件。
  • \ Libs \或* \ Libs \ *-目录中的所有文件,包含子目录“ Libs”的路径将被排除。 如果未指定符号“ *”,则无论如何它们都会自动添加,因此两个选项相等。
  • Libs或* Libs *-所有文件,其路径包含子目录,该子目录的名称等于或包含'Libs'。 同样在这种情况下,将排除所有名称中包含Lib的文件,例如c:\ project \ mylibs.cpp。 为避免混淆,我们建议始终使用斜杠。

除了排除整个目录外,您还可以设置掩码以排除单个文件。 为此,设置FileNameMasks。 在文档中找到有关如何使用异常列表的更多信息: 设置:不检查文件

项目检查


完成初始设置后,即可开始检查项目。 用于Visual Studio的PVS-Studio支持检查C ++(.vcxproj)和C#(.csproj)项目。 您也可以立即尝试检查包含这些类型的项目的整个解决方案。 为此,选择扩展菜单项扩展> PVS-Studio>检查>解决方案(请参见图4)。

图4.使用PVS-Studio分析仪检查解决方案。

图4.使用PVS-Studio分析仪检查解决方案。

如果检查有困难,我们建议参考我们网站上的“ PVS-Studio:故障排除 ”部分。 这些不是“检查插头是否已插入插座”的愚蠢建议。 本节描述了用户请求的典型情况并提出了建议。

使用诊断消息列表


检查后,所有诊断消息将显示在特殊窗口中。 该窗口具有许多控制组件。 它们全部用于准确显示用户感兴趣的诊断消息。 但是,乍一看,窗口可能看起来很复杂。 让我们看一下所有控件组件(参见图5)。

图5.带有诊断消息的窗口。

图5.带有诊断消息的窗口。

  1. 好吧,这是PVS-Studio窗口。
  2. 附加菜单。 允许您访问选项,例如将警告标记为false,隐藏消息,将文件添加到异常(请参阅以下内容)。
  3. 该按钮启用消息“出了点问题”。 例如,其中一个文件无法进行预处理。
  4. 转到上一条/下一条消息。 这将打开相关文件,并将光标放在有潜在错误的行上。 此外,您始终可以双击从列表中选择诊断。 您可以设置用于切换到上一条/下一条消息的热键 。 默认情况下,它是Alt +'['和Alt +']'。
  5. 包含不同级别警告的按钮。 现在启用前两个诊断级别。 同时,该窗口显示第一级的90条警告,第二级的6700条警告。 消息级别在窗口左侧显示为条带,与匹配级别按钮上的条带颜色相对应。 为什么会有这么多触发因素? 为什么会有6700个警告? 为了演示该接口的功能,启用了一组MISRA规则,这不适用于常规应用程序:)。
  6. 活动的诊断规则集。 常规-常规诊断,优化-微观优化,64位-64位诊断,MISRA-MISRA C和MISRA C ++标准诊断。 现在,所有警告都会显示在窗口中。
  7. 指示器显示警告的数量,标记为“错误”(“错误警报”)。 您可以在设置中启用/禁用标记消息的显示-PVS-Studio>选项...>特定分析仪设置>显示错误警报。
  8. 快速筛选。 例如,您可以将列表缩短为仅包含V501代码的消息以及XYZ项目中的消息。
  9. 一些诊断建议不要将注意力放在某一行上,而应注意几行。 在这种情况下,行号旁边会出现点。 单击它,您可以看到行列表并选择其中之一。

带有诊断消息的表分为以下几列:

  • 等级 确定性级别,表明发现了错误而不是代码气味。 1级(红色)显示最可疑的地方。 级别3(黄色)可能是代码中不必要的错误。
  • 星号 它没有特定的目的。 用户可以根据需要对其进行解释。 例如,用户可以标记最有趣的警告,以进行进一步的仔细分析。 类比是诸如Thunderbird或Outlook之类的邮件客户端中电子邮件的星级标记。
  • 编号 唯一的消息号。 在处理大量列表时可能很有用。 例如,您可以转到带有特定号码的消息(请参阅上下文菜单中的“导航到ID ...”)。
  • 代号 消息代码。 如果单击它,将打开描述警告的页面。
  • CWE。 允许您通过CWE(通用弱点枚举)代码识别警告。 单击链接时,您可以在网络中看到此CWE的描述。
  • 米斯拉 与上述相同,但适用于MISRA标准
  • 留言内容 诊断消息的文本。
  • 专案 项目名称(您可以使用上下文菜单禁用此列)。
  • 档案文件 文件名
  • 线 行号。 重要! 请注意,某些行以点结尾。 例如:“ 123(...)”。 通过单击此数字,您将获得与此消息相关的所有代码行的列表。 同时,您可以转到列表中的每一行。

是的,阅读所有内容都很累。 但是,我向您保证,在开始使用它之后,您将很快习惯该工具。 而且,您很少会单击某些内容进行设置。

上下文菜单


因此,通过双击消息,您可以转到相关的代码段。 通过单击鼠标右键,上下文菜单打开。

菜单非常简单,我不会在每个项目的描述中弄乱文章。 如果不清楚,可以查看文档。

不过,我想谈谈一项非常有用的功能。 您还记得在设置中可以添加要排除的文件夹/文件吗? 事实是,添加内容要比看起来简单得多!

请注意菜单选项“不要检查文件,并隐藏所有来自...的邮件”。 当您单击它时,您将获得可以添加到异常的路径的列表(请参见图6)。

图6.从检查中排除文件。

图6.从检查中排除文件。

您可以选择一个单独的文件或目录之一。 图片显示已选择文件夹“ SDL2-2.0.9 \ src \触觉\窗口”。 这意味着该文件夹中的所有文件以及所有子文件夹都将从分析中排除。 此外,与这些文件相关的所有消息将立即从列表中消失。 很方便 您无需重新启动分析即可删除与测试有关的所有消息。

增量分析模式


如果我们隐藏最重要的功能之一- 增量代码分析 ,那么PVS-Studio的介绍将是不完整的。

越早发现错误,消除错误的成本就越低。 最好的选择是立即突出显示已编辑程序文本中的错误。 然而,这在技术上是困难的并且是资源密集的。 这就是为什么在成功编译固定代码后,PVS-Studio在后台模式下运行的原因。 这样,您可以在刚刚更改的代码中查找错误。 系统通知区域中的图标表示分析正在运行。

发现错误时,将显示一个弹出窗口,警告危险(请参见图7)。

图7.弹出消息,报告已在可编辑文件中找到可疑位置。

图7.弹出消息,报告已在可编辑文件中找到可疑位置。

如果单击该图标,则将打开IDE,并带有项目检查的结果(请参见图2),然后可以挖掘可疑的代码片段。

实际上,尝试以这种方式工作比描述它要容易。 您像以前一样编写代码。 需要时,分析仪会打扰您。 试一试!

我们一直在使用此模式。 是的,有时我们还会出现编码错误。 立即修复它们的能力大大减少了检测缺陷和试图了解程序为什么不按预期运行的时间。 花15到20分钟进行调试以最终在索引中找到一个错字是非常令人沮丧的。 这是在代码中出现PVS-Studio之后立即在PVS-Studio中发现错误的情况之一:

if (in[0] == '\\' && in[1] == '.' && in[1] == '\\') { in += 2; continue; } 

好吧,最有趣的还没到。 PVS-Studio分析仪有时可能比这有用得多。 这是有关分析仪的评论之一:“ 用户使用分析仪的体验 ”。 文字使我感到奇怪。

让我总结一下。 绝对应该尝试增量分析。 在新的代码中发现一些错误之后,您就会爱上它。

PVS-Studio功能


简而言之。 简明扼要地描述PVS-Studio中可用的所有诊断程序是不可能的。 诊断的完整列表及其详细描述可在文档中找到: 检测到的错误的描述 。 我们来看一下按类型对诊断进行分组的表。 一些诊断程序不止一组。 事实是分类是相当正式的。 例如,输入错误可能会导致使用未初始化的内存。 相反,某些错误可能不适合任何组,因为它们太具体了。 但是,此表提供了有关静态代码分析器功能的见解。

图8. PVS-Studio功能。

图8. PVS-Studio功能。

如您所见,分析器在寻找复制粘贴错误等领域特别有用。 它非常适合检测与代码安全性相关的问题。

要查看运行中的这些诊断,请查看错误基准 。 我们收集发现的所有错误,并使用PVS-Studio检查各种开源项目。

SAST


PVS-Studio是静态应用程序安全性测试工具。 分析器可以检测项目代码中的潜在漏洞,并在特定分类中显示适当的错误标识符。

PVS-Studio支持以下错误分类:

  1. CWE
  2. SEI证书
  3. 米斯拉

您可以通过分析器窗口中的上下文菜单,通过路径“显示列”>“ CWE”来启用CWE代码显示

图9. Context菜单和CWE输出示例。

图9. Context菜单和CWE输出示例。

或在主菜单中(扩展> PVS-Studio>在“输出”窗口中显示CWE代码)

图10.扩展菜单。


图10.扩展菜单。

MISRA诊断在设置中分别启用:

图11.检测到的错误列表。


图11.检测到的错误列表。

您可以在此处阅读有关这些分类的更多信息。

从命令行检查项目


PVS-Studio_Cmd.exe-用于从命令行检查C ++ / C#Visual Studio项目(.vcxproj / .csproj)和.sln解决方案的实用程序。 自动化分析可能很有用。 该程序位于进行安装的目录中-默认情况下为“ C:\ Program Files(x86)\ PVS-Studio”。

该程序有很多参数 ,但是首先我们只需要其中三个:

  • --target:需要检查的项目或解决方案文件。
  • --output:需要在其中写入报告的plog文件。
  • --progress:显示检查进度。

运行结果如下所示:

图12. PVS-Studio_Cmd.exe程序的输出。


图12. PVS-Studio_Cmd.exe程序的输出。

运行之后,我们将获得一个带有报告的plog文件,该报告是我们在运行选项中指定的路径。 您可以使用PlogConverter.exe实用程序将该报告转换为其他格式。 要在IDE中查看报告,请在查找器中双击一个plog文件。

您也可以通过扩展> PVS-Studio>打开/保存>打开分析报告...的路径在扩展菜单中打开报告文件。

图片4


有关实用程序及其参数的详细信息,请参见文档

误报抑制


分析仪发出的某些消息不可避免地会是错误的。 我们对此无能为力。 静态分析器只是一个没有人工智能的程序,无法查明它是否是真正的错误。

为了对抗误报,分析仪提供了一组不同的机制。 在文档的以下各节中将对它们进行详细说明:

  • 微调
  • 一种粗略的方法,仅允许您使用与新代码或已修改代码有关的警告。

结论


当然,我们并没有告诉您有关该工具的所有信息。 如果我告诉您所有内容,那么本文将变成文档。 目的是说明在Visual Studio环境中使用该工具有多么容易。 您可以在我们网站上的文档和其他文章中了解其他环境和工作方式。 顺便说一下,程序员有很多有趣的事情。 过来闲逛。

值得注意的是,PVS-Studio不仅可以在Microsoft环境中运行。 我们还支持Java语言,我们可以在Linux和macOS上工作,可以集成到CMake中等等。 您可以在文档中找到更多信息

祝您没有错误的错误代码,并希望您喜欢PVS-Studio。 如有任何疑问,我们将始终提供帮助并提供建议。 写信给我们

附加链接:


  1. 代码审查
  2. 静态代码分析
  3. 静态代码分析工具
  4. SAST
  5. PVS-Studio分析仪中使用的技术
  6. 下载并尝试使用PVS-Studio。
  7. Visual Studio 2019支持
  8. 为您的团队讨论PVS-Studio分析仪的价格以及如何购买: 购买PVS-Studio
  9. 使用静态分析仪的示例
  10. 回答会议上经常提出的问题。
  11. 如何运行PVS-Studio Java
  12. 如何在Linux和macOS上运行PVS-Studio

Source: https://habr.com/ru/post/zh-CN458068/


All Articles