CN102622295B - 一种基于谓词执行信息分析的自适应软件缺陷定位方法 - Google Patents

一种基于谓词执行信息分析的自适应软件缺陷定位方法 Download PDF

Info

Publication number
CN102622295B
CN102622295B CN201210037955.5A CN201210037955A CN102622295B CN 102622295 B CN102622295 B CN 102622295B CN 201210037955 A CN201210037955 A CN 201210037955A CN 102622295 B CN102622295 B CN 102622295B
Authority
CN
China
Prior art keywords
predicate
program
defect
judged
successful
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201210037955.5A
Other languages
English (en)
Other versions
CN102622295A (zh
Inventor
郑征
郝鹏
李伟
宫成
蔡开元
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beihang University
Original Assignee
Beihang University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beihang University filed Critical Beihang University
Priority to CN201210037955.5A priority Critical patent/CN102622295B/zh
Publication of CN102622295A publication Critical patent/CN102622295A/zh
Application granted granted Critical
Publication of CN102622295B publication Critical patent/CN102622295B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Debugging And Monitoring (AREA)
  • Test And Diagnosis Of Digital Computers (AREA)

Abstract

一种基于谓词执行信息分析的自适应软件缺陷定位方法,它有七大步骤:(1)对含缺陷的程序插桩;(2)加载程序的测试用例,运行插有桩函数的程序;(3)分别收集程序运行成功时和运行失败时,桩函数的输出信息;(4)对每个谓词在所有失败测试用例下的执行信息进行预处理;(5)计算谓词P的缺陷关联度;(6)重复第五步,计算所有谓词缺陷关联度,并按照从高到低将所有谓词进行排序;(7)根据第六步中的排序结果,对谓词依序进行查找,直到找到缺陷为止。本发明原理简单,容易实现,能有效解决现有基于谓词软件动态缺陷定位方法无法有效利用谓词执行信息的问题,从而克服了传统方法的局限性,提高了定位效率。

Description

一种基于谓词执行信息分析的自适应软件缺陷定位方法
技术领域
本发明涉及一种加入特征选择的软件动态缺陷定位方法,特别是涉及一种基于谓词执行信息分析的自适应软件缺陷定位方法。它是一种能够根据程序中谓词实际执行情况自动选择所需谓词执行信息量的软件缺陷定位方法。该方法属于软件测试技术领域。
背景技术
建立高可靠、零缺陷的软件生产线,一直是软件工业界和软件工程学术研究机构多年以来锲而不舍的追求目标。尤其是进入20世纪90年代后,国外对软件缺陷定位、软件排错等自动化调试技术研究的投入明显加大,从不同角度对软件缺陷定位等核心技术展开了深入研究,并陆续发表了一些研究成果,研制了一批新型的软件调试和缺陷定位原型系统。现有软件缺陷定位方法(在本专利申请中,“方法”一词与“算法”一词可以互换)可分为五种:
(1)莱尔等人在“利用程序切片自动定位程序故障”一文中提出的基于程序执行切片的方法(详见1987年《第二届计算机与应用国际会议》)。该方法通过构造并对比程序成功和失败运行时的程序切片,来最大程度缩小需要检查的范围。这种方法适用于代码规模不大、分支较少的情况;
(2)琼斯等人在“一种利用可视化信息的缺陷定位方法”一文中提出的基于可执行语句的方法(详见2002年《第二十四届软件工程国际会议》)。该方法收集程序在每个测试用例下的程序可执行语句的执行信息,并利用该执行信息计算可执行语句包含缺陷的可能性,以此来定位缺陷可能存在的位置。这种方法适用于测试用例容易获得、程序运行时间较短的情况;
(3)里布里特等人在“一种可扩展的基于统计学的故障隔离方法”一文中提出的基于谓词的方法(详见2005年《美国计算机学会<编程语言的设计和实现>会议》)。该方法通过对谓词(谓词是指程序中的条件判断,例如if,for,while等条件。谓词所在语句控制着程序中控制流的走向,对于程序能否正确执行起着主导作用)进行插桩而获得谓词的执行信息,利用相关评价体系计算这些谓词包含缺陷的可疑度,按照可疑度对谓词进行排序,并以最终排序作为定位缺陷位置的依据;
(4)希尔德布兰德等人在“简化和隔离故障”一文中提出的基于程序模型(或状态)的方法(详见2002年美国电气电子工程师学会《软件工程》杂志第28卷第2期)。该类方法对失败执行过程中某些变量在一些特殊节点处的值进行记录,构建变量值的状态转换图,通过修改其中某些变量值的方法来定位缺陷可能存在的位置;
(5)白里安等人在“使用机器学习来支持Tarantula调试”一文中提出的基于机器学习的方法(详见2007年《第十八届美国电气电子工程师学会软件可靠性国际研讨会》)。该类方法通过引入机器学习相关理论,以语句覆盖率等信息作为输入数据,试图通过学习或演绎推测出缺陷可能存在的位置。
基于谓词的方法要求插桩复杂度低(程序插桩在软件测试中有广泛的应用,它通过向被测程序中插入新的操作语句以实现测试),处理数据少,定位效果好,现已成为研究热点。但目前已有的一些算法均存在对谓词执行信息利用不足或过分利用的情况,无法取得较好的定位效果。
为了避免出现上述问题,要求新方法能够适应程序中谓词的实际执行情况。因此有必要先对谓词的执行信息进行预处理,以便确定算法对谓词执行信息的利用程度,使缺陷定位算法能够充分利用谓词的执行信息获得较好的定位效果,本发明正是基于这种考虑。
发明内容
本发明一种基于谓词执行信息分析的自适应软件缺陷定位方法,其目的是:克服现有方法中无法有效利用谓词执行信息的缺点,提供一种能够自适应谓词实际执行情况的动态缺陷定位方法。
本发明一种基于谓词执行信息分析的自适应软件缺陷定位方法,其设计思想是:对于桩点处的谓词P,运行待测程序的所有测试用例。对谓词P的执行信息进行预处理(谓词执行信息是指在程序一次运行中,谓词的执行次数以及每次的判断结果),具体为:统计谓词P在程序运行失败时的执行次数,确定出现频率最高的前N个(2<N<6,N取整数)执行次数。根据该信息带入对应的步骤计算谓词P的缺陷关联度,最后按照缺陷关联度由大到小对程序中的所有谓词进行排序。P的缺陷关联度越大,则认为P以及与P有数据或控制关联的程序代码含有缺陷的概率越大,从而实现有效利用谓词的执行信息对缺陷进行定位的目的。整个算法的基本思路如图1所示。
本发明一种基于谓词执行信息分析的自适应软件缺陷定位方法,该方法具体步骤如下:
步骤一:对含缺陷的程序插桩。对程序中的分支和返回值:if、while、for以及return语句中的谓词进行插桩,桩函数要求在程序运行时输出相应的谓词执行信息。
步骤二:加载程序的全部测试用例,运行插有桩函数的待测程序。
步骤三:分别收集程序运行成功和运行失败时桩函数的输出信息。由于插桩程序设计的不同,桩函数输出的谓词执行信息可分为两类,分别如图2和图3所示。
步骤四:对每个谓词在所有失败测试用例下的执行信息进行预处理,该步骤分为三小步:
(一)利用桩函数的第二种类型输出信息(如图3所示),统计程序运行失败时的错误矩阵其中表示第k个(1≤k≤m,m表示失败测试用例总数)失败测试用例下,插桩谓词i(1≤i≤n,n表示插桩谓词总数)输出的第二种类型信息中的第j个(1≤j≤6,j取整数)数。
(二)在错误矩阵A1中统计单个谓词的执行次数以及执行次数出现频率
(在本专利中,频率是指出现的次数),将执行次数和相应的执行次数出现频率按谓词编号存储在矩阵中。例如:第i行第j列元素aij中记录着谓词i的一个执行次数以及该执行次数所对应的出现频率。
(三)在矩阵A2的每一行中确定出现频率最高的前N个(2<N<6,N取整数)执行次数。针对选出的执行次数,计算权值xj(1≤j≤N)=运行时出现该执行次数的失败测试用例数目/总失败测试用例数目,保存计算结果。
步骤五:计算谓词P的缺陷关联度。该步骤分为两小步:
(一)根据第四步中得到的谓词P出现频率最高的前N个(2<N<6,N取整数)执行次数选择相应的流程来计算缺陷关联度。该步骤又可分为三小步:
(1)若前N个(2<N<6,N取整数)执行次数中包含有执行次数i=0,则根据流程一计算。流程一描述如下:
①计算 failure ( P ) = F ( P ) F ( P ) + S ( P ) , 其中F(P)为谓词P被判断为“真”时,运行失败的测试用例数目,S(P)为谓词P被判断为“真”时,运行成功的测试用例数目。
②计算 context ( P ) = F ( Oberseved ) F ( Oberseved ) + S ( Observed ) , 其中F(Observed)为谓词P被执行到时(指被判断为“真”或“假”),运行失败的测试用例数目,S(Observed)为谓词P被执行到时,运行成功的测试用例数目。
③计算Increase(P)=failure(P)-context(P)。
④判断Increase(P)的取值,若为正值(指大于零),则转第⑤步。否则返回缺陷关联度值Suspicious(P)=0。
⑤判断失败测试用例总数m的取值,若m=1,则转第⑥步。否则转第⑦步。
⑥返回谓词P的缺陷关联度计算值, Suspicious ( P ) = 2 1 + 1 Increase ( P ) .
⑦返回谓词P的缺陷关联度计算值, Suspicious ( P ) = 2 1 Increase ( P ) + 1 log ( F ( P ) ) log ( m ) .
(2)若前N个(2<N<6,N取整数)执行次数中包含有执行次数i=1,则根据流程二计算。流程二描述如下:
①计算程序运行失败时谓词P被判断为“真”的概率值Xf(P), X f ( P ) = &Sigma; 1 n &phi; f ( P ) n , &phi; f ( P ) = n t ( P ) n t ( P ) + n f ( P ) . 其中nt(P)表示在程序一次失败运行中,谓词P被判断为“真”的次数,nf(P)表示谓词P被判断为“假”的次数。若nt(P)+nf(P)=0,则该次运行的φf(P)=0.5。n为失败测试用例的总数。
②计算程序运行成功时谓词P被判断为“真”的概率值Xs(P), X s ( P ) = &Sigma; 1 m &phi; s ( P ) m , &phi; s ( P ) = n t ( P ) n t ( P ) + n f ( P ) . 其中nt(P)表示在程序一次成功运行中,谓词P被判断为“真”的次数,nf(P)表示谓词P被判断为“假”的次数。若nt(P)+nf(P)=0,则该次运行的φs(P)=0.5。m为成功测试用例的总数。
③如果谓词P在所有失败测试用例中均没有被执行(指没有被判断为“真”或“假”),则返回谓词P的缺陷关联度值Suspicious(P)=0。否则转第④步。
④返回谓词P的缺陷关联度值计算值,计算公式为Suspicious(P)=|Xf(P)-Xs(P)|。
(3)若前N个(2<N<6,N取整数)执行次数中包含有执行次数i≥2(即i取2,3,4,5及其以上整数时),则根据流程三计算。流程三描述如下:
①计算所有成功测试用例下谓词P的成功执行序列向量P+。方法是:
1)利用桩函数的第一种类型输出信息(如图2所示)计算程序第k次成功运行下谓词P的成功执行序列集合 ES P k = es P 1 es P 2 &CenterDot; &CenterDot; &CenterDot; es P m . 其中,中的上标m表示在程序第k次成功运行中谓词P只被执行了m次。表示程序第k次成功运行中第j次(1≤j≤m)经过谓词P时,谓词P的判断结果,若判断为“真”,否则
2)针对成功执行序列统计谓词P的M位成功执行序列向量其中为执行序列包含子序列a1a2…aM的个数,al=0或1,l=1,2,…,M,a1a2…aM的排列组合。获取M位成功执行序列向量的具体操作是:
a.根据确定的执行次数i选择执行序列向量的位数M。若i=2,则M=2;若i=3,则M=3;若i=4,则M=4;若i≥5,则M=5(由于当M≥6时,算法时间复杂度太高,因此不予考虑,全部按照M=5进行处理)。例如:i=2时,选择谓词执行序列向量的位数M=2,包含22=4个值,为n01、n10、n00,n11这四个元素。
b.根据选择的执行序列向量的位数M确定的值。当m≥M时,为执行序列中包含子序列a1a2…aM的个数;当m=0时,中各值均等于零;当m<M时,则采取等概率补齐的方式(bl=0或1,l=1,2,…N-x)对相应元素进行赋值,其他的元素赋值为零。例如:当选择谓词执行序列向量的位数M=2时,若谓词P执行了多次,则n01、n10、n00,n11分别记录执行序列中含有子序列01、10、00,11的个数;若谓词P没有执行,则n01=n10=n11=n00=0;若执行次数小于向量位数时,在本例中,当只执行了一次,谓词P执行序列为0时,设定n00=n01=0.5,n10=n11=0;谓词P执行序列为1时,设定n10=n11=0.5,n01=n00=0。
3)将谓词P的m个成功执行序列向量相加,进行归一化处理,得到谓词P的成功执行序列向量P+。即
②计算所有失败测试用例下谓词P的失败执行序列向量P。方法是:前两步与上面叙述的1)和2)相同,只是将成功执行序列换成失败执行序列。3)将谓词P的n个失败执行序列向量相加,进行归一化处理,得到谓词P的失败执行序列向量P。即
③如果谓词P在所有测试用例中(包括成功和失败测试用例)或者在所有失败测试用例中均没有被执行到,则返回缺陷关联度值Suspicious(P)=0,否则转第④步。
④利用谓词执行序列向量,计算谓词P的缺陷关联度。定义单个谓词的缺陷关联度公式Suspicious(P)=|P+-P-|。
(二)采用公式Suspicious(P)=a1×R1+a2×R2+…aN×RN来最终对谓词P的缺陷关联度进行综合。其中a1,a2,…,aN为步骤四中计算出来的权值,R1,R2,…,RN为步骤五中第(一)小步对应的计算结果(例如,若a1为出现执行次数为零次的失败测试用例数目占所有失败测试用例的比例,R1则为用流程一进行计算的结果)。
步骤六:对程序中的每个谓词都执行步骤五,直至得到全部谓词的缺陷关联度。按照缺陷关联度从高到低,将所有谓词进行排序。
步骤七:根据步骤六中得到的谓词排序表,对谓词依序进行查找,直到找到缺陷为止。
本发明一种基于谓词执行信息分析的自适应软件动态缺陷定位方法,其优点及功效是:本发明能有效解决现有基于谓词软件动态缺陷定位方法无法有效利用谓词执行信息的问题,由于对谓词的执行信息进行了预处理,分析了每个谓词在程序运行失败时的执行次数,根据执行次数有针对性的选择缺陷关联度计算流程,确定算法利用的谓词执行信息类型以及数量,使得算法在计算时能够充分适应谓词的实际执行情况,有效利用谓词提供的执行信息,避免出现对谓词执行信息利用不足或过分使用的情况,从而克服传统方法的局限性,提高定位效率。此外,该方法原理简单,容易实现。
附图说明
图1为算法基本思路图
图2为第一种类型部分桩函数输出信息示意图
图3为第二种类型部分桩函数输出信息示意图
图4为Siemens-Suit软件包详细信息图
图5本发明流程示意图
图6为N=3时本发明与现有算法实验结果对比
图7为N=4时本发明与现有算法实验结果对比
图8为N=5时本发明与现有算法实验结果对比
图9为N=3时replace实验结果对比
图10为N=3时schedule和schedule2实验结果对比
图11为N=3时tcas实验结果对比
图12为N=3时tot-info实验结果对比
图13为N=3时print-tokens和print-tokens2实验结果对比
图14为N=4时replace实验结果对比
图15为N=4时schedule和schedule2实验结果对比
图16为N=4时tcas实验结果对比
图17为N=4时tot-info实验结果对比
图18为N=4时print-tokens和print-tokens2实验结果对比
图19为N=5时replace实验结果对比
图20为N=5时schedule和schedule2实验结果对比
图21为N=5时tcas实验结果对比
图22为N=5时tot-info实验结果对比
图23为N=5时print-tokens和print-tokens2实验结果对比
图中的符号和标号说明如下:
图2中的数字为谓词的编号,不同的数字代表不同的谓词。数字后面的“+”表示该谓词此次执行判定为“真”,“-”表示该谓词此次执行判定为“假”。
图3中带数字的一行表示一个测试用例下所有插桩谓词的输出信息。其中每6个数字表示一个谓词,谓词编号从0开始,依次往后顺序编排。每6个数字中,第1个数字表示谓词判断为“真”的次数,第2个数字表示谓词判断为“假”的次数,第3个数字表示谓词被执行到的次数。
图4中的第一列print-tokens、print-tokens2、replace、schedule、schedule2、tcas,tot-info分别为程序包中的七段待测程序的名称;Faulty Versions是每段程序所包含的带有缺陷的版本数,每一个带缺陷版本都只包含一个缺陷;LOC是每段程序的代码长度,单位为行;Total Test Cases是运行待测程序的测试用例数目;Median of Failing Cases是使待测程序运行失败的测试用例数目;Median of Passing Cases是使待测程序运行成功的测试用例数目。
图6~图23中横坐标为检查的谓词占全部谓词的百分比,即谓词覆盖率;纵坐标为定位到的缺陷占总缺陷的百分比。CBI、Sober、F-test、T-test、Wilcoxon和Mann-Whitney为现有的几种典型算法名称。
具体实施方式
假定待测程序中含有若干个缺陷,通常测试之前这些缺陷是未知的,首先对待测的程序进行插桩,设计桩点的输出信息为上述方法中第三步所述的信息,然后加载测试用例,运行插桩后的程序。收集桩函数的输出信息,按照上述方法中第四步的要求对这些信息进行预处理,得到每个谓词在所有失败测试用例下出现频率最高的前N个(2<N<6,N取整数)执行次数。然后在第五步中计算得到谓词的缺陷关联度,将谓词根据缺陷关联度从高到低排列,最后按照得到的谓词排序自上向下在程序中寻找缺陷。
为了检验该方法的定位效率,考虑把Siemens-Suit软件包(该软件包是西门子公司开发的一个公认的典型测试对象,该测试对象只能在Linux操作系统下运行)作为实验对象,该对象中每段程序的缺陷位置、缺陷数目和缺陷类型是已知的。
Siemens-Suit中包含7段程序,图4显示了Siemens-Suit软件包中7段程序的详细信息。取其中一段程序验证本发明方法。运用本发明的流程如图5所示,本发明一种基于谓词执行信息分析的自适应软件缺陷定位方法,该方法具体实施步骤如下:
步骤一:取带有缺陷的程序print-tokens2-v6(该版本是名称为print-tokens2的程序的第6个版本,程序中共有谓词205个,缺陷在第135个谓词。谓词编号从0开始,含缺陷谓词对应编号为134),对if、while、for,return语句中的谓词进行插桩。共插入205个桩点。设置桩函数的输出信息为两种类型,一种是:谓词的编号;谓词在程序运行时的执行状态,示例如图2所示。另一种是:用每6个数表示一个谓词,其中第一个数表示该谓词判断为“真”的次数,第二个数表示该谓词判断为“假”的次数,第三个数表示该谓词被执行到的次数,示例如图3所示。
步骤二:加载该程序的全部共4115个测试用例,运行插桩后的print-tokens2-v6。共有3597个测试用例使程序运行正确,518个使程序运行错误。
步骤三:分别收集程序运行正确时和运行错误时,桩函数的输出信息。(以上三步在Linux操作系统下运行,以下四步均在windows操作系统下运行)
步骤四:对得到的输出信息进行预处理,统计出每个谓词在所有失败测试用例下出现频率最高的前N个(2<N<6,N取整数)执行次数。为了方便叙述,选择N=3。具体操作分以下三步:
(一)统计程序运行失败下的错误数组A1。每一个数组元素中存放着一个失败测试用例下各插桩谓词所输出的第二种类型信息。用这种方法统计,可以得到一个长度为518的错误数组
(二)利用得到的错误数组A1,统计单个谓词在所有失败测试用例下的执行次数以及相应执行次数的出现频率,将结果记录在矩阵A2中。用这种方法统计,可得到一个205行的矩阵矩阵A2中第一行只有一个元素a11,记录了第一个谓词(编号为0)的执行次数=1,出现频率=518。第二行包含两个元素a21和a22。a21记录了第二个谓词(编号为1)的执行次数=0,出现频率=235。a22记录了第二个谓词(编号为1)的执行次数=1,出现频率=283。由于篇幅原因,此处就不再一一列举矩阵A2中的其他元素。
(三)在矩阵A2的每一行中挑选出执行次数出现频率最高的前3位,分别确定每一位所对应的执行次数,计算相应执行次数的权值。
步骤五:针对谓词P134,排名前3位的执行次数i分别=1,2,3,对应的权值x1=0.598,x2=0.204,x3=0.090,根据i的不同取值挑选相应的计算流程计算谓词缺陷关联度。最后利用加权求和公式对3个计算结果进行综合,得到谓词P134的缺陷关联度Suspicious(P134)=0.4024。
步骤六:重复步骤五,直到计算出所有谓词的缺陷关联度。当N=3时,将所有205个谓词依据缺陷关联度从高到低排序,所得排序前10位的谓词为135、136、137、133、134、15、3、89、0、111(当N=4时,所得排序前10位的谓词为135、136、137、133、134、89、111、85、3、15;当N=5时,所得排序前10位的谓词为135、136、137、133、134、111、85、89、3、15)。
步骤七:利用此排序对谓词依次查找。已知第134号谓词含有缺陷,则在序列中的第5个谓词即可找到缺陷。
对Siemens-Suit软件包中的全部共132个带缺陷的程序版本运用上述方法和现有的一些算法分别进行缺陷定位,并引入一种新的评价标准,用Ptotal来表示程序中谓词的总数目,用Pdefect表示含有缺陷的谓词,用Psuspect来表示已检查的谓词的个数,则Psuspect就是在谓词排序列表上缺陷关联度大于Pdefect的所有谓词的个数,用Pefficiency来表示缺陷定位的效率,则Pefficiency越小表示定位效率越高。
利用此评价标准,将本发明与Sober算法、CBI算法、F-test算法、t-test算法、Wilcoxon算法和Mann-Whitney算法的定位效果做比较。图6~图8为本发明与各已有算法的定位效果对比(注:CBI算法、Sober算法、F-test算法、T-test算法、Wilcoxon算法和Mann-Whitney算法为现有的几种典型算法,其中CBI算法由里布里特等人在“一种可扩展的基于统计学的故障隔离方法”一文中提出,详见2005年《美国计算机学会<编程语言的设计和实现>会议》;Sober算法由刘超等人在“基于统计学的程序纠错:一种基于假设检验的方法”一文中提出,详见2006年《电机及电子学工程师联合会软件工程》汇刊;F-test算法、T-test算法由戴沃在2008年于“工程和科学中的概率和统计学”一文中提出;Wilcoxon算法和Mann-Whitney算法由张震宇等人在“非参数统计学缺陷定位”一文中提出,详见2011年《系统和软件》期刊)。
从图6~图8中可以看到,在检查了40%的谓词时本发明就能检查到超过70%的缺陷,而其他已有算法找到的缺陷均低于这一标准,即本发明较其他已有算法在检查同等数量的代码时总是能够找到更多的缺陷。所以本发明在对缺陷定位的精确度方面均明显优于现有算法。
图9~图23为Siemens-Suit软件包中七段程序分别用本发明(N分别=3、4、5时)与已有算法进行缺陷定位实验结果的对比。从图9~图23中可发现本发明在七段程序中均能表现出很好的定位效果,与现有算法定位效果相比,仅是在程序schedule、print-tokens、print-tokens2和schedule2中的优势不是特别的明显。此外,从软件调试角度出发,软件测试人员总是希望在检查尽量少代码的前提下发现尽量多的缺陷,按照本发明得出的谓词排序或是现有其他算法得出的谓词排序来检查代码时,可以发现,本发明得到的谓词排序能够在检查到前30%的谓词时查到大多数的缺陷,而现有其他算法则相对较差。
从以上实验数据中得出如下结论:
(1)本发明提供的谓词排序能查找前30%的谓词时准确定位到大多数的缺陷,而现有其他算法的定位效果均不如本发明。
(2)本发明在定位大多数程序的缺陷时定位效率都高于现有其他算法。
综上所述,本发明在缺陷定位方面优于现有其他算法。

Claims (1)

1.一种基于谓词执行信息分析的自适应软件缺陷定位方法,其特征在于:该方法具体步骤如下: 
步骤一:对含缺陷的程序插桩;对程序中的分支和返回值:if、while、for以及return语句中的谓词进行插桩,桩函数要求在程序运行时输出相应的谓词执行信息; 
步骤二:加载程序的全部测试用例,运行插有桩函数的待测程序; 
步骤三:分别收集程序运行成功和运行失败时桩函数的输出信息;由于插桩程序设计的不同,桩函数输出的谓词执行信息可分为两类,一种是:谓词的编号,谓词在程序运行时的执行状态;另一种是:用每6个数表示一个谓词,其中第一个数表示该谓词判断为“真”的次数,第二个数表示该谓词判断为“假”的次数,第三个数表示该谓词被执行到的次数; 
步骤四:对每个谓词在所有失败测试用例下的执行信息进行预处理,该步骤分为三小步: 
(一)利用桩函数的第二种类型输出信息,统计程序运行失败时的错误矩阵 其中表示第k个失败测试用例下,插桩谓词i输出的第二种类型信息中的第j个数;其中,1≤k≤m,m表示失败测试用例总数;1≤i≤n,n表示插桩谓词总数;1≤j≤6,j取整数; 
(二)在错误矩阵A1中统计单个谓词的执行次数以及执行次数出现频率, 将执行次数和相应的执行次数出现频率按谓词编号存储在矩阵 中;第i行第j列元素aij中记录着谓词i的一个执行次数以及该执行次数所对应的出现频率; 
(三)在矩阵A2的每一行中确定出现频率最高的前N个执行次数,2<N<6,N取整数,针对选出的执行次数,计算权值xj=运行时出现该执行次数的失败测试用例数目/总失败测试用例数目,保存计算结果;其中,1≤j≤N; 
步骤五:计算谓词P的缺陷关联度;该步骤分为两小步: 
(一)根据第四步中得到的谓词P出现频率最高的前N个执行次数,2<N<6,N取整数,选择相应的流程来计算缺陷关联度;该步骤分为三小步: 
(1)若前N个执行次数,2<N<6,N取整数中包含有执行次数i=0,则根据流程一计算;流程一描述如下: 
①计算其中F(P)为谓词P被判断为“真”时,运行失败的测试用例数目,S(P)为谓词P被判断为“真”时,运行成功的测试用例数目; 
②计算
其中F(Observed)为谓词P被执行到时即指被判断为“真”或“假”,运行失败的测试用例数目,S(Observed)为谓词P被执行到时,运行成功的测试用例数目; 
③计算Increase(P)=failure(P)-context(P); 
④判断Increase(P)的取值,若为正值,则转第⑤步,否则返回缺陷关联度值Suspicious(P)=0; 
⑤判断失败测试用例总数m的取值,若m=1,则转第⑥步,否则转第⑦步; 
⑥返回谓词P的缺陷关联度计算值,
⑦返回谓词P的缺陷关联度计算值, 
(2)若前N个执行次数,2<N<6,N取整数中包含有执行次数i=1,则根据流程二计算;流程二描述如下: 
①计算程序运行失败时谓词P被判断为“真”的概率值Xf(P), 其中nt(P)表示在程序一次失败运行中,谓词P被判断为“真”的次数,nf(P)表示在程序一次失败运行中,谓词P被判断为“假”的次数;若nt(P)+nf(P)=0,则该次运行的φf(P)=0.5,n为失败测试用例的总数; 
②计算程序运行成功时谓词P被判断为“真”的概率值Xs(P), 其中nt(P)表示在程序一次成功运行中,谓词P被判断为“真”的次数,nf(P)表示在程序一次成功运行中,谓词P被判断为“假”的次数;若nt(P)+nf(P)=0,则该次运行的φs(P)=0.5,m为成功测试用例的总数; 
③如果谓词P在所有失败测试用例中均没有被执行即指没有被判断为 “真”或“假”,则返回谓词P的缺陷关联度值Suspicious(P)=0;否则转第④步; 
④返回谓词P的缺陷关联度值计算值,计算公式为Suspicious(P)=|Xf(P)-Xs(P)|; 
(3)若前N个执行次数,2<N<6,N取整数中包含有执行次数i≥2即i取2,3,4,5及其以上整数时,则根据流程三计算;流程三描述如下: 
①计算所有成功测试用例下谓词P的成功执行序列向量P+;方法是: 
1)利用桩函数的第一种类型输出信息,计算程序第k次成功运行下谓词P的成功执行序列集合其中,中的上标m表示在程序第k次成功运行中谓词P只被执行了m次;表示程序第k次成功运行中第j次经过谓词P时,谓词P的判断结果,若判断为“真”,否则其中,1≤j≤m; 
2)针对成功执行序列统计谓词P的M位成功执行序列向量 其中为成功执行序列包含子序列a1a2…aM的个数,a l =0或1,l=1,2,…,M,a1a2…aM 的排列组合;获取M位成功执行序列向量的具体操作是: 
a.根据确定的执行次数i选择成功执行序列向量的位数M;若i=2,则M=2;若i=3,则M=3;若i=4,则M=4;若i≥5,则M=5;i=2时,选择谓词成功执行序列向量的位数M=2,包含22=4个值,为n01、n10、n00,n11这四个元素; 
b.根据选择的成功执行序列向量的位数M确定的值;当m≥M 时,为成功执行序列中包含子序列a1a2…aM的个数;当m=0时,中各值均等于零;当m<M时,则采取等概率补齐的方式对相应元素进行赋值,其他的元素赋值为零;其中,等概率补齐的方式为或1,l=1,2,…N-x;当选择谓词成功执行序列向量的位数M=2时,若谓词P执行了多次,则n01、n10、n00,n11分别记录执行序列中含有子序列01、10、00,11的个数;若谓词P没有执行,则n01=n10=n11=n00=0;若执行次数小于向量位数时,当只执行了一次,谓词P执行序列为0时,设定n00=n01=0.5,n10=n11=0;谓词P执行序列为1时,设定n10=n11=0.5,n01=n00=0; 
3)将谓词P的m个成功执行序列向量相加,进行归一化处理,得到谓词P的成功执行序列向量P+,即
②计算所有失败测试用例下谓词P的失败执行序列向量P_;方法是:前两步与上面叙述的1)和2)相同,只是将成功执行序列换成失败执行序列;3)将谓词P的n个失败执行序列向量相加,进行归一化处理,得到谓词P的失败执行序列向量P_,即
③如果谓词P在所有测试用例中,包括成功和失败测试用例或者在所有失败测试用例中均没有被执行到,则返回缺陷关联度值Suspicious(P)=0,否则转第④步; 
④利用谓词P的成功执行序列向量P+和失败执行序列向量P-,计算谓词P的缺陷关联度,定义单个谓词的缺陷关联度公式Suspicious(P)=|P+-P-|; 
(二)采用公式Suspicious(P)=a1×R1+a2×R2+…aN×RN来最终对谓词P的缺陷关联度进行综合;其中a1,a2,…,aN为步骤四中计算出来的权值,R1,R2,…,RN为步骤五中第(一)小步对应的计算结果;若a1为出现执行次数为零次的失败测试用例数目占所有失败测试用例的比例,R1则为用流程一进行计算的结果; 
步骤六:对程序中的每个谓词都执行步骤五,直至得到全部谓词的缺陷关联度;按照缺陷关联度从高到低,将所有谓词进行排序; 
步骤七:根据步骤六中得到的谓词排序表,对谓词依序进行查找,直到找到缺陷为止。 
CN201210037955.5A 2012-02-17 2012-02-17 一种基于谓词执行信息分析的自适应软件缺陷定位方法 Active CN102622295B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210037955.5A CN102622295B (zh) 2012-02-17 2012-02-17 一种基于谓词执行信息分析的自适应软件缺陷定位方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210037955.5A CN102622295B (zh) 2012-02-17 2012-02-17 一种基于谓词执行信息分析的自适应软件缺陷定位方法

