您的位置:首页 > 编程语言

阐述静态代码分析方法及其优点和缺点

2012-03-14 09:40 447 查看
静态代码分析是检查软件源代码中错误和瑕疵的过程。静态分析可以被视为自动化代码审查过程。现在,让我们来谈谈代码审查。

  代码审查是检查瑕疵的最古老和最安全的方法。它校验源代码的连接注意点,并就如何改善提出建议。这个过程会揭露可能导致将来出现更大错误的代码错误或代码片段。程序的执行算法应当直接从程序文本和评论中移除。如果情况并非如此,那么这段代码就需要改良。



  code_review

  代码审查往往能够起到很大的作用,因为程序员通常会忽视自己所编写代码中的错误。要了解更多有关代码审查方法的信息,推荐看下Steve McConnell编写的《Code Complete》。

  连接代码审查方法的唯一劣势在于其超高的成本,你需要定期聚集多个程序员来审查新代码或重新审查应用过推荐修改方法的代码。程序员也需要定期休息,因为短时间审查大量代码片段会让他们的注意力迅速衰退。如果在疲劳状态下工作,那么代码审查就毫无作用了。

  对于这种方法,一方面你需要定期审查代码,另一方面成本又过于昂贵。于是,静态代码分析工具成了种折中的解决方案。它们能够不知疲倦地审查程序的源代码,向程序员建议应当考虑修改的代码片段。当然,程序永远也无法完全替代由程序员团队开展的代码审查,但是使用率和成本使得静态分析成为许多公司的宠儿。

  静态代码分析软件可以处理的任务分为以下3类:

  1、检查程序中的错误。我们将在下文深入探讨这个方面。

  2、提出代码格式建议。某些静态分析器可以检查源代码是否符合公司所采用的代码格式标准,比如各种结构中的缩进树木、控制和标签的使用等。

  3、指标计算。软件指标可以数值化衡量软件及其规格的某些资产。使用某些工具可以计算出许多种不同的指标数值。

  静态代码分析工具还可以用来实现其他目标。比如,静态分析可以用作控制和教授那些不够熟悉公司编程规则的新员工的方法。

  现在有许多付费和免费的静态代码分析器。维基百科网站“List of tools for static code analysis”页面上就有个庞大的静态分析器列表。静态代码分析器所支持的语言也很多(注:包括C、C++、C#、Java、Ada、Fortran、Perl和Ruby等)。

  与任何其他的错误检查方法一样,静态分析也存在优点和缺点。你应当能够理解,世界上没有理想的软件测试方法。在不同软件类别中使用不同方法能够得出不同的结果。只有结合使用各种方法才能让你的软件质量达到最高。

  静态分析的主要优点是,它使消除软件瑕疵的成本大幅减少。错误发现得越早,修改所需的成本越小。根据McConnell所著《Code Complete》中提供的数据,在测试阶段修正错误所付出的成本比代码编写阶段多出10倍:



  Time Detected

  图1 开发各阶段修正瑕疵的平均成本(注:表格数据来源于McConnell所著《Code Complete》).

  静态分析让你可以迅速在编程阶段检查出大量错误,显著减少整个项目的开发成本。比如,PVS-Studio静态代码分析器能够在编辑完成后于后台运行,将潜在错误告知程序员。

  静态代码分析还有如下优点:

  1、全代码覆盖。静态分析器甚至会检查那些很少获得控制的代码片段。在使用其他方法时,这些代码片段往往不会被纳入测试范围。使用这种方法,你就可以找到例外处理程序或登录系统中的瑕疵。

  2、静态分析无需依赖你正在使用的编译器和被编译程序的执行环境。这使你可以察觉到某些可能经过数年时间才能表现出来的隐藏错误,比如那些未定义的行为错误。当转换到其他编译器版本或使用其他代码优化开关时,此类错误才会表现出来。

  3、你可以轻易快速地检查出输入错误和复制-粘贴的使用情况。通过其他方法来检查这些错误往往会浪费过多的时间和精力。如果你花了1个小时的时间来调试,发现的只是表达为“strcmp(A, A)”的错误,那着实令人深感惋惜。人们在讨论典型错误时往往会遗忘此类问题。但是实践表明,检查这样的错误需要耗费大量的时间。

  静态代码分析的劣势

  1、静态分析对内存泄露和并发错误的诊断较差。要检查此类错误,你需要虚拟化执行部分程序。执行是件很困难的事情。此类算法需要耗费过多的内存和处理器时间。静态分析往往在诊断简单案例时会进行自我限制。使用动态分析工具来检查内存泄露和并发错误会更加有效。

  2、静态分析工具会警告你碎片的存在。事实上,代码是正确的。这种现象称为误报。只有程序员才能理解分析器报告的是真正的错误还是误报。审查误报是必要的,这需要耗费一定的时间和精力,而且会影响解决那些真正存在错误的代码片段的注意力。

  静态分析器检查出的错误是多种多样的。有些分析器专注于某个区域或某种类型的瑕疵,有些支持某些编程标准,比如MISRA-C:1998、MISRA-C:2004、Sutter-Alexandrescu Rules和Meyers-Klaus Rules等。

  静态分析领域正在繁荣发展,新的诊断规则和标准不断产生,同时某些规则被废除。这也正是为何以所检查瑕疵为标准来比较分析器毫无意义的原因所在。比较工具的唯一方法是将其运用到真正的项目中,计算它们找出的真实错误数量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: