在开发过程中引入PVS-Studio静态代码分析器的原因

在开发过程中约会PVS-Studio静态代码分析器的原因

PVS-Studio是用于在用C,C ++,C#或Java编写的程序的源代码中查找错误和潜在漏洞的工具。 PVS-Studio属于用于静态应用程序安全测试(静态应用程序安全测试,SAST)的工具类别。 该分析仪专注于持续集成(CI)的实践,可让您在修复错误的过程中尽早识别错误。

静态代码分析


软件项目在其开发过程中正变得越来越多。 范例:

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

随着项目规模的增长,其复杂性将比线性增长更快。 因此,随着代码库大小的增加,错误的密度也随之增加。 弥补日益增长的复杂性的一种方法是使用静态代码分析工具。

静态分析器是程序员的辅助程序,可以对代码进行初步检查,并指出更可能包含错误的代码片段。 因此,当修复错误的成本降至最低时,可以在早期纠正许多错误。

静态分析不会替代而是补充其他缺陷检测方法,例如代码审查,单元测试,动态代码分析,回归测试,手动测试等。

例如,如果我们谈论的是代码审查 ,则该程序检测到简单错误会更好。 然后,审查代码的程序员将能够专注于算法的更有用的高级检查,而不会被迫读入比较函数 。 而且,如实践所示,“用眼睛”很难发现许多错误,并且很可能会在未注意到的情况下经历代码审查的阶段。

静态分析工具的另一个优点是存在丰富的错误模式数据库。 他们可以发现程序员甚至可能不知道的问题。 一些示例: V698V718V1023

PVS工作室


我们建议实施在开发过程中开发的PVS-Studio静态代码分析器。 该产品可在Windows,Linux和macOS上的64位系统上运行,并且可以分析用于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工具将非常有益。 您可以在“ PVS-Studio ROI文中熟悉计算分析仪使用效率的方法。

对于由一到两个发烧友开发的项目,PVS-Studio分析仪很可能是多余的。 但是,它也可以用在这样的小型项目中,特别是因为我们为学生,开源项目等提供了几种免费的许可选项。

最开始时, 我们的客户通常会获得一年的许可证。 一年后,当他们确信分析仪的功能及其支持得到完全满足时,他们立即将许可证续期两到三年。 这使他们可以获得很大的折扣。 您可以在这里索取价格并咨询许可问题。

成为我们的客户。 使用PVS-Studio,您将提高开发流程的成熟度,在与bug的斗争中节省资金并创建更好的软件。

我们将为您提供快速,优质的支持。 程序员直接开发问题所在的模块即可直接回答问题。 即使在困难的情况下,这也有助于获得答案。 这种交流的一个例子是“ PVS-Studio中的误报:兔子洞有多深”

异议答复


有时,程序员会否定将静态代码分析引入开发过程的想法,批评静态分析的方法论是一个整体,或者特别是PVS-Studio工具。 当讨论开始时,事实证明,批评并没有得到证实,而仅仅是由于不愿意在既定的发展过程中改变某些东西。 考虑不更改任何内容的典型论点及其弱点所在。

“统计分析将占用工作时间”


与上下文隔离的“静态分析将占用一部分工作时间”这一说法是正确的。 定期检查针对新代码或更改代码发出的静态分析器警告确实需要时间。 但是,这种想法应该继续下去:但是花在这上面的时间远远少于通过其他方法识别错误所花费的时间。

关于花费时间警告静态代码分析器的意见从何而来?

仍然不熟悉代码分析方法的程序员会混淆测试运行和常规使用。 在开始时,任何分析器都会给出大量警告,其中许多警告都是错误的。 原因是尚未配置分析仪。 经过调谐的分析仪在常规发射期间会产生少量误报。 换句话说,在常规使用中,大多数警告会检测到真正的缺陷或气味代码。 进行此设置非常重要。

在“ 处理异议:静态分析将占用工作时间 ”一文中对该主题进行了详细描述。

“静态分析仪非常嘈杂(它会产生很多误报)”


如上所述,该结论是使用未配置的代码分析器得出的。 设置PVS-Studio之后,您可以预期误报的百分比将为10-20%。 也就是说,发出5条警告,其中4条将指示实际错误或将来可能会导致错误的代码。 可以在文章“ 使用EFL核心库示例的PVS-Studio分析仪规格,误报的10-15% ”中看到这种设置的示例

扭曲分析仪概念的另一个原因是希望在不了解其目的的情况下包括尽可能多的警告。 例如,如果为经典Windows应用程序启用了针对嵌入式系统的MISRA规则集,则分析器将生成数十万条警告。 它们中没有任何实际意义。 尤其是不必要的诊断会在熟悉该工具的阶段干扰并形成有关其诊断功能的错误观念。 文章“ 如何快速查看针对C和C ++代码的PVS-Studio分析器的有趣警告? ”有助于避免这种情况。

“将静态分析引入开发过程非常困难,耗时且昂贵”


很好,这些担忧反映在此评论中:

las,静电分析仪本身就是玩具。 将他们引入工作流程是一件艰辛的工作,您需要选择个人来处理和过滤结果。 将这些任务转移到普通开发人员的肩膀上的尝试通常以失败告终。

没那么吓人。 至少有三种方法可以使您即使在大型旧项目中也可以轻松地执行静态分析。

第一种方法。 伊万·波诺马列夫(Ivan Ponomarev)在他的报告“ 连续静态代码分析 ”中很好地讲了“棘轮方法”。

第二种方法。 为了快速开始使用静态分析,我们为PVS-Studio客户提供了使用“ 标记基础 ”的功能。 总体思路如下。 用户启动了分析仪并收到许多警告。 由于已经开发了多年的项目已经存在,可以发展并且可以带来收益,因此报告中很可能不会出现很多警告,表明存在严重缺陷。 换句话说,关键错误已经以一种或另一种方式以更昂贵的方式得到修复,或者要归功于客户的反馈。 因此,分析仪现在发现的所有东西都可以视为技术债务,试图立即消除这种债务是不切实际的。

您可以告诉PVS-Studio将这些警告视为无关紧要的(将技术债务推迟到以后),然后不再显示。 分析器创建一个特殊的文件,在其中存储有关到目前为止不感兴趣的错误的信息。 现在,PVS-Studio将仅在新的或更改的代码上发出警告。 此外,所有这些都可以巧妙地实现。 例如,如果在某个.cpp文件的开头添加了空行,则分析器将理解为实际上没有任何更改,并且将保持沉默。 该标记文件可以嵌入版本控制系统中。 该文件很大,但并不吓人,因为通常放置它没有任何意义。

现在,所有程序员都将看到仅与新代码或更改代码有关的警告。 因此,分析仪可以开始使用第二天的功能。 以后可以再次归还技术债,逐步纠正错误并配置分析仪。

第三种方法。 您可以与我们签订合同,并将建立和集成静态分析的工作委托给我们的团队。 这种做法的一个示例:“ PVS-Studio团队如何改进虚幻引擎代码 。”

“我们启动了分析仪,没有发现任何有趣的东西”


这是完全可能的,但这并不意味着分析仪将无用。 事实是,错误是通过更昂贵的方法纠正的。 这是如何获取已经由多个校对人员阅读的书的文本,以及查看Microsoft Word内置的拼写检查器可以找到的内容的方法。 会发现很少的错误,但是并不能因此而导致Word中的检查功能在编写新文本时不起作用。

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

“静态分析仪价格昂贵,最好再聘请一名程序员/测试人员”


实际上,这意味着您不想更改任何内容。 确实,在团队壮大并补充新的程序员和测试人员之前。 但是,这并未导致开发过程的成熟度显着提高。 尽管如此,让我们更详细地研究这个异议。

首先,要让一个额外的人寻找错误比开始使用代码分析器要昂贵得多。 计算一个人的年薪金。 增加税收和工作场所的安排。 许可证昂贵的争论不再是争论。 而且静态分析仪与人不同,它不去度假,不生病,也不离开。 如果我们谈论的是大型团队,例如100人,那么为了产生效果,您将需要雇用数个人。 支持静态分析仪的差距正在扩大。

其次,由于使用各种错误搜索技术的协同作用,因此可以实现最大的效果。 通过单元测试可以很好地检测到某些错误,而通过手动测试可以很好地检测到这些错误,等等。 想象一下情况。 该项目有10位程序员,编写了许多单元测试,但没有测试员。 该项目的质量不适合用户,其主意是为测试人员提供工作。 但这不是以“最好雇用另一位程序员”为借口完成的,让更多的单元测试! 同意,这是错误的决定。 显然,质量保证过程是单方面的,增加手动测试将带来更大的好处。 静态分析也是如此。

“动态分析比静态分析更有效。”


静态分析仪很好地发现了一些错误。 有些是动态分析器。 这些工具相辅相成 ,选择一件东西毫无意义。

例如,动态分析器找不到很多错字或检测不到代码。 在“ 使用静态分析器验证Valgrind Dynamic Analyzer代码 ”一文中,您可能会遇到其中一些错误。

“单元测试比静态代码分析更有效”


如果您在编写单元测试和静态分析之间进行选择,则测试可能会更重要和有用。 但是没有选择的余地。 有必要同时使用单元测试和静态代码分析。 这些错误搜索方法完美地互补。

静态分析将补充单元测试,原因如下:

  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. 利益证明项目验证客户投资回报率的 示例
  3. 如何快速查看PVS-Studio分析器针对C和C ++代码生成的有趣警告?
  4. 简要介绍PVS-Studio作为SAST解​​决方案
  5. PVS-Studio-进步的引擎
  6. 给老师的提示:PVS-Studio,用于向学生介绍代码分析工具
  7. 我们为什么不写关于将PVS-Studio与其他静态代码分析器进行比较的文章
  8. PVS-Studio如何帮助寻找漏洞?
  9. PVS-Studio和C和C ++开发64位应用程序
  10. PVS-Studio代码分析器中用于搜索错误和潜在漏洞的技术
  11. PVS-Studio for Java



如果您想与说英语的读者分享这篇文章,请使用以下链接:Andrey Karpov。 为什么要选择PVS-Studio静态分析仪以集成到您的开发过程中

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


All Articles