Publications (2)

Publication Number Publication Date
CN102622295A CN102622295A (zh) 2012-08-01
CN102622295B true CN102622295B (zh) 2015-01-14

Family

ID=46562222

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210037955.5A Active CN102622295B (zh) 2012-02-17 2012-02-17 一种基于谓词执行信息分析的自适应软件缺陷定位方法

Country Status (1)

Country Link
CN (1) CN102622295B (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102831065B (zh) * 2012-09-13 2015-02-04 北京航空航天大学 一种面向巧合一致性问题的统计学软件缺陷定位方法
CN105843661B (zh) * 2016-03-24 2019-03-29 中国农业银行股份有限公司 一种面向主机系统的代码重定位方法及其系统
CN109992493B (zh) * 2017-12-29 2021-12-10 宁波方太厨具有限公司 一种排除燃气热水器软件异常的测试方法
CN108416124B (zh) * 2018-02-13 2022-03-25 西安理工大学 一种基于谓词逻辑的规范重构表示方法
CN113064824B (zh) * 2021-03-31 2022-12-02 重庆紫光华山智安科技有限公司 结果分析方法和装置、电子设备及存储介质
CN113688061A (zh) * 2021-10-27 2021-11-23 南开大学 一种基于特征选择的程序缺陷定位方法

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101872325A (zh) * 2010-06-25 2010-10-27 北京航空航天大学 一种基于谓词执行序列的软件动态缺陷定位方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101019210B1 (ko) * 2007-04-25 2011-03-04 이화여자대학교 산학협력단 이뮬레이트를 활용한 임베디드 소프트웨어 테스트 장치 및그 방법

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101872325A (zh) * 2010-06-25 2010-10-27 北京航空航天大学 一种基于谓词执行序列的软件动态缺陷定位方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Non-parametric statsitical fault localization;Zhenyu Zhang等;《The Journal of Systems and Software》;20110630;第84卷(第6期);第885-905页 *
自动化软件错误定位技术研究进展;虞凯等;《计算机学报》;20110815;第34卷(第8期);第1411-1422页 *

Also Published As

Publication number Publication date
CN102622295A (zh) 2012-08-01

Similar Documents

Publication Publication Date Title
CN102622295B (zh) 一种基于谓词执行信息分析的自适应软件缺陷定位方法
WO2021179574A1 (zh) 根因定位方法、装置、计算机设备和存储介质
CN102508780B (zh) 一种用于软件测试的交叉式动态法和装置
CN111222683B (zh) 一种基于pca-knn的tbm施工围岩综合分级预测方法
CN102708045B (zh) 一种缓解路径爆炸的动态符号执行方法
CN101872325B (zh) 一种基于谓词执行序列的软件动态缺陷定位方法
CN105260312B (zh) 一种多核实时系统应用数据竞争错误的调试方法
CN101706749B (zh) 基于软件安全缺陷检测的综合处理方法
CN110515826B (zh) 一种基于次数频谱与神经网络算法的软件缺陷定位方法
CN103559122A (zh) 基于程序行为切片的测试案例约减方法
CN106546278B (zh) 验证核安全级仪控平台安全失效率的统计测试装置及方法
CN108595336A (zh) 一种基于以太网的计算机软件测试系统
CN111782532A (zh) 一种基于网络异常节点分析的软件故障定位方法及系统
CN103019943B (zh) 一种面向失败测试用例稀少情况的软件错误定位方法
CN111767546B (zh) 一种基于深度学习的输入结构推断方法和装置
CN106598843B (zh) 一种基于程序分析的软件日志行为自动识别方法
CN112083275A (zh) 一种配网故障类型识别方法及系统
CN110083538A (zh) 一种并发程序噪声注入方法
CN114780374A (zh) 一种基于细粒度优化选项配置差分的编译器缺陷定位方法
CN115186860A (zh) 基于压力数据聚类的供水管网复杂多漏损识别方法、设备、介质、产品
CN107133168A (zh) 一种事件序列故障定位方法
CN102938068A (zh) 桥梁结构多体系损伤识别方法
CN103092714A (zh) 用于容错系统的处理器瞬时故障检测方法
CN102831065B (zh) 一种面向巧合一致性问题的统计学软件缺陷定位方法
CN100407161C (zh) 软件动态聚类测试方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant