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

c++test创新的静态分析BugDetective

上一篇 / 下一篇  2008-05-16 17:13:55 / 个人分类:C++test

BugDetective是新一代的静态分析技术,它使用了几种分析方法,包括程序路径的模拟,可以发现运行时错误发生的路径。检测的缺陷包括未初始内存的使用、非法指针引用、除数为零、内存和资源泄漏等。

由于这种分析可以跟踪程序中复杂的路径,它可以发现编程规则检查和单元测试容易遗漏掉的bug,这种bug通过人工测试或检查都很难发现。对于用户来说,BugDetective不需要执行代码就能发现bug的能力非常有价值,尤其是对于历史代码和嵌入式代码。

BugDetective独一无二的静态分析从被测源代码中搜索“可疑点”开始。“可疑点”处可能有潜在的bug。这些可疑点在BugDetective的规则中定义。一旦可疑点被确认,BugDetective会分析可疑点处的所有可能执行路径,检查这些路径是否真的会违反BugDetective的规则。如果发现了这样的路径,就会出现违反规则的报告。

举例来说,检测除数可能为零的规则说,'/'或'%' 操作符出现的地方都是可疑点。然后它会检查在可能的执行路径下,可疑点处除数的变量是否可能为零。如果有可能,就会报告一个错误。

为了让分析过程更加灵活,充分适应你的项目需求,一些规则可以参数化,所以BugDetective甚至能够用于检测特定API的使用情况。

借助于BugDetective,开发团队可以得到以下主要优势:

×利用现有的资源做更深入的测试: 作为其他测试技术的补充(需要开发、执行和维护测试用例的技术),BugDetective分析程序中的每一个分支,可以达到传统的测试很难达到的、一定级别的路径覆盖,从而发现传统的测试没有覆盖到的、比较生僻的测试环境中的问题。此外,如果代码的功能发生了改变,你只需要在修改的版本中搜索Bug,而不需要更新或者重新生成测试用例。

×自动发现多个单元接口的问题: 传统的自动化的单元测试帮助你发现单个编译单元中的bug,这一点很重要,但大多数开发者都做了充分的单元测试,修改了所有表面的问题,然后集成所有的单元,后来又遇到问题,例如空指针的非法引用,需要花费好多天调试诊断,因为它们出现在不明显的、更复杂的、多个函数间的甚至多个编译单元间传递的执行路径中,使用BugDetective,可以完全自动化的发现这样的问题。

×专注于真正的bug和设计缺陷:BugDetective自动的发现数据相关或者流程相关的bug。当BugDetective报告一个违例时,通常意味着这里是一个设计缺陷,或者是一个简单的违例,如除数为零或者资源泄漏。例如,以下代码,BugDetective不会报告违例,除非有一个方法来调用calculateBufferLength并且传递了一个null pointer。

int calculateBufferLength(char* str)
{
return strlen(str) + 1;
}

×发现API的错误使用:实际工作中,大多数的Bug都是由于调用一些API时使用了错误的参数或者没有正确的处理API返回的值。例如,一个API的第二个参数应该是non-null的参数,当第一个参数是true时,或者API可能潜在的修改某对象的一些值为null。通过执行过程分析后,BugDetective会指出一些API的使用不当之处。

注:以上内容参考了c++test user guide的部分内容。

BugDetective的具体实践请参考本博前面的几篇关于c++test试用的文章。


TAG:

 

评分:0

我来说两句

Open Toolbar