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

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

上一篇 / 下一篇  2008-03-14 09:39:39 / 个人分类:GrammaTech

In-Depth Example Analysis

CodeSonar的两个重要的特性是精确率和执行效率。CodeSonar能够做到这点,其技术情况请看下面的一个简单例子分析。代码如下: 

以上的控制流程图CFG显示了这里有两个条件判断,意味着最大的可能路径为22=4。但是,实际上可达的路径会比较小,因为表面上独立的分支其实是有关联的。当CodeSonar检查CFG时,它只是探测了两个路径,因为它很快注意到(if err == NO_ERROR) 总是为TRUE,CodeSonar将不会去探测不可达的FALSE分支,这对分析的精确度很重要。CodeSonar会产生一个警告,告诉用户该条件判断永远不会为FALSE。更重要的是,CodeSonar会在下面的图示路径上生成一个null-pointer-dereference的警告。

CodeSonar通过计算给用户提供一个详细的执行路径,帮助用户发现bug的根源。在这个例子中,编程的错误在,当参数有错误时,err被置为NO_ERROR。GrammaTech曾经在findutils——一个搜索类的开源项目——中发现类似的错误。

去除那些不可达的路径可以减少分析时间,同时还可以通过减少结果中误报的个数,大大的提高准确率。例如,我们修改204行为err =DATA_ERROR,CodeSonar将会去掉两个不可执行的路径。

• The path upon which (if size <= 0) evaluates to true and

(if error == NO_ERROR) evaluates to true.

• The path upon which (if size <= 0) evaluates to false and

(if error == NO_ERROR) evaluates to false.

修改后的代码没有了null-pointer-dereference,CodeSonar整体的数据流分析可以识别出来。简单的静态分析工具只能识别出 getData 会返回指针的值和NULL。当代码正确时,简单的分析工具由于不能识别出分支之间的关联,也可能会产生误报的警告。

Checks Performed

CodeSonar可以检测的缺陷分为以下三种类型:

X 编程语言的错误使用 这些错误是由C/C++特性的错误使用导致。类似的例子包括buffer overruns(缓冲区溢出)、null-pointer dereferences(空指针的非法引用)、freeing an object created by new(释放由new创建的对象)

X 库的错误使用 这些错误是由标准库API的错误使用导致。例如,资源泄漏(非内存泄漏)、错误的状态在socket上调用accept()

X 用户定义的错误 最终用户可以创建特定类型的检查,扩展CodeSonar的分析。例如,在interrupt处理函数中不要调用foo()。

 在评估静态分析工具时,很重要的一点是搞清楚同一类型的缺陷有很多种表现方式。静态分析工具的技术水平决定了其可以发现bug的多少种表现形式。例如,下面的例子都属于缓冲区溢出(buffer overruns),二者都是经典的“差一错误”,但实际上,右边的bug显然更复杂,要求更深入的分析才能发现。

在实际的项目中,缓冲区溢出(buffer overruns)的情况会比以上的例子更复杂。一些工具可以检查大量的表面的错误类型。相比之下,CodeSonar的深层次分析能够检测出复杂的bug,而且误报率很低。例如,马里兰大学的教授Professors William Pugh和约克学院的David Hovemeyer进行了一项研究,重点是测试几款静态分析工具,看他们在检测null pointer dereferences方面的能力(众所周知,发现null pointer dereferences类的错误是个大的挑战)。Pugh和Hovemeyer的研究包括了很多复杂的bug,比如说潜伏在结构体里面的bug。GrammaTech CodeSonar是唯一能够发现所有的null pointer dereferences的工具,并且,CodeSonar还是唯一没有误报的工具(Hovemeyer and Pugh, 2007)。

正如以上提到的,CodeSonar提供了丰富的API,用户可以使用它来扩展自己的检查器。API支持各种可能的检查,实际上,CodeSonar中的很多的检查器是由同样的API实现的。特定领域的检查器包括:

• Return code checkers.

• Leak checkers (for custom resource allocators).

• Checkers that find illegal parameter values.

• Checkers that examine temporal properties.

不需要修改代码,所有自定义的检查器就可以实现。

 


TAG: GrammaTech

引用 删除 imnewcomer   /   2008-04-08 17:12:41
谢谢啊, 这就看看去! :)
huior的测试烩 引用 删除 huior   /   2008-04-08 15:59:13
针对JAVA代码,看起来还非常不错的一个工具
http://www.sofcheck.com/products/inspector.html#Inspector
可以在需要的时候适当关注
huior的测试烩 引用 删除 huior   /   2008-04-07 15:42:37
你上网找找Klocwork的K7,它支持JAVA语言,可以分析JAVA的安全漏洞,也可以分析一部分代码问题,官方网站 http://www.klocwork.com
引用 删除 imnewcomer   /   2008-04-07 15:30:53
huior 老兄, 这个GrammaTech 貌似只针对C/C++ 的null point , 有没有类似的好东西可以用来分析java的 null point?
 

评分:0

我来说两句

Open Toolbar