我们的许多文章专门讨论任何内容,但不涉及PVS-Studio工具本身。 但是我们做了很多事情,以使开发人员可以方便地使用我们的工具。 但这恰恰是幕后花絮。 我决定解决此问题,并讨论Visual Studio的PVS-Studio插件。 如果您使用的是Visual Studio,那么本文适合您。
什么是静态代码分析,为什么需要它
静态代码分析是识别程序源代码中的错误和不足的过程。 静态分析可以被视为自动化的代码审查过程。 协作式
代码审查是一种很棒的方法。 但这也有一个明显的缺点-高成本。 有必要定期召集几个程序员来审查新代码或在提出建议后重新审查代码。
一方面,我想定期检查代码。 另一方面,它太贵了。 权衡是静态代码分析工具。 他们孜孜不倦地处理程序的源代码,并向程序员提供建议,以增加对代码某些部分的关注。 当然,该程序并不能代替对一组程序员执行的代码的完整检查。 但是,收益/价格比使得使用静态分析对许多公司来说都是非常有用的做法。 如果读者对特定数字感兴趣,那么我建议您熟悉“
PVS-Studio ROI ”一文。
有大量的商业和免费的静态代码分析器。 Wikipedia上提供了大量静态分析器:
静态代码分析工具列表 。 存在静态代码分析器的语言列表也很多(C,C ++,C#,Java,Ada,Fortran,Perl,Ruby等)。 自然,我们将向您介绍
PVS-Studio分析仪。
静态分析的主要优点是可以大大减少消除程序缺陷的成本。 越早发现错误,修复该错误的成本越低。 因此,根据麦康奈尔(McConnell)的“完美代码”一书中提供的数据,在测试阶段纠正错误的成本将比在构造(编写)阶段高出十倍:
图1.修复缺陷的平均成本,取决于引入和发现缺陷的时间(该表的数据来自S. McConnell的“ Perfect Code”书)。静态分析工具使您可以在设计阶段识别大量错误,从而大大降低了开发整个项目的成本。 例如,PVS-Studio静态代码分析器可以在编译后立即在后台启动,如果发现潜在错误,它将通知程序员。 有关此模式的更多信息将在下面描述。
PVS-Studio静态代码分析器
PVS-Studio是一种静态分析器,可识别Windows,Linux和macOS平台上C,C ++(还支持扩展名:
C ++ / CLI和
C ++ / CX ),C#和Java的应用程序源代码中的错误和潜在漏洞。 该分析仪与Visual Studio 2010-2019和IntelliJ IDEA完美集成。 在本文中,我们将仔细研究PVS-Studio在C,C ++和C#中检查代码的工作。 您可以在
此处阅读有关如何使用PVS-Studio在IntelliJ IDEA中测试Java代码的
信息 。
安装PVS-Studio并集成到Visual Studio之后,用户会在主菜单和用于处理诊断消息的窗口中收到一个附加的“ PVS-Studio”项(请参见图2)。
图2.在集成到Visual Studio的过程中,PVS-Studio分析仪添加的主要元素。初始设定
安装后,分析仪已准备就绪,可以进行操作。 在大多数情况下,您无需配置任何内容即可完成首次运行。 一开始您可能需要的唯一设置是排除第三方库。 毕竟,您仍然不会编辑源文件中的任何内容,例如jpeg库,因此无需检查它。 此外,排除额外的文件夹将减少项目的分析时间。 在此设置排除分析的目录:PVS-Studio>选项...>不检查文件> PathMask(请参见图3)。
图3.编辑分析器不会检查的目录列表。如果指定的名称之一在文件的完整路径中,则将不执行分析。 默认情况下,某些目录的名称已包含在列表中。 但是,在您的项目中,带有ZLib库的文件夹可能不会称为“ zlib”,而是例如“ zip_lib”。 因此,您应该编辑此列表。 要开始编辑,请单击带有三个点的按钮。
PathMasks列表的有效掩码的示例:
- c:\ Libs \-将排除此文件夹及其子文件夹中的所有项目文件。
- \ Libs \或* \ Libs \ *-排除目录中包含Libs子文件夹的路径中的所有文件。 如果未指定“ *”字符,它们仍将自动添加,因此两个录制选项都相同。
- Libs或* Libs *-将排除所有文件,该文件的路径包含一个以'Libs'作为名称或名称片段的子文件夹。 同样在这种情况下,名称中包含Lib的文件也将被排除,例如c:\ project \ mylibs.cpp。 为避免混淆,我们建议您始终使用斜杠。
除了排除整个文件夹之外,您还可以指定掩码以排除单个文件。 为此,有一个FileNameMasks设置。 有关如何使用排除列表的更多详细信息,请参阅文档:
设置:不检查文件 。
项目验证
完成初始设置后,您可以开始检查项目。 PVS-Studio for Visual Studio支持检查C ++(.vcxproj)和C#(.csproj)项目。 您也可以立即尝试签出包含全部此类项目的解决方案。 为此,选择菜单项扩展> PVS-Studio>检查>解决方案(请参见图4)。
图4.使用PVS-Studio分析仪进行溶液验证。如果验证有任何困难,建议您参考我们网站上的“
无法验证? ”部分。 这些并非毫无意义的“检查插头是否已插入”插座。 本部分介绍了用户与我们联系的典型情况以及建议的操作选项。
使用诊断消息列表
检查后,所有诊断消息将显示在特殊窗口中。 一个窗口有很多控件。 它们全部用于准确显示用户感兴趣的那些诊断消息。 但是,起初,窗口可能看起来很复杂。 让我们看一下所有控件(参见图5)。
图5.带有诊断消息的窗口。- 实际上,是PVS-Studio窗口。
- 附加菜单。 允许您访问以下选项,例如:将警告标记为false,隐藏消息,将文件添加到异常(更多信息请参见下文)。
- 该按钮包含消息“出了点问题”。 例如,您不能预处理其中一个文件。
- 转到上一条/下一条消息。 这将打开相应的文件,并将光标放在有潜在错误的行上。 您也可以始终通过双击从列表中选择诊断。 您可以分配热键以跳至上一条/下一条消息。 默认情况下,它们是Alt +'['和Alt +']'。
- 包含不同级别警报的按钮。 现在包括了诊断的前两个级别。 同时,窗口中显示90个第一级警告和6700个第二级警告。 消息级别以与相应级别按钮上的条形颜色相对应的条形形式显示在窗口的左侧。 为什么会有这么多积极因素? 6700警告来自何处? 为了演示该接口的功能,包括了一组MISRA规则,这对于普通应用是禁忌的:)。
- 活动的诊断规则集。 通用-通用诊断,优化-微优化,64位-64位诊断,MISRA-MISRA C和MISRA C ++标准诊断。 现在,该窗口显示所有类型的警报。
- 显示标记为“错误警报”的消息数。 您可以在设置(PVS-Studio>选项...>特定分析仪设置>显示错误警报)中启用/禁用标记消息的显示。
- 快速筛选。 例如,您可以在列表中仅保留代码为V501且在XYZ项目中的消息。
- 一些诊断建议不要将注意力放在某一行上,而应注意几行。 在这种情况下,行号旁边会出现一个省略号。 通过用鼠标单击它,您可以看到行列表并选择其中之一。
带有诊断消息的表分为以下几列:
- 等级 发现错误的可靠性级别。 1级(红色)-最可疑的地方。 第三(黄色)级别-最有可能是代码中的次要错误。
- 星号 她没有特定的目的。 用户可以自行决定对其进行解释。 例如,他可能会指出最有趣的警告,以进行进一步的仔细分析。 类推是在电子邮件程序(例如Thunderbird或Outlook)中用星号标记字母。
- 编号 唯一的消息号。 在处理大量列表时可能会派上用场。 例如,您可以转到带有特定编号的消息(请参阅上下文菜单中的“导航到ID ...” 项 )。
- 代号 讯息码 如果用鼠标单击,将打开一个警告说明页面。
- CWE。 使用CWE (通用弱点枚举) 代码标识警告。 通过单击链接,您可以在网络上看到此CWE的描述。
- 米斯拉 与上述相同,但仅适用于MISRA标准 。
- 留言内容 诊断消息的文本。
- 专案 项目名称(您可以使用快捷菜单禁用此列)。
- 档案文件 文件名
- 线 行号。 重要! 请注意,在某些行之后有一个省略号。 例如:“ 123(...)”。 通过单击此数字,您将获得与此消息相关的所有代码行的列表。 在这种情况下,可以转到列表中的每一行。
是的,阅读所有这些都很累。 但是,我向您保证,在开始使用该工具时,您会很快熟悉该工具。 而且您很少会按任何东西进行配置。
上下文菜单
因此,通过双击消息,您将转到所需的代码片段。 通过按鼠标右键,上下文菜单打开。
菜单非常简单,您不应该在文章中添加每个项目的描述。 如果不清楚,可以查看文档。
但是,我想谈谈一项非常有用的功能。 请记住,在设置中,您可以添加要排除的文件夹/文件(请参见图2)。 因此,添加东西比听起来容易得多!
请注意“不要检查文件并隐藏来自...的所有消息”项。 单击它时,可以添加路径列表,可以将其添加到异常中(参见图6)。

