静态分析工具日益强大

静态源码分析工具已经从简单的语法检查器发展成强大的工具,可以用来发现在大规模代码库的复杂交互中所产生的缺陷。直到最近,它们仍被质量保证人员用来在接近项目完成的综合创建期间评估代码。

最新发布的产品正在将这些工具的作用向开发流程的早期阶段推进,以便帮助开发者在软件错误蔓延前的更早期将其检测出来。Klocwork公司的Insight和GrammaTech公司的CodeSonar Enterprise都能满足开发人员的需要,即使在许多代码段还缺失的情况下也能发挥作用。

软件开发人员通常采用两种工具来自动检测他们代码中的错误。一种是动态分析工具,可以在代码执行过程中查看代码;另一种是静态分析工具,通过算法检查代码的错误。这两种工具各有优缺点。

动态分析擅长于发现运行时错误,如资源泄漏和动态存储讹误。开发人员可信赖动态分析工具所报告的任何错误都是真实的,因为这些错误是在实际代码执行期间被发现的。

但为了高效地使用动态分析,代码必须被全面执行,因此需要使用测试案例。这样,动态分析工具在寻找错误方面的效率就取决于测试案例的质量。另外,由于动态分析工具是与运行软件一起工作的,因此只能在开发过程的晚期阶段起作用,此时代码已经完全编好并首次被整合。

静态分析工具使用算法技术检查源代码中的错误,并标明问题区域,以便编程人员做更详细的检查。这种算法方式无需使用测试案例,算法本身决定了分析工具发现错误的效率。不过,这种方法存在识别失误的可能性:有可能标记为错误的代码事实上是可以正确执行的。如果它们产生太多的错误时别,用工具供应商术语而言就是低“准确性”,静态工具就会影响用户开展后续工作,并有可能掩盖真正的错误。

这两种工具呈互补的关系,各自都擅长于发现对方很难发现的错误,但动态分析工具似乎在开发人员中更加普及。部分原因是早期的静态分析工具更像是开发人员用来寻找相对简单的编码和格式错误的语法检查器。

然而在过去十几年中,随着研究人员开发出更加高效的算法,静态分析工具变得越来越强大。它们已经能够识别出大量的微小错误(见表1),其中有许多错误只在抢先多任务环境中的任务交织期间表现为执行问题。

表1:可被静态源代码分析工具发现的典型错误

上述新的静态分析工具额外的好处之一是:它们拥有增强的能力,可以发现代码中有可能被恶意用户用来突破安全防护的缺陷。开发人员很容易低估软件安全缺陷,因为他们只是指望代码能正常执行。静态分析工具的算法没有预期性,只是一种规程,因此会不带偏见地识别潜在的问题。

向开发早期推进

直到最近,静态源代码分析工具还只是用于开发过程的晚期,即开发人员能够完整访问所有代码段的综合构建阶段。然而许多新推出的工具,包括Klocwork公司的Insight和GrammaTech公司的CodeSonar Enterprise,都已经通过性能的增强使得开发者在代码编写的过程中使用这种静态分析工具。

这种新一代静态源代码分析工具利用企业级软件开发环境,整合了从事同一项目不同部分的开发团队的成果(见图1)。通过实现代码段分析扫描方面信息的对等交换,这种工具可以收集到精确检测错误所需的范围更广的语境。


图1:新的静态源代码分析工具可以通过收集中心数据库中个别代码段的数据、建立系统性观点来最大化效率

这种更广范围的语境,再加上为遗失的代码自动建模,就可以帮助开发人员快速建立有效可靠的代码检查基础,即使当时项目还没有全部完成。在这个阶段捕捉到的错误比开发过程晚期的错误更容易修正,代价也较低。另外,较早捕捉错误可以防止这些错误在系统中扩散进而影响后期开发的代码行为。

然而,在早期使用这种静态分析有个前提,即充分理解局部查看代码所引起的局限性。“重要的是记住在软件开发的早期阶段,工具是不够精确的,并可能忽略了程序间的影响。”GrammaTech公司工程副总裁Paul Anderson提醒道。

但Anderson补充道,随着被分析代码规模的增长,结果将有所改善。经常较早地使用静态分析工具,还有助于培养开发人员发现他们个人编码风格的缺点,并改变他们的编程方式以便防止重复发生相同类型的错误。

由于这种新一代工具被整个项目开发团队所使用,他们可以记录分析结果的变化规律,从而帮助识别新的问题。例如Klocwork公司的Insight可以保存每次分析过程产生的数据,从而让开发人员在整个开发过程中跟踪标示出的错误,该公司首席技术官Gwyn Fisher表示。

该工具还允许授权的高级开发人员将错误标示为伪错误或不相关错误,Fisher补充道,这样,在随后的分析操作中就不会再报告它们。这将有助于开发人员集中精力处理真正的错误,并使任何新引入的错误更加明显,或者在交互代码部分被一起分析时发生的错误更加突出。

何时采用静态工具?

在开发过程中要多么早和多么频繁地使用静态代码分析工具?这取决于具体的项目情况。“不同团队可以接受不同等级的伪错误。”GrammaTech公司的Anderson表示,“安全性非常关键的项目可能容忍10:1的假:真错误报告率,而其它项目50:50的比率就有问题,因为跟踪伪错误非常浪费时间。”

Klocwork公司的Fisher指出,“有些用户可能从第一天就开始使用分析工具,此时工具的作用表现的相对较弱,他们能够容忍过多的伪错误。其它用户则宁愿等待架构全部开发好再使用工具,即使那时缺陷密度会比较高。”

最后,项目组必须自己决定如何平衡在开发过程早期发现伪错误的成本和在开发过程晚期发现和修正错误的成本之间的关系。但无论如何要选用静态分析工具,因为这些工具已被事实证明在发现代码缺陷和安全弱点方面具有极高的价值。既然这些工具已经交付到开发人员手中,缺陷可以被尽早发现,那么静态源代码分析工具也将有助于降低开发成本。(end)

 

作者:Richard A. Quinnell    来源:电子工程专辑

你可能感兴趣的:(静态)