为什么要选择PVS-Studio静态分析仪以集成到您的开发过程中

为什么要选择PVS-Studio静态分析仪以集成到您的开发过程中

PVS-Studio是用于检测用C,C ++,C#或Java编写的程序的源代码中的错误和潜在漏洞的工具,并且还是静态应用程序安全性测试(SAST)工具。 它旨在用作CI实践的一部分,并允许用户在最早的开发阶段检测错误,而在这些错误中,几乎无需花费任何时间进行修复。

静态代码分析


随着软件项目的发展,它们的规模也在不断扩大。 比较:

  • Linux内核1.0.0:176,000 LOC
  • Linux内核5.0:26,000,000 LOC
  • Photoshop 1.0:128,000 LOC
  • Photoshop CS 6:10,000,000 LOC

随着项目的发展,其复杂性将比线性增长更快。 这解释了为什么错误密度随着代码库的增长而增加 。 弥补日益增长的复杂性的方法之一是使用静态代码分析工具。

静态分析器是一种软件工具,可以执行初步的代码审查并指出很可能包含错误的代码片段。 这使开发人员可以在最早的开发阶段修复最便宜的错误,而这些错误最便宜。

静态分析不会替代-而是补充-其他错误检测实践,例如代码审查,单元测试,动态分析,回归测试,手动测试等。

代码审查为例。 更好的方案是让软件分析器为您找到最琐碎的错误,以便您可以专注于对算法进行更有用的高级检查,而不是弄清比较函数 -而且,由于我们的经验证明,人眼无法注意到许多错误,并且很可能在代码审查期间被忽略。

静态分析工具的另一个优点是广泛的错误模式库。 他们可以找到许多程序员甚至可能不知道的缺陷,例如V698V718V1023

PVS工作室


我们建议选择PVS-Studio,这是我们团队开发的静态代码分析器。 它可以在64位Windows,Linux和macOS系统上运行,并且可以检查32位,64位和嵌入式ARM平台的程序的源代码。

在撰写本文时,分析器支持以下语言和编译器:

  • 窗户 Visual Studio 2010-2019年C,C ++,C ++ / CLI,C ++ / CX(WinRT),C#
  • 窗户 IAR嵌入式工作台,用于ARM C,C ++的C / C ++编译器
  • 窗户 QNX Momentics,QCC C,C ++
  • Windows / Linux Keil µVision,DS-MDK,ARM编译器5/6 C,C ++
  • Windows / Linux 德州仪器Code Composer Studio,ARM代码生成工具C,C ++
  • Windows / Linux / macOS。 GNU Arm嵌入式工具链,Arm嵌入式GCC编译器,C,C ++
  • Windows / Linux / macOS。 Clang C,C ++
  • Linux / macOS。 GCC C,C ++
  • 窗户 MinGW C,C ++
  • Windows / Linux / macOS。 爪哇

该分析仪随附英语和俄语的详细文档 。 诊断规则的描述包括正确和不正确代码的示例。 它们还包括来自真正的开源程序的代码段的链接。

对于将要使用PVS-Studio作为SAST工具的专家 ,诊断将映射到“通用弱点枚举”,“ SEI CERT编码标准”和“ MISRA”标准。 以下是PVS-Studio诊断程序到不同标准的映射表:


该分析仪既可以用作独立工具,也可以用作Visual Studio和IntelliJ IDEA的插件。 最近,我们的一些客户也将PVS-Studio用作SonarQube的一部分。 当用作SonarQube的插件时 ,分析仪会提供其他诊断消息。

我们已经开发了将PVS-Studio与CI系统结合使用的多种方案。 由于观察所有场景不在本文讨论范围之内,因此请参考文档。 以下只是一些链接,可让您大致了解:


PVS-Studio有效地检测到从错别字内存泄漏的各种缺陷。 这要归功于数据流分析,符号执行,模式匹配和方法注释(包括自动注释)。 要了解有关分析器背后工作原理的更多信息,请参见文章“ PVS-Studio代码分析器中使用的技术,以查找错误和潜在的漏洞 ”。