图6.从扫描中排除文件。您可以选择一个文件或一个目录。 该图显示已选择文件夹“ SDL2-2.0.9 \ src \触觉\窗口”。 这意味着该文件夹中的所有文件以及所有子文件夹都将从分析中排除。 此外,与这些文件有关的所有消息将立即从列表中消失。 很舒服 您无需重新启动分析即可删除所有与测试相关的消息。
增量分析模式
如果您不谈论最重要的功能之一-
增量代码
分析,那么PVS-Studio的介绍将是不完整的。
发现错误的时间越早,修复该错误的成本就越低。 理想的是立即强调程序的编辑文本中的错误。 然而,这在技术上是困难的并且是资源密集的。 因此,PVS-Studio在成功编译更正后的代码时会在后台启动。 因此,在刚修改的代码中搜索错误。 可以通过系统通知区域中的图标来判断是否正在进行分析。
当发现错误时,将弹出一个警告该危险的窗口(请参见图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)。
图8. PVS-Studio功能。如您所见,分析器在诸如搜索由于错别字,复制粘贴而发生的错误等区域中尽可能多地表现出来。 它诊断与代码安全性相关的问题。
通过查看
错误数据库,您可以找出所有这些在实践中是如何工作的。 我们在数据库中收集了通过检查各种开源项目发现的所有错误。
SAST
PVS-Studio是用于静态应用程序安全测试(SAST)的工具-分析仪可以识别项目代码中的潜在漏洞,并以某种分类显示相应的错误标识符。
PVS-Studio支持以下错误分类:
- CWE
- SEI证书
- 米斯拉
您可以使用分析器窗口中“显示列”>“ CWE”下的上下文菜单启用CWE代码的显示。
图9.上下文菜单和CWE代码输出示例。或在上方菜单中(扩展> PVS-Studio>在“输出”窗口中显示CWE代码)
图10.扩展菜单。MISRA诊断单独包含在设置中:
图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程序的输出执行后,我们将获得一个包含报告的plog文件,该文件是我们在启动选项中指定的路径。 可以使用PlogConverter.exe实用程序将该报告转换为其他格式,并且要在IDE中查看该报告,只需在资源管理器中双击plog文件即可。
您也可以在扩展菜单中的扩展> PVS-Studio>打开/保存>打开分析报告...下打开报告文件。
有关实用程序及其参数的详细信息,请参见
文档 。
制止错误警告
分析仪发出的某些消息不可避免地会是错误的。 对此无能为力。 静态分析器只是一个没有人工智能的程序,无法准确确定它是否发现了真正的错误。
为了消除误报,分析仪提供了一组不同的机制。 在文档的以下部分中对它们进行了详细描述:
结论
当然,这里我们并没有全面介绍该仪器。 如果您告诉了一切,那么本文将变成文档。 目的是说明在Visual Studio环境中使用该工具有多么容易。 您可以在我们
网站上的文档和其他文章中了解其他环境和操作模式。 顺便说一下,那里有很多有趣的东西供程序员使用。 到处走走。
应该注意的是,PVS-Studio不仅可以在Microsoft的环境中工作。 我们还支持Java语言,我们可以在Linux和macOS下工作,集成到CMake等。 有关更多信息,请参见
文档 。
祝您没有代码,并希望您喜欢PVS-Studio。 如果您有任何疑问,我们将始终为您提供帮助。
写信给我们 。
其他资源:
- 代码审查
- 静态代码分析 。
- 静态代码分析工具 。
- SAST 。
- PVS-Studio分析仪中使用的技术 。
- 下载PVS-Studio并尝试一下。
- 支持Visual Studio 2019 。
- 为您的团队讨论PVS-Studio分析仪的价格以及如何购买: 购买PVS-Studio 。
- 使用静态分析器的示例 。
- 会议上常见问题的答案 。
- 如何启动PVS-Studio Java
- 如何在Linux和macOS上运行PVS-Studio

如果您想与讲英语的人分享这篇文章,请使用翻译链接:Sergey Larin。
PVS-Studio for Visual Studio