以下文字是根据《
GrammaTech CodeSonar Overview》翻译过来的,该文档可以从GrammaTech公司网站
下载。翻译版作者huior,
转载请务必注明出处。
CodeSonar Enterprise是GrammaTech公司的静态分析工具,可以发现C/C++程序中的错误。CodoSonar Enterprise不需要运行你的代码,就可以在你的程序中发现严重的bug。与编程规则的检查相比,其对程序的整体分析可以检测出更主要的问题,例如缓冲区溢出(buffer overruns)、空指针引用(null pointer dereferences)。CodeSonar很容易配置,因为它不需要修改编译环境。另外,运行CodeSonar不需要用户额外的输入。分析可以扩展到规模很大的项目,它已经被应用到对Linux内核程序的分析,以及客户自己的程序,这些程序的C/C++代码超过了一千万行。借助于GrammaTech CodeSonar,你的团队将能够:
l 在开发过程的早期就可以检测程序中的bugs,从而可以更容易更便宜的修正
l 提高产品的安全性,因为很多被利用的漏洞都是由编码缺陷引起(例如,缓冲区溢出)
l 不再需要调试过程,因为工具可以自动化的分析,精确的指出缺陷的位置
l 缩短产品的上市时间
l 捕获测试用例集遗漏的问题
l 发布更高质量的软件,降至成本,更容易的提供支持。
GrammaTech CodeSonar可以和编译环境无缝的集成,提供了很低的误报率,分析结果很容易理解,基于WEB的用户界面和结果数据库帮助团队成员更方便的浏览和管理缺陷报告。只需要提供源代码,CodeSonar马上就可以检测多种类型的、导致程序崩溃的缺陷。通过定义新的检查器,用户也可以扩展分析的缺陷类型。
GrammaTech公司由威斯康星大学(Wisconsin)的计算机科学教授Tom Reps和科内尔大学的Tim Teitelbaum教授一起成立。公司成员中包括10名语言和编程分析方面的博士级专家。领先的组织,包括NASA, Lockheed Martin, Northrop Grumman, GE Aviation, LG Electronics, SanDisk, Cardinal Health, and the FDA,都在使用GrammaTech CodeSonar来提高软件的质量和降低成本。
本文简单解释了GrammaTech CodeSonar的工作原理和如何使用。
Background on Static Analysis(静态分析的背景)
静态分析技术通过软件的静态属性,推断软件的行为。这和动态分析技术截然相反,动态技术是当软件在运行时收集信息。因为代码只是用来分析,而没有被执行,所以静态分析不需要测试用例。
静态分析可以看作是两个阶段的过程。第一个阶段主要是从软件源代码中提取语义信息,第二个阶段则是分析这些信息,发现缺陷或者其他感兴趣的属性。
直到最近,静态分析的工具的应用还不太现实,大致上可以分为两类。
第一类工具只能够检查代码的表层结构(例如 Lint),它对编程规则的执行和一些表面的检查有用,但在检查各种类型的严重问题上,它还不够强大。类Lint的工具还会产生大量的误报警告,在实际应用中很难去审查工具的所有输出。
另一类工具是非常复杂的模型检查器(model checkers,例如PolySpace)。这些工具能验证系统的先后顺序,但不能直接应用于代码的分析,只能用于由深奥的语言描述的系统抽象模型,并且,从历史观点上说,模型检查的工具总是遇到可扩展性的问题。
现在,出现了新的工具,它扫清了以上提到的障碍,使其可以对大规模的程序进行复杂的分析。
Static-Analysis ROI
静态分析的优势如下:
l 静态分析与传统的测试相比,能够检查更多的执行路径;
l 静态分析可以用于开发过程中更早的阶段。
传统的测试只能检查执行过的代码,但在现实的系统中,测试所能覆盖的路径只占程序中总的路径数的一小部分。测试用例集可能会达到100%的语句覆盖,但大部分的路径没有执行到。相比之下,静态分析工具可以检查测试用例没有覆盖到的路径,这就是为什么静态分析工具在即便是已经做了很多次测试的软件中仍然可以发现很多的bug。好的静态分析工具可以在不增加工作量的情况下,显著的提高软件的质量,同时还可以提高软件的安全性,因为多数安全漏洞的根源在代码缺陷。攻击者经常利用极端状况下程序的行为发动攻击,特别是测试用例容易遗漏的路径。
静态分析工具更擅长捕获这种漏洞,它可以在开发活动的早期就能发现bug,从而更节省时间降低成本。根据US National Institute of Standards and Technology在2002年的一项研究,同样一个缺陷,在产品现场发现后修复要比在编码阶段耗费10-30倍的成本,所以发现bug要越早越好——编码完成后,系统测试前——因为越往后发现意味着修复成本越高。根据Hailpern and Santhanam的研究,这项节省的成本是非常可观的,因为调试、测试及验证活动很容易达到软件开发总成本的50%-75%。另外一个优势是节省了时间,产品可以更快速的上市。静态分析可以很快的发现问题,而如果手工调试的话需要很长的时间,开发人员可以避免掉入手工调试的黑洞,可以把精力集中在更重要的更愉快的任务上,从而大大降低产品开发的风险。