静态代码分析是检测软件源代码中的错误和缺陷的过程。
静态分析可以被视为一种自动化的代码审查过程。现在,我们来谈谈代码审查。
代码审查是检测缺陷最古老、最安全的方法之一。它涉及对源代码进行联合细致的阅读,并就如何改进代码提出建议。这个过程会揭示错误或可能在未来变成错误的 कोड 片段。人们还认为,代码的作者不应该解释某个程序部分是如何工作的。程序执行算法应该直接从程序文本和注释中清晰地看出。如果不是这样,代码就需要改进。
代码审查通常效果很好,因为程序员更容易发现别人代码中的错误,而不是自己代码中的错误。要了解更多关于代码审查方法的信息,请参阅 Steve McConnell 的优秀著作《代码大全》[1]。
联合代码审查方法唯一的重大缺点是价格极其高昂:您需要定期召集几位程序员来审查新的代码,或者在对代码应用了推荐的更改后重新审查代码。程序员也需要定期休息,因为他们一次审查大量代码片段时注意力可能会迅速减弱,这样代码审查就没有意义了。
一方面,您希望定期审查代码。另一方面,这样做成本太高。静态代码分析工具是一种折衷的解决方案。它们可以不知疲倦地处理程序的源代码文本,并向程序员提供关于他/她应该考虑哪些代码片段的建议。当然,程序永远无法取代由程序员团队进行的完整代码审查,但性价比使得静态分析的使用成为许多公司正在采用的一种相当不错的实践。
静态代码分析软件解决的任务可以分为 3 类
- 检测程序中的错误。我们将在后面详细讨论这一点。
- 关于代码格式的建议。一些静态分析器允许您检查源代码是否符合您公司接受的代码格式标准。我们指的是控制各种构造中的缩进数量、空格/制表符的使用等等。
- 指标计算。软件指标是一种度量,可以让你获得软件或其规范的某个属性的数值。有大量各种指标可以通过特定工具进行计算。
还有
其他方法可以使用静态代码分析工具。例如,静态分析可以用作一种控制和培训新员工的方法,这些员工还不熟悉公司的编程规则。
有许多商业和免费的静态代码分析器。维基百科网站包含大量静态分析器的列表:
静态代码分析工具列表。静态代码分析器支持的语言列表也很长(C、C++、C#、Java、Ada、Fortran、Perl、Ruby 等)。
与任何其他错误检测方法一样,静态分析有其优点和缺点。您应该明白,不存在理想的软件测试方法。不同的方法将为不同的软件类别产生不同的结果。只有结合各种方法才能实现软件的最高质量。
静态分析的主要优点是:它使您能够大大降低消除软件缺陷的成本。错误检测得越早,修复它的成本就越低。因此,根据 McConnell 的《代码大全》一书中的数据,在测试阶段修复错误的成本是在代码编写阶段修复错误的十倍。

图 1. 修复缺陷的平均成本随其产生和检测时间的变化(表格数据来自 S. McConnell 的《代码大全》)。
静态分析工具可以帮助您快速检测大量的编码阶段错误,这大大降低了整个项目的开发成本。例如,PVS-Studio 静态代码分析器可以在编译完成后在后台运行,并在存在潜在错误时告知程序员(请参阅
增量分析模式)。
静态代码分析的其他优点如下:
- 完全的代码覆盖。静态分析器甚至会检查那些很少获得控制的代码片段。这些代码片段通常无法通过其他方法进行测试。这使您能够发现异常处理程序或日志记录系统中的缺陷。
- 静态分析不依赖于您使用的编译器以及编译后的程序将执行的环境。它允许您找到可能几年后才显现出来的隐藏错误。例如,这些是未定义行为错误。此类错误可能在切换到其他编译器版本或使用其他代码优化开关时发生。另一个隐藏错误的有趣例子在文章《内存覆盖 - 为什么?》中进行了讨论。
- 您可以轻松快速地检测出拼写错误和复制粘贴使用的后果。通过其他方法检测这些错误通常是效率低下且浪费时间精力的事情。令人遗憾的是,您花费了一个小时进行调试,结果却发现错误是“strcmp(A, A)”之类的表达式。人们在讨论典型错误时通常不记得这些麻烦。但实践表明,检测它们需要很长时间。
静态代码分析的缺点
- 静态分析通常在诊断内存泄漏和并发错误方面表现不佳。要检测这些错误,实际上需要虚拟地执行一部分程序。这很难实现。此类算法需要大量的内存和处理器时间。静态分析器通常仅限于诊断简单情况。检测内存泄漏和并发错误更有效的方法是使用动态分析工具。
- 静态分析工具会警告您一些奇怪的代码片段。这意味着代码实际上可能是正确的。这被称为误报。只有程序员才能理解分析器是否指向了真正的错误,或者仅仅是误报。审查误报的必要性会占用工作时间,并削弱对真正包含错误的那些代码片段的注意力。
静态分析器检测到的错误多种多样。例如,这里是 PVS-Studio 工具中实现的
诊断列表。一些分析器专注于某个特定领域或类型的缺陷,而另一些则支持特定的编码标准,例如 MISRA-C:1998、MISRA-C:2004、Sutter-Alexandrescu Rules、Meyers-Klaus Rules 等。
静态分析领域正在积极发展,新的诊断规则和标准不断出现,而一些规则正在过时。因此,没有必要尝试基于它们可以检测到的缺陷来比较分析器。比较工具的唯一方法是在一系列项目上测试它们并计算它们发现的真实错误的数量。这个主题在文章《
比较代码分析器的困难,或者不要忘记可用性》中有详细讨论。
静态代码分析检测到的错误示例
关于静态分析的误解
参考文献
- Steve McConnell,《代码大全,第二版》,Microsoft Press,平装本,第二版,2004 年 6 月出版,914 页,ISBN:0-7356-1967-0。
- Wikipedia。 静态代码分析。
- Coverity。《数十亿行代码之后:使用静态分析在现实世界中查找 Bug》。
- 作者:Walter W. Schilling, Jr. 和 Mansoor Alam。《将静态分析集成到软件开发流程中》。
- 批评。Mark Dixon。《不使用静态分析的五大理由》。