首页> 中国专利> 一种基于谓词执行序列的软件动态缺陷定位方法

一种基于谓词执行序列的软件动态缺陷定位方法

摘要

一种基于谓词执行序列的软件动态缺陷定位方法,包括五个步骤:(1)对含缺陷的程序插桩;(2)加载程序的测试用例,运行插有输出谓词执行序列桩函数的程序;(3)分别收集程序运行正确时,和运行错误时,桩函数的输出信息;(4)对收集到的谓词运行信息做统计学分析,统计学分析又包括统计谓词执行序列、统计谓词执行序列向量、计算谓词关联缺陷度和谓词排序这四小步;(5)根据第四步中得到的谓词序列,对谓词依序进行查找,直到找到缺陷为止。该方法将谓词的执行序列信息贯穿到关联缺陷定位的四个基本步骤中,以提高定位效率,而且方法简单,容易实现。

著录项

  • 公开/公告号CN101872325A

    专利类型发明专利

  • 公开/公告日2010-10-27

    原文格式PDF

  • 申请/专利权人 北京航空航天大学;

    申请/专利号CN201010219288.3

  • 发明设计人 郑征;李伟;梁宇;蔡开元;

    申请日2010-06-25

  • 分类号G06F11/36(20060101);

  • 代理机构11232 北京慧泉知识产权代理有限公司;

  • 代理人王顺荣;唐爱华

  • 地址 100191 北京市海淀区学院路37号北航自动化科学与电气工程学院

  • 入库时间 2023-12-18 01:09:32

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-08-11

    未缴年费专利权终止 IPC(主分类):G06F11/36 授权公告日:20120829 终止日期:20160625 申请日:20100625

    专利权的终止

  • 2012-08-29

    授权

    授权

  • 2011-04-20

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20100625

    实质审查的生效

  • 2010-10-27

    公开

    公开

说明书

所属技术领域

本发明涉及一种软件动态缺陷定位方法,特别是一种基于谓词执行序列的软件动态缺陷定位方法。该方法属于软件测试技术领域。

背景技术

软件动态缺陷定位方法(该方法本质上是一种算法,下文中出于习惯用法,一律用算法一词)的研究起步于21世纪初。Tarantula(该名称是算法的发明人命名,现在暂无中文名称。下文中出现的Libit05和Sober同样是算法的发明人命名,现在也暂无中文名称)算法的提出奠定了软件动态缺陷定位算法的基础,该类算法一般包括程序插桩、程序运行、程序运行信息收集和结果的统计学分析这四个步骤。

程序插桩在软件测试中有广泛的应用,它通过向被测程序中插入新的操作语句以实现测试;在进行了程序插桩之后需要将测试用例加载到程序中,并运行程序;当程序运行到桩点时,函数会记录运行信息(如该语句是否运行,谓词运行的真假等);收集运行信息之后便可以采用统计学方法来分析数据,得到缺陷的可能位置。这四个过程对应软件动态缺陷定位算法的四个基本步骤。

不同的缺陷定位算法一般采用不同的统计方法,较有代表性的是Tarantula算法、Liblit05算法、Sober算法。Tarantula算法是哈罗德等人在“一种利用可视化信息的缺陷定位方法”(详见2002年《第二十四届软件工程国际会议》)一文中提出的,其选择的插桩方法是语句插桩,即在所有可执行语句后插入“探针”,收集所有可执行语句的执行信息;然后,利用这些信息计算出每条可执行语句的可疑度,并从大到小排列(即可按照顺序寻找缺陷)。然而,程序中缺陷的大多数来源都是错误的谓词,其他语句很少导致缺陷。所以,针对所有可执行语句的缺陷定位不仅造成信息冗余,使得缺陷定位成本增大,而且冗余的信息会对缺陷信息造成覆盖,使之不易被发现。而且,缺陷定位的精确度降低使得缺陷定位的实际效果大打折扣。针对这个问题本.里布里特等人在“一种可扩展的基于统计学的故障隔离方法”(详见2005年《美国计算机学会<编程语言的设计和实现>会议》)一文中提出了Liblit05算法。此算法选择谓词作为插桩的对象,通过谓词在程序运行中的运行信息的收集和处理来实现缺陷定位,里布里特虽然解决了Tarantula算法中收集所有语句运行信息而造成的信息冗余问题,但并没有充分地收集谓词的执行信息(主要表现在里布里特仅仅考虑了谓词是否在一次程序运行中被执行到,并没有考虑该谓词在程序中被执行了几次)。这种信息不充分导致了里布里特的算法并没有能够将缺陷定位在一个很小的范围内,实用性不强。为此,刘超等人在“基于统计学的程序纠错:一种基于假设检验的方法”(详见2006年《电机及电子学工程师联合会软件工程汇刊》)一文中提出了Sober算法。该算法首次考虑到谓词信息收集不充分的问题,它不仅记录了谓词是否在一次程序运行中被执行到,而且记录了谓词在一次运行中执行的次数,包括谓词执行判定为“真”和执行判定为“假”的次数。将这两种统计信息也包括到计算谓词缺陷相关度的算法当中,但是Sober算法并没有考虑到谓词的运行次序,因此无法对跟谓词运行次序相关的缺陷进行定位。现举例如下:如图1所示为一段带有缺陷的代码,程序第207行的if语句中的谓词P,正确版本的程序中这个谓词P是count>0,而这里面错误的写成count>1。这个缺陷会使得程序在加载一些测试用例的时候运行错误。谓词的执行信息按照程序运行的正确与否划分为Success和Crash两类,Success对应于程序运行正确时的谓词执行信息,Crash对应于程序运行错误时的谓词执行信息。加载两个测试用例到程序中,程序运行了两次,第一次程序运行正确,第二次错误。在每次运行中这个谓词都执行了五次,都是两次为真三次为假。依据程序运行的正确与否,这两次运行的执行信息分别归为Success组和Crash组,该谓词的执行信息如图2所示,Sober算法只统计该谓词执行判定为“真”和为“假”的次数,而这两次程序运行虽然结果不同,但该谓词判定为“真”的次数都是两次,为“假”的次数都是三次,完全相同,这种情况下此算法无法发现该谓词缺陷。

为了避免谓词信息收集不足的问题,要求新算法收集更多的谓词信息。而从上面的例子可以看出,有必要将谓词的执行次序融入到谓词缺陷关联度的计算算法中,本发明正是基于这种考虑。

发明内容

本发明一种基于谓词执行序列的软件动态缺陷定位方法,其目的是:克服现有方法中缺陷关联度的计算有谓词信息收集不足的缺点,提供一种基于谓词执行序列的动态缺陷定位的方法。

本发明一种基于谓词执行序列的软件动态缺陷定位方法,其设计思想是:采用不同的方法执行动态缺陷定位方法的四个步骤,具体是在程序插桩中的桩函数返回谓词执行序列信息(执行序列指的就是在程序一次运行中,某个谓词的执行的真假值的先后次序,如图2中即为两段谓词的执行序列。该方法不同于现有的Iiblit05和Sober等基于谓词统计信息的缺陷定位方法);相应地,运行程序并收集该信息;最后,采用设计的统计分析方法进行结果分析。具体分析时,利用谓词的执行序列来计算每个谓词的缺陷关联度;然后,根据缺陷关联度从高到低将谓词排列,从而实现利用此谓词序列对缺陷进行定位。

更具体地,本发明一种基于谓词执行序列的软件动态缺陷定位方法,其步骤包括以下五步:

第一步对含缺陷的程序插桩。插桩是为了得到程序运行时的谓词执行序列信息,对程序中的分支谓词:if、while、for以及return语句中的谓词进行插桩。桩函数要求在程序运行时输出谓词的状态信息,状态信息包括两种:第一种信息是,该谓词的编号;第二种信息是,待测程序在加载测试用例后,运行正确或错误时,谓词的执行状态,用“+”表示谓词执行判定为“真”,“-”表示谓词执行判定为“假”。

第二步加载程序的测试用例,运行插有输出谓词执行序列桩函数的程序。记录程序运行正确的次数和运行错误的次数,为便于后文的说明方便,用m表示运行正确的次数,n表示运行错误的次数。

第三步分别收集程序运行正确时,和运行错误时,桩函数的输出信息。

第四步对收集到的谓词运行信息做统计学分析,该步骤分为五小步:

(一)利用得到的信息,统计程序中单个谓词在程序一次运行中的执行序列。程序每运行一次,对单个谓词的执行有三种情况:执行多次;执行一次;不执行。程序运行到某谓词时,若该谓词判定为“真”,计为1,若该谓词判定为“假”,计为0,程序一次运行,若该谓词执行了多次,则它的执行序列是0和1所组成的序列;若只执行了一次,则它的执行序列就只有一个数:0或1;若没有被执行,则它此次的执行序列为空。用这种方法统计,则单个谓词共有m个程序运行正确的执行序列,和n个程序运行错误的执行序列。

(二)利用谓词的执行序列,统计出单个谓词的执行序列向量P4。P4是一个四维向量,包括n01、n10、n00,n11这四个值,其中n01和n10分别用来记录谓词的执行序列中(一次程序运行的结果)从0变化到1的次数和从1变为0的次数;而n00和n11分别记录谓词执行序列中连续两次为0的次数和连续两次为1的次数。在一次程序运行中,若某谓词执行了多次,分别记录n01、n10、n00,n11的值;若只执行了一次:谓词执行序列为0时,设定n00=0.5,n01=n10=n11=0;谓词执行序列为1时,设定n11=0.5,n01=n10=n00=0。若该谓词没有执行,则n01=n10=n11=n00=0。从而,得到单个谓词m个程序运行正确的执行序列向量和n个程序运行错误的执行序列向量。

(三)利用谓词执行序列向量P4,计算单个谓词的缺陷关联度。定义单个谓词的缺陷关联度Pdiverge=|P4+-P4-|,这里的P4+表示程序正确运行时谓词的执行序列向量,P4-表示程序错误运行时谓词的执行序列向量。P4+的计算方法为:m个程序运行正确的执行序列向量相加,然后进行归一化处理,即程序运行正确的执行序列向量)/m;P4-的计算方法为:n个程序运行错误的执行序列向量相加,然后进行归一化处理,即程序运行错误的执行序列向量)/n。

(四)利用第三步得到的谓词执行信息,对程序中的每个谓词执行上述的(一)至(三)步,直至得到全部谓词的缺陷关联度。

(五)按照缺陷关联度的高低,将所有谓词从高到低排序。

第五步根据第四步中得到的谓词序列,对谓词依序进行查找,直到找到缺陷为止。

本发明与现有方法相比较的优点在于:本发明将谓词的执行序列信息贯穿到关联缺陷定位的四个基本步骤中,以提高定位效率,而且方法简单,容易实现。

附图说明

图1为示例程序代码

图2为示例谓词执行序列

图3为本发明流程示意图

图4为Siemens-Suit软件包详细信息图

图5为部分桩函数输出信息示意图

图6为两种算法实验数据累计对比

图7为两种算法实验数据间隔对比

图8为Print_tokens实验结果对比

图9为Print_tokens2实验结果对比

图10为schedule实验结果对比

图11为schedule2实验结果对比

图12为replace实验结果对比

图13为tcas实验结果对比

图14为tot_info实验结果对比

对图中的符号和标号说明如下:

图1是从一大段程序中截得的小段程序代码,每一行是一句代码,最前面一列是代码所在行数,如:下划线所在代码是第207行。

图2中上为程序运行正确时的谓词执行序列,下为程序运行错误时的谓词执行序列。横坐标为谓词执行次数,1、2、3、4,5分别表示谓词执行的第一次、第二次、第三次,第四次和第五次;纵坐标为谓词每次执行的判定结果,1表示判定“真”,0表示判定为“假”。

图4中的第一列print-tokens、print-tokens2、replace、schedule、schedule2、tcas,tot-info分别为程序包中的七段待测程序的名称;FaultyVersions是每段程序所包含的带有缺陷的版本数,每一个带缺陷版本都只包含一个缺陷;LOC是每段程序的代码长度,单位为行;Total Test Cases是运行待测程序的测试用例数目;Median of Failing Cases是使待测程序运行失败的测试用例数目;Median of Passing Cases是使待测程序运行成功的测试用例数目。

图5中的数字为谓词的编号,不同的数字代表不同的谓词。数字后面的“+”表示该谓词此次执行判定为“真”,“-”表示该谓词此次执行判定为“假”。

图6中横坐标为检查的谓词占全部谓词的百分比,即谓词覆盖率;纵坐标为定位到的缺陷占总缺陷的百分比。

图7中横坐标为检查的谓词占全部谓词的百分比,即谓词覆盖率;纵坐标为定位到的缺陷个数。

图8~14中横坐标为检查的谓词占全部谓词的百分比,即谓词覆盖率;纵坐标为定位到的缺陷占总缺陷的百分比。

具体实施方式

假定待测程序中含有若干个缺陷,通常测试之前这些缺陷是未知的,首先对待测的程序进行插桩,设计桩点的输出信息为上述方法中第一步中所述的信息,然后加载测试用例,运行插桩后的程序,输出状态信息。利用这些状态信息统计得到第四步中所述的谓词执行序列向量,计算得到谓词的缺陷关联度,并将谓词根据缺陷关联度从高到低排列,最后按照得到的谓词序列自上向下在程序中寻找缺陷。

为了检验该方法的定位效率,考虑把Siemens-Suit软件包(该软件包是西门子公司开发的一个公认的典型测试对象,该测试对象只能在Linux操作系统下运行)作为实验对象,该对象中每段程序的缺陷位置、缺陷数目和缺陷类型是已知的。

Siemens-Suit中包含7段程序,图4显示了Siemens-Suit软件包中7段程序的详细信息。取其中一段程序验证本发明方法。运用本发明的流程如图3所示,其具体实施步骤如下:

第一步取带有缺陷的程序print-tokens-v5(该版本是名称为print-tokens的程序的第五个版本,程序中共有谓词204个,缺陷在第13个谓词),对if、while、for,return语句中的谓词进行插桩。共插入204个桩点。设置桩函数输出信息为:谓词的编号;谓词在程序运行时的执行状态。

第二步加载该程序的全部共4130个测试用例,运行插桩后的print-tokens-v5。共有4082个测试用例使程序运行正确,48个使程序运行错误。

第三步分别收集程序运行正确时,和运行错误时,桩函数的输出信息。图5所示为部分输出信息。

(以上三步在Linux操作系统下运行,以下两步均在windows操作系统下运行)

第四步对得到的输出信息作统计学分析,分以下五步:

(一)利用得到的信息,统计出谓词P在程序一次运行中的执行序列。程序每运行一次,对应的P有三种执行状态:执行若干次;执行一次;不执行。程序运行到P时,若P判定为“真”,计为1,若P判定为“假”,计为0。若程序一次运行中,P执行了若干次,则P的执行序列是0和1所组成的序列;若只执行了一次,就只有一个数,0或1;若没有执行,则P的执行序列为空。用这种方法统计,则P共有4082个程序运行正确的执行序列和48个程序运行错误的执行序列。

(二)利用谓词的执行序列,统计出P的执行序列向量P4。P4是一个四维向量,包括n01、n10、n00,n11四个值,其中n01、n10分别用来记录在一次程序运行中,P的执行序列中从0变化到1的次数,和从1变为0的次数;而n00,n11分别用来记录在一次程序运中,P的执行序列中连续两次为0的次数,和连续两次为1的次数。在一次程序运行中,若P执行了多次,分别记录n01、n10、n00,n11的值;若P只执行了一次:P执行序列为0时,设定n00=0.5,n01=n10=n11=0;P执行序列为1时,设定n11=0.5,n01=n10=n00=0。若该谓词没有执行,则n01=n10=n11=n00=0。上述方法统计可得到P有4082个程序运行正确的执行序列向量和48个运行错误的执行序列向量。

(三)利用得到的谓词P的执行序列向量,分别带入公式和求出P4+和P4-;然后带入公式Pdiverge=|P4+-P4-|,求出P的缺陷关联度。

(四)对于print-tokens-v5中的每个谓词,重复(一)至(三)步,求出程序中每个谓词的缺陷关联度。

(五)将所有204个谓词依据缺陷关联度从高到低排序,所得排序前10位的谓词为89、93、97、72、102、103、104、98、73、76。

第五步利用此排序对谓词依次查找。已知第93个谓词含有缺陷,则在此序列中的第二个谓词即可找到缺陷。

对Siemens-Suit软件包中的全部共132个带缺陷的程序版本运用上述方法和Sober算法分别进行缺陷定位,并引入一种新的评价标准,用Ptotal来表示程序中谓词的总数目,用Pdefect表示含有缺陷的谓词,用Psuspect来表示已检查的谓词的个数,则Psuspect就是在谓词排序列表上缺陷关联度大于Pdefect的所有谓词的个数,用Pefficiency来表示缺陷定位的效率,则Pefficiency越小表示定位效率越高。

利用此评价标准,将本发明与Sober算法的定位效果做比较。图4和图5为本发明与Sober算法的定位效果对比。

从图6中可以看到,在检查了40%的谓词时本发明就能检查到70%的缺陷而Sober算法只能找到56%的缺陷,即本发明较Sober算法在检查同等数量的代码时总是能够找到更多的缺陷。所以本发明在对缺陷定位的精确度方面明显优于Sober算法。

图7则从另一个角度显示了本发明的优越性。图7显示的是当测试人员按照本发明得出的谓词排序或是Sober算法得出的谓词排序来检查代码时,从排序表的1%的谓词检查到10%的谓词能够定位到的缺陷数目,从10%的谓词检查到20%的谓词能够定位到的缺陷数目等。从图中可以看出,本发明得到的谓词排序能够在前50%的谓词查到大多数的缺陷,而Sober算法则相对较差。

图8~14为Siemens-Suit软件包中七段程序分别用本发明与Sober进行缺陷定位实验结果对比。按照本发明和Sober算法得到的谓词按照缺陷关联度由高到低的排序,选取这个排序的前50%的谓词来进行缺陷定位。从图8~14中可发现本发明的定位效果在七段程序中均优于Sober算法。在程序replace和tot_info中仅在前30%时略差,差别很小,但是在50%时本发明已明显优于Sober算法。

从以上实验数据中得出如下结论:

(1)本发明提供的谓词排序能查找前50%的谓词时准确定位到大多数的缺陷,而Sober算法的定位效果不如本发明。

(2)本发明在定位大多数程序的缺陷时定位效率都高于Sober算法。

综上所述,本发明在缺陷定位方面优于Sober算法。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号