这里没有软件测试的泛泛理论,只有博主的最佳实践。 博主的研究方向为静态分析和性能测试,致力于各种测试工具的引入、评估和开发。 本博的测试文章均为作者原创,转载请务必注明出处。

GrammaTech静态分析技术概述——2

上一篇 / 下一篇  2008-03-12 11:13:38 / 个人分类:GrammaTech

Quick Product Overview 

GrammaTech公司的CodeSonar在代码编译时就能分析整个软件项目,当然如果愿意,用户也可以只分析其中的一部分,而且不需要修改你的代码和编译脚本。用户象往常一样编译,CodeSonar监控编译过程。使用它从监控过程中学习到的信息,CodeSonar复制编译过程后执行分析。CodeSonar就像编译器一样解析代码,但和编译器生成目标码不同,CodeSonar可以生成程序的抽象表示。单个文件编译完成后,CodeSonar综合所有的编译结果,合并到整个程序模型,然后分析整个模型,当发现缺陷时,警告就会产生。每一个警告包括了一个详细的执行轨迹,显示了缺陷发生的路径情况,这可以帮助用户更快的理解警告并修复。下图是一个针对开源项目分析结果中的警告。

在1774行有一个缓冲区溢出,1773行的语句在申请内存数量时内存错误。第二个缺陷,malloc的返回值没有做检查。总体的数据统计报告也能生成。这些报告帮助团队成员了解质量趋势。以下的示例报告显示了警告的个数、各种错误类型的分布、每个软件版本的情况。例如,从这些数据可以看出,随着新版本的发布,未初始化变量的警告数在逐渐减少。

为了推动不同团队间的合作,警告都被存储在WEB Server的数据库中,界面中提供了一个搜索功能,可以帮助用户搜索符合标准的结果。警告可以分配到具体的用户,状态信息和注解可以一直附着在警告上,即便是代码有了修改。

How CodeSonar Performs Its Analysis

一些静态分析工具只能对代码做模糊的解析,导致其创建的程序描述不完整,只能产生比较差的结果。相比之下,CodeSonar能够象编译器一样准确的解析代码,从而可以开发出程序的精确模型。为了保证最大可能的精确解析,GrammaTech使用了业界领先的编译器前端技术the Edison Design Group front end。EDG已经用在了很多商业的编译器技术上,包括Intel、Green Hills、IAR的编译器。GrammaTech把EDG扩展到了对其他多数的编译器建模上,包括支持非ANSI结构的编译器,如GCC。

开发人员编译项目最常用的是Makefiles或者IDE,准确的代码解析需要对编译过程有全面的了解。因为编译系统可能会非常复杂,GrammaTech开发了一项编译监控的特性,CodeSonar可以通过监控观察常规的编译过程并且从中学习,这就避免了一些其他静态分析工具的常用做法——需要人工必须再复制一套编译环境。

使用监控编译过程得到的信息,CodeSonar可以解析每一个编译单元。预处理标识、头文件包含以及宏扩展都能够得到正确的处理。这个过程的输出包括了抽象语法树(abstract syntax trees)、符号表信息(symbol table information)、调用图(call graphs)和控制流程图(control-flow graphs)。除了程序结构信息外,源代码位置的信息也被提炼出来,CodeSonar可以将程序结构和它在源代码中的位置建立关联,展示缺陷警告的路径追踪信息。

一旦独立的编译单元解析完成后,连接(linking)开始执行。和编译器连接目标码不同,GrammaTech把程序部件的抽象表示连接到一起,例如,每个函数/过程都有控制流程图(CFG),在连接过程中,这些CFG被合并成一个大的、整体的CFG。

接下来,CodeSonar会对程序路径做整体的分析,这里是整个分析的核心——所有可达的路径、变量条件在哪?以及他们之间怎样发生联系。CodeSonar从整个程序开始分析,到提炼出函数、类型和数据,对于每一个过程,CodeSonar会编译出过程行为的模型和边界值,然后对程序路径进行探测。探测过程是路径敏感、上下文敏感和对象敏感的。当路径探测遇到异常时,产生一个警告。CodeSonar分析的代码量可能非常大,为了保证扩展性,GrammaTech使用了各种策略。分析过程中过程概要非常精炼,路径探测的顺序和复杂的内存管理优化的结合,确保CodeSonar使用最小的内存。

 


TAG: GrammaTech

 

评分:0

我来说两句

Open Toolbar