为什么要使用PVS-Studio


将PVS-Studio集成到您的开发过程中将使许多错误的修复成本更低,从而有助于节省时间,您可以将其投入到实施新功能或进行更彻底的高级测试中。

如果定期使用,分析器最终将帮助您提高代码的质量,从而使其更易于维护。 定期修复错误以及编写高质量代码的实践,将使其不易受到零日漏洞的影响。 文章“ PVS-Studio如何帮助检测漏洞? ”中对此主题进行了更详细的讨论。

当由五个或更多成员组成的团队使用PVS-Studio时,最具成本效益。 ROI估算在文章“ PVS-Studio ROI ”中给出。

将PVS-Studio集成到由几个爱好者开发的项目中可能是不切实际的,但是即使是小型项目也可以从中受益-更是如此,因为我们为学生,开源开发人员等提供了免费的许可选项。

我们的新客户通常会购买一年的许可证。 到期后,他们已经对我们的分析仪的功能和用户支持服务感到满意,并且将许可证续期两到三年,这比一年的许可证便宜得多。 您可以在这里索取价格并寻求许可的建议。

成为我们的客户,让PVS-Studio使您的开发过程更加成熟,更便宜的错误修复,以及更好的代码。

反过来,我们将为您提供快速有效的支持。 开发特定模块的程序员将直接解决您的问题。 即使在最复杂的情​​况下,也可以保证得到答案。 这是一个这样的例子:“ PVS-Studio中的误报:兔子洞有多深 。”

回应批评


程序员有时对在其开发过程中包含静态代码分析的想法持否定态度,并且通常批评静态分析方法,尤其是批评PVS-Studio。 当您开始深入研究时,发现他们的批评是没有根据的,仅仅是他们不愿意在既定的开发过程中进行任何更改的产物。 让我们看看不改变他们所处境况的典型论据以及它们的问题所在。

“静态分析将占用您大量的工作时间”


在上下文之外,“静态分析将占用您大量的工作时间”这一说法是正确的。 确实需要花费时间来定期检查分析器针对新编写或修改的代码输出的警告。 但是这个想法需要继续:“但是它将比其他错误检测方法花费更少的时间。”

人们为什么认为检查静态分析仪的报告很费时间?

那些还不熟悉代码分析方法的程序员会混淆一次性测试运行和常规使用。 第一次运行时,任何分析仪都会输出大量警告,且误报率很高。 发生这种情况是因为该工具尚未定制。 调整设置以满足您的确切需求后,如果定期运行分析仪,您将不会看到很多误报。 换句话说,在常规使用中,分析仪的大多数诊断程序将检测出真正的缺陷或气味代码。 您只需要进行调整即可。

关于该主题的文章“ 处理异议:静态分析将占用一部分工作时间 ”。

“静态分析仪会产生过多的噪声(即,过多的误报)”


同样,如果您没有适当地自定义工具,则此语句为true。 在根据需要调整了PVS-Studio的设置后,可以预期误报率将下降到10-20%。 也就是说,在每五个警告中,有四个将指向真正的错误或代码,这些错误或代码很可能在将来成为错误的来源。 文章“ 以EFL核心库为例,PVS-Studio分析仪的特性,误报的10-15% ”显示了分析仪定制的示例。

误解的另一个来源是在不知道诊断确切目的的情况下,尽可能多地打开诊断程序的诱惑。 例如,如果打开专为嵌入式系统设计的MISRA规则集,则在检查经典Windows应用程序时,分析器将生成数十万条警告,这些警告对您没有任何用处。 当您仅使用该工具时,无关的诊断尤其有害,因为您可能会对它的诊断功能有错误的印象。 文章“ 如何快速检查PVS-Studio分析器针对C和C ++代码给出的有趣警告? ”将帮助您避免失望。

“在工作,时间和金钱上将静态分析集成到开发过程中的成本太高”


以下评论生动地说明了这种担忧:

不幸的是,静电分析仪本身仅是玩具。 试图将它们纳入您的日常工作流程中是一项艰巨的工作,并且需要指派一些人员来检查和过滤分析结果。 将这种负担加在普通开发人员上的任何尝试通常都是徒劳的。

这不是那么可怕。 至少有三种方法可以将静态分析平稳地集成到大型旧项目中。

练习1. “ Ratcheting”,这是Ivan Ponomarev在他的文章“ 在过程中引入静态分析,而不只是用它搜索错误 ”中很好地解释的。

练习2.为了帮助我们的用户快速入门,我们建议使用“ 抑制基准 ”。 简而言之,您的想法是您运行分析仪并收到多个警告。 由于该项目已经开发了许多年,并且仍在运行,不断发展且有利可图,因此您不太可能收到许多警告,指出关键缺陷。 换句话说,大多数关键错误已使用其他(更昂贵的)手段或响应用户的反馈进行了修复。 在这种情况下,无论在第一次检查中发现任何错误,都可以将其视为技术债务,急于立即修复是不合理的。

您可以告诉PVS-Studio将这些警告视为无关紧要的(因此将解决技术债务推迟到以后),并且不再显示它们。 分析器将创建一个特殊文件,存储有关当前不相关的错误的信息,并且仅针对新编写或修改的代码输出警告。 该机制非常聪明。 例如,如果您在某个.cpp文件的开头添加一个空行,则分析器将理解此行没有任何区别,并保持沉默。 禁止文件可以受版本控制。 它很大,但是没关系,因为您不需要经常对其进行版本控制。

之后,您团队中的每个程序员都将只收到由新编写或修改的代码触发的警告。 从第二天开始,您将可以在日常工作中使用分析仪。 至于技术债务,您稍后可以解决,并逐步修复错误并根据需要调整分析仪的设置。

练习3.您可以通过与我们签订合同将建立和集成PVS-Studio的任务委托给我们的团队。 文章“ PVS-Studio团队如何改进虚幻引擎的代码 ”中描述了这种做法的一个示例。

“我们运行了分析仪,但没有发现感兴趣的东西”


这种情况是很有可能的,但这仍然并不意味着分析仪将无用。 问题在于,已经使用其他更昂贵的方法发现并修复了这些错误。 这就像将大量校对人员已经检查过的文本输入Microsoft Word一样,以查看其内置的拼写检查是否可以找到任何内容。 它只会发现一些错误(如果有的话),但这并不意味着在编写新文本时Word的拼写检查是没有用的。

在“ 静态代码分析的哲学:我们有100个开发人员,分析器发现了很少的错误,分析器没用吗? ”一文中对此主题进行了更详细的讨论。

“静态分析仪是一种昂贵的工具; 我们最好再雇用一名程序员/测试人员»


这种说法的真正含义是,这个人不想改变任何东西。 毕竟,他们的团队已经成长并雇用了新的程序员和测试人员已有一段时间,但这并没有帮助实现更成熟的开发过程。 话虽如此,我们仍应详细阐述这一论点。

首先,雇用他人进行错误搜索要比购买静态分析仪昂贵得多。 只需计算新员工的年度薪资,然后加上设置新工作区的税金和费用即可。 考虑到得出的数字,关于软件分析仪过于昂贵的论点似乎根本没有论点。 此外,与人类不同,静态分析仪不会休假,请病假或完全离开公司。 对于一个庞大的团队(例如100人),您必须雇用一个新员工而不是雇用一个新员工,才能取得显著成效。 在这种情况下,购买静态分析仪将成为更理想的解决方案。

其次,通过组合使用的各种错误检测技术之间的协同作用,可以获得最佳结果。 通过单元测试可以更好地诊断某些错误,通过手动测试可以更好地诊断其他错误,依此类推。 想象一下,有10个程序员在一个项目上工作,有很多单元测试,但没有一个测试人员。 用户对项目的质量不满意,因此您会雇用一名测试人员,但您这样做并不是因为“我们最好雇用一名额外的程序员,让更多的单元测试!”这不是明智的决定,可以吗? 在这种情况下,质量检查流程显然只有一条腿,只有通过添加手动测试才能受益。 静态分析也是如此。

“动态分析比静态分析更好”


静态分析仪可以更好地诊断某些错误,动态分析仪可以更好地诊断某些错误。 这些类型的工具相互补充 ,因此您不必仅选择一种。

例如,动态分析器无法检测到无法访问的代码以及由错别字引起的许多错误。 文章“ 通过静态分析器检查Valgrind动态分析器的代码 ”中介绍了一些动态分析难以发现的错误类型。

“单元测试胜于静态分析”


如果您要在编写单元测试和使用静态分析之间进行选择,那我说测试将更为重要和有价值。 但是您不必选择; 您应该同时使用单元测试和静态分析。 这些技术可以很好地协同工作。

这是将静态分析与单元测试一起使用的参数:

  1. 测试本身未经测试,并且经常包含错误。 在我们的文章中,我们展示了在真实项目的单元测试中发现的许多错误示例。 静态分析可以在测试中发现错误,而测试又可以在主代码中找到错误。
  2. 用测试覆盖整个代码很困难,尤其是那些涉及异常处理的部分。 与它们不同,静态分析器检查整个代码。
  3. 如果可能的话,通过单元测试很难发现某些错误。 V597(CWE-14)就是这样一个例子。
  4. 某些错误仅在程序处理大量数据时才会出现,因此在单元测试中模拟这种情况是不切实际的。 一个这样的示例是64位程序( V108V127 )中32位变量的溢出。
  5. 如果测试未通过,则通过运行静态分析器比通过调试可以更容易,更快地发现错误。 当然,单元测试会发现更多错误,但是当您可以使用更便宜的技术(即静态分析)来捕获它们时,为什么不这样做呢?
  6. 我们在各种项目中发现大量错误 。 他们中的许多人都被大量测试所覆盖,但是,正如您所看到的,它们并没有太大帮助。 因此,除了单元测试以提高代码的质量和可靠性外,没有理由不应该采用静态分析。

“当代的免费编译器可以发现与PVS-Studio相同的错误”


当然,编译器正在发展并获得新的警告,可以检测错误。 但是,与专业专有解决方案(例如PVS-Studio)相比,您不能指望太多的编译器。

选择PVS-Studio的原因:

  1. 高效的用户支持
  2. 高度发达的基础设施(与其他产品集成)
  3. 强大的诊断能力

前两个原因已经足以将规模推向选择PVS-Studio的地步,但我们也来谈一谈诊断程序。 我们正在不断改进我们的产品,以领先于其他供应商。 例如,我们的工具可以检测到文章“ 2月31日 ”中描述的有趣的错误。

注意上述所有内容还不足以使怀疑者改变主意,因此我们不时检查编译器,以表明它们也存在错误,PVS-Studio可以检测到这些错误:


聚苯乙烯


如果您仍然不确定是否应该使用PVS-Studio,请查看此列表在各种项目中发现错误

参考文献


  1. PVS-Studio: 主页文档下载购买
  2. 支持PVS-Studio的参数: 已检查的项目客户投资回报率
  3. 如何快速检查PVS-Studio分析仪针对C和C ++代码给出的有趣警告?
  4. 简要介绍PVS-Studio作为SAST的解决方案
  5. PVS-Studio:进步的引擎
  6. 致教授的注意:使用PVS-Studio让学生熟悉代码分析工具
  7. 为什么我们不撰写将PVS-Studio与其他静态分析仪进行比较的文章
  8. PVS-Studio如何帮助检测漏洞?
  9. 开发64位C / C ++应用程序的经验教训
  10. PVS-Studio代码分析器中用于查找错误和潜在漏洞的技术
  11. PVS-Studio for Java

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


All Articles