51Testing软件测试论坛

标题: C++test静态分析之BugDetective [打印本页]

作者: lilycheng    时间: 2009-9-1 14:58
标题: C++test静态分析之BugDetective
一、准备工作
1. BugDetective的原理
    BugDetective 是一类新的静态分析技术,该技术使用了几种分析技巧,包括模拟应用程序执行路径,以识别可能触发运行时缺陷的路径。检测到的缺陷包括,使用未初始化的内存、引用空指针、除数为零、内存和资源泄漏。
    由于该分析涉及到识别和跟踪复杂路径,它会暴露通常可逃避编码规则静态分析和单元测试的错误,这些错误难以通过手动测试或检查找到。
    对于那些具有遗留代码库和嵌入式代码(这些情况下,此类错误的运行时检测效果较差或根本不可能)的用户而言,BugDetective 可在不执行代码的情况下显露错误的功能,就特别重要。
    BugDetective 独特的静态分析通过搜索代码中的“可疑点”,开始分析正在测试的源码。可疑点是潜在的错误点。这些可疑点在BugDetective规则中被定义。只要识别了可疑点,BugDetective 就调查导致该可疑点的可能执行路径,并检查是否有任何确实违反BugDetective规则的路径存在。如果找到了这样的路径,就报告一个违例。
    例如,检测可能的“除数为零”情形的规则就规定,任何使用了"/" 或"%" 运算符的点都是可疑的。然后它检查分母中的变量,在导致它为零的任何可能执行路径的点中,是否能保持零值。如果是的话,则会报告一条错误。
    对于每个发现的错误,分层结构流路径数据都会详细准确地列出导致被识别错误的完整执行路径,并以显现出错误的那一代码行作为结束。为
    减少每个被发现问题的诊断和纠正所需要的时间和工作量,流路径详细信息还会补充扩展注释(例如,一条关于“避免引用空指针”违例的描述就包含这样的注释,描述哪些变量、在流路径的哪一点包含null 值)。为使分析过程更灵活、更适合于项目的独特要求,可以参数化某些规则。因此,BugDetective 甚至可以用来检测与特定的API 使用相关的违例。
2. BugDetective的功能
    Parasoft的静态代码分析技术支持基于数据流以及基于模式的这两种静态代码分析方法。Parasoft的这种基于数据流的静态代码分析技术被称为BugDetective,它能方便地为用户检测出跨越多个方法、类或者文件的运行时问题以及程序不稳定性因素(诸如空指针引用、数组越界、除零、SQL以及其它注入、资源泄漏以等)。
    通过在应用程序甚至是相当复杂的应用程序(包含跨越多个方法、类和/或文件并且含有多个顺序调用路径的程序)中自动追踪及模拟其路径,BugDetective能及时发现很多程序中的缺陷,若通过人工测试的方法来查找这些缺陷是相当困难且耗时的,并且若将问题留到程序发布时来修改,往往会耗费巨大的资源。使用Parasoft BugDetective,开发者能在早期发现、诊断并且修复基于模式的静态代码分析和/或单元测试所不能检测到的软件错误。在早期发现这些缺陷能节省软件开发过程中花在诊断以及可能的重复工作上的大量时间。
3. 导入待测工程
BugDetective测试的项目非常多,以选取除零作为例,按照前面的方法导入divisionByZero工程。
二、C++test静态分析之BugDetective
1.配置BugDetective
(1)在C++test下拉菜单下选择“Test Configurations(测试配置)”,如图2-1所示。
[attach]55965[/attach]
(2)在出现的窗口左侧,展开Static Analysis(静态分析)文件夹,右键单击BugDetective,选择Duplicate(副本),此后在User-defined文件夹下会出现BugDetective,如图2-2所示。
[attach]55966[/attach]
(3)选择User-defined文件夹下的BugDetective,在右边面板中选择Static,根据需要选择测试规则,在此选择Possible Bugs下的Avoid division by zero,单击Apply,然后单击Close,如图2-3所示。
[attach]55967[/attach]
2.运行BugDetective
(1)右键单击工程名divisionByZero,选择C++test->Test Using->User-Defined->BugDetective,如图2-4所示。
[attach]55968[/attach]
(2)运行BugDetective过程,如图2-5所示。
[attach]55969[/attach]
3.查看运行BugDetective的结果
(1)选择C++test面板查看测试结果,如图2-6所示。
[attach]55970[/attach]
(2)双击divisionByZero.c(18):p->daysWorkedInPassedMonth = 0,显示出错源代码的位置,如图2-7所示。
[attach]55971[/attach]
(3)将p->daysWorkedInPassedMonth = 0改为p->daysWorkedInPassedMonth = 1,保存后在测试,既不会再提示该错误,如图2-8所示。
[attach]55972[/attach]
如果需要被测试的BugDetective工程,请到www.tryarm.com的“资源共享”区下载
最新版本C++test免费下载:www.edukit.com.cn




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2