CN103995780B - 一种基于语句频度统计的程序错误定位方法 - Google Patents
一种基于语句频度统计的程序错误定位方法 Download PDFInfo
- Publication number
- CN103995780B CN103995780B CN201410241885.4A CN201410241885A CN103995780B CN 103995780 B CN103995780 B CN 103995780B CN 201410241885 A CN201410241885 A CN 201410241885A CN 103995780 B CN103995780 B CN 103995780B
- Authority
- CN
- China
- Prior art keywords
- statement
- frequency
- test case
- mistake
- software program
- 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
Links
Landscapes
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于语句频度统计的程序错误定位方法,该方法对已有的Tarantula错误定位方法进行了分析和改进,在原来的方法基础上考虑了语句的具体执行频度,然后将语句频度映射为0~1之间的数,提出了基于语句频度统计的错误定位方法。故本发明充分考虑了语句的具体执行频度而不只是统计语句在每次执行时的覆盖情况,在效率和稳定性方面要优于Tarantula方法;只要某两条语句对应的测试用例语句频度不同,那么它们的可疑度值就会不同,因此本发明定位更准确,稳定性也有较大提高,对于出现在循环语句或者循环体中的错误具有较强的检测能力。
Description
技术领域
本发明属于软件程序错误定位检测技术领域,具体涉及一种基于语句频度统计的程序错误定位方法。
背景技术
随着信息技术的高速发展,我们对软件功能的要求不断增加,软件规模也随之越变越大,所有这些都导致了软件的高出错率。因此,如何定位到软件中错误发生的位置就变得十分重要。
错误定位的目的就是寻找程序中出现的错误。传统的用于错误定位的方法是调试。程序员先在程序中设置一个或多个断点,接着从断点处开始执行失败的测试用例,检查执行中程序的运行状态,由此找到错误的原因。这种方法存在几个明显的缺点:首先断点在程序中的位置难以确定;其次这种方法工作量非常庞大,所以学者们提出了许多自动化的错误定位方法。这些方法大致可以分为两种:基于频谱的错误定位方法(SFL)和基于模型的诊断和调试方法(MBD)。由于软件系统的复杂性,大多数基于模型的方法都被局限于小程序。基于频谱的方法因为独立于系统模型而且实现比较简单,所以得到了开发人员的青睐。
当前关于错误定位方法的研究有很多,其中Delta调试方法(文献:Cleve H,Zeller A.Locating causes of program failures[C]//Proc of the27thinternational conference on Software Engineering.IEEE Computer Society,2005:342-351.)可以简化测试用例,隔离错误的原因;该方法通过一系列的状态来描述程序的执行,状态包括变量和它们对应的变量值。它通过不断迭代运行程序,交换成功运行和失败运行的内存状态来定位错误,因此代价和开销比较大。Cleve H定位方法(文献:Cleve H,Zeller A.Locating causes of program failures[C]//Proc of27th InternationalConference on Software Engineering.St.Louis,MO,USA,2005:342-351)则关注与错误相关的那些变量及其对应的变量值,同时,他们记录引起程序转变发生的时间点来定位错误。
程序谱在程序执行测试用例时,收集并统计分析程序产生的频谱信息,得到程序中每条语句在测试用例中的覆盖信息,然后利用这些信息来计算每条可执行语句的可疑度,最后将所有语句按照可疑度进行从大到小排序以便排查出错误的语句。Tarantula方法(文献:Jones J A,Harrold M J.Empirical evaluation of the tarantula automaticfault-localization technique[C]//Proc of the20th IEEE/ACM internationalConference on Automated software engineering,2005,273-282)是基于频谱的错误定位方法中最为经典的一种。该方法的主要思想是一个语句被失败测试用例执行的次数多于被成功测试用例执行的次数,那么该语句更可能是错误的。它使用的信息有:每条语句的覆盖信息,测试用例执行的结果以及程序的源代码。它是一种基于程序谱的自动化错误定位方法。对于语句s,它的可疑度计算公式如下:
其中:failed(s)、passed(s)分别表示语句s被失败和成功的测试用例覆盖的次数,Tf、Tp分别表示测试组件中运行失败和成功的总个数。
该方法只是简单地统计语句在每次执行测试用例时的覆盖情况,只要语句被覆盖,它在这次运行中的执行次数就为1,反之为0,忽略了其真正的执行频度。
发明内容
针对现有技术所存在的上述技术问题,本发明提供了一种基于语句频度统计的程序错误定位方法,
一种基于语句频度统计的程序错误定位方法,包括如下步骤:
(1)统计软件程序中各条语句在每组测试用例下的语句频度,得到对应的语句频度矩阵;
(2)统计每组测试用例在软件程序运行下的执行结果:正确或错误;
(3)根据所述的语句频度矩阵,计算各条语句在每组测试用例下的带权频度,并利用函数f(x)将所述的带权频度映射到0~1之间;
(4)利用映射于0~1之间的带权频度计算每条语句的错误可疑度,进而根据所述的错误可疑度从高到低对软件程序中的语句进行排序并逐条进行错误排查。
所述的语句频度的定义为:以某一测试用例作为软件程序的输入,在软件程序对于该测试用例的整个运行过程中某一条语句的执行次数即为该语句在该测试用例下的语句频度。
所述的语句频度矩阵的维度为m×n,m为软件程序中的语句总数,n为测试用例总数;该矩阵中第i行第j列的元素值为第i条语句在第j组测试用例下的语句频度,i和j均为自然数且1≤i≤m,1≤j≤n。
所述的步骤(3)中根据以下算式计算各条语句在每组测试用例下的带权频度:
uij=ωijsij
其中:uij为软件程序中第i条语句在第j组测试用例下的带权频度,sij为语句频度矩阵中第i行第j列的元素值即软件程序中第i条语句在第j组测试用例下的语句频度,ωij为sij对应的权重系数。
所述的函数f(x)满足以下两个条件:
a.f(x)在(0,+∞)单调递增,且f(0)=0;
b.x∈(0,+∞),f(x)∈(0,1)。
所述的函数f(x)采用双曲正切函数,其表达式如下:
其中:x为函数f(x)的变量且为带权频度。
所述的步骤(4)中根据以下算式计算每条语句的错误可疑度:
其中:suspi为软件程序中第i条语句的错误可疑度,vik为软件程序中第i条语句在第k组错误测试用例下的映射于0~1之间的带权频度,vip为软件程序中第i条语句在第p组正确测试用例下的映射于0~1之间的带权频度,所述的错误测试用例和正确测试用例即对应执行结果为错误和正确的测试用例,Tf和Tp分别为所有测试用例中错误测试用例和正确测试用例的个数,k和p均为自然数且1≤k≤Tf,1≤p≤Tp。
对于大型的程序,用自动化错误定位方法来获得语句或者谓词的可疑度值,然后按照可疑度大小对它们进行降序排列,从上到下检测可疑的语句或谓词直到找到错误,这样可以节省很多时间。本发明分析了Tarantula方法的特点,并且进一步改进了原来的方法,提出了基于语句频度统计的错误定位方法,充分考虑了语句的具体执行频度而不只是统计语句在每次执行时的覆盖情况。
我们采用需要检测的语句百分比和稳定性系数来衡量错误定位方法的效率和稳定性,由此评估两种错误定位方法。实验结果表明:基于语句频度统计的错误定位方法在效率和稳定性方面要优于Tarantula方法;只要某两条语句对应的测试用例语句频度不同,那么它们的可疑度值就会不同,因此本发明定位更准确,稳定性有较大提高,对于出现在循环语句或者循环体中的错误具有较强的检测能力。
附图说明
图1为本发明的算法流程示意图。
图2为本发明与Tarantula方法在各程序下关于检测语句百分比的对比图。
图3为本发明方法在各程序下关于错误定位效率增长率的示意图。
图4为本发明方法在各程序下关于稳定性增长率的示意图。
具体实施方式
为了更为具体地描述本发明,下面结合附图及具体实施方式对本发明的技术方案进行详细说明。
本实施方式先给出一些记号和形式化定义:
定义1.语句频度是一个程序中某条的语句执行次数。sij表示执行第j个测试用例时si的语句频度。
定义2.设scount是指与错误语句可疑度值相同的语句数量,Tcount是总的可执行语句数量,稳定性指数可以被表示为:
q=1-scount/Tcount
本实施方式所指的稳定性好是能把较少的语句度量为与错误语句相同的可疑度值,我们采用q评价稳定性好坏,q越大稳定性越好。
定义3.假设n维向量T=(T1,T2,...,Tn)是一个测试组件,其中Ti是程序的测试用例。执行T中的每一个测试用例t,失败执行的次数当且仅当f(t)≠h(t)时,σ(f(t),h(t))=1,其他情况σ(f(t),h(t))=0。f(t)是的t运行结果,h(t)为正确版本的结果,只要两者不相等,我们就认为这次执行是失败的。成功执行的次数
我们用gcov来获得程序中每条语句的覆盖信息,然后计算它们的可疑度;当对语句的可疑度进行排序时,如果有几条语句的可疑度相同,则它们的顺序由它们在代码中的行号来确定:行号小的排在前面,行号大排在后面。
Tarantula方法的可疑度公式简单地将某个测试用例运行时语句的执行次数映射为0和1,忽略了真正的执行次数。如果在一次执行中,语句被覆盖,我们就把该语句的执行次数记为1,否则记为0。然而实际上,如果两条语句的语句频度不同,他们的可疑度也应该不同。例如,一个失败的测试用例只执行了一次语句s1,但是执行了两次语句s2,那么s2更可能是出错语句,它的可疑度也应该更大。
如表1所示,程序function中错误语句是s6,正确的写法为“else if(str[t]>='5'&&str[t]<='9')”。从表1中我们可以发现有三条语句的可疑度值都为0.6,但实际上只有s6是错误的,所以我们应该尽量避免把过多的语句度量为与错误语句相同的可疑度,也就是提高错误定位方法的稳定性。
表1
Tarantula方法最大的一个缺点是不适用于循环语句,而本实施方式在很大程度上可以解决这个问题。如图1所示,给定一个n条语句的程序,m个测试用例。语句si在第k个测试用例中的语句频度为sij(i=1,2...m,k=1,2...n.sij是0到+∞之间的一个整数),我们把神经网络中类似于sigmoid单元的东西引入错误定位。输入向量(si1,si2...sin)可以看作是语句si在第k个测试用例中的语句频度。(wi1,wi2...win)是输入向量(si1,si2...sin)对应的权重向量,表示它们对可疑度的贡献度。我们假设每个测试用例中的可执行语句对可疑度起的作用相同,那么(wi1,wi2...win)就是(0,1,1...1)。这种情况下两条语句的可疑度大小就取决于他们的语句频度。带权语句频度|sij|表达式为sijwij。接下来我们需要找到一个映射函数,把带权语句频度映射为0~1之间的一个值。所以映射函数应该具有这样的特征:单调递增且函数在(0,+∞)上的值域为(0,1)。
对于任意一个函数f(x),满足以下条件:
1)函数在(0,+∞)单调递增,且f(0)=0;
2)x∈(0,+∞),f(x)∈(0,1)。
那么基于语句频度统计的错误定位方法计算出的可疑度排序顺序是确定的。
证明:设h(x),g(x)为任意两个满足上述条件的函数,我们需要证明:s1和s2是某个程序中的任意两条不同的语句,给定映射函数h(x),有susp(s1)>susp(s2),那么映射函数改成g(x)时,也有susp(s1)>susp(s2)。
对于h(x):
首先,我们证明若passed%(s1),passed%(s2)≠0,有:
充分性:
susp(s1)>susp(s2)
必要性:
同理,对于函数g(x):
若passed%(s1)=0且passed%(s2)=0则susp(s1)=susp(s2)=1,与susp(s1)>susp(s2)矛盾,所以passed%(s1)和passed%(s2)不同时为0;同理,passed%(s2)≠0。
下面证明passed%(s1)=0,passed%(s2)=0的情况。这时,对于h(x),有susp(s1)=1>susp(s2),对于g(x),也有susp(s1)=1>susp(s2)。
综上,无论映射函数是h(x)或g(x),语句s1和s2的可疑度排序不变,即函数f(x)的条件成立。
因此,我们可以选择任意满足函数f(x)两个条件的函数作为映射函数。本实施方式我们以双曲正切函数为例,利用双曲正切函数将|sik|映射为(0,1)之间的一个值。
在Tarantula方法的可疑度公式中,faild(si)和passed(si)为整数,而在本实施方式中,它们是浮点数,被记为Failed(si)和Passed(si):
其中,|sik|F=sikwik表示软件程序中第i条语句在第k组错误测试用例下的带权频度;|sik|P=sipwip表示软件程序中第i条语句在第p组正确测试用例下的带权频度。令 则我们可以得到基于语句频度统计的语句可疑度公式:
最终,我们给出本实施方式错误定位算法的执行流程如下:
把以上算法应用于程序function,可以得到表2:
表2
比较表2和表1,我们发现在表1的中间部分,语句的执行次数只有0或1次,而表2中统计的是语句频度。Tarantula方法需要检测4条语句,基于本实施方式只需要检测三条语句。也就是说本发明在一定程度上提高了错误定位的效率。稳定性方面,原来方法的稳定性系数q=0.63,改善之后的稳定性系数为1.00。单这个小例子而言,基于语句频度统计的错误定位方法要比Tarantula方法更好。
接下去,我们对以下两个错误定位中常用的程序foo.java(s5为错误语句,正确的写法是“y=-x[i]+1/x[i];”),mid.c(求中间值的程序,错误语句为s2,正确写法为“m=z;”)以及西门子测试套件中的print_tokens(7个错误版本),replace(32个错误版本)程序进行了实验。
表3
public static void foo(int[]x){ | int mid(int x,int y,int z){ | |
int m,x,y,z; | ||
S1 | int y;int z; | read(x,y,z); |
S2 | for(int i=0;i<x.length;i++){ | m=z-1;//debug |
S3 | y=0; | if(y<z){ |
S4 | if(x[i]<0){ | if(x<y) |
S5 | y=-x[i]+1/x[i];//debug | m=y; |
S6 | }else if(x[i]>0){wenheu | else if(x<z) |
S7 | y=x[i]-1/x[i]; | m=x;} |
{ | else{ | |
S8 | if(y==0){ | if(x>y) |
S9 | z=1; | m=y; |
}else{ | ||
S10 | z=2;}}} | else if(x>z) |
S11 | m=x;} | |
S12 | return m;} |
实验结果表明Tarantula方法针对出现在if语句中的错误要比本实施方式略好;但当错误出现在其他语句尤其是循环语句中或者是循环体中,本实施方式要优于Tarantula方法,此时两种方法需要检测的语句百分比如图2所示。图3反映了本实施方式只需要检测的语句百分比更少,因此错误定位效率也更高,图4表明本实施方式的稳定性更强。之所以会出现这样的结果,是因为Tarantula方法的可疑度公式把所有语句的执行次数简单的归为执行或不执行,这样只要对应的测试用例某两条语句都执行(或者都不执行),那么他们的可疑度值就是相同的。而本实施方式的可疑度计算公式只要某两条语句对应的测试用例语句频度不同,那么它们的可疑度值就会不同,因此定位更准确,稳定性也增强。本发明方法比较适用于有循环的程序,但像mid.c这样没有循环的程序,所有的语句只执行一次或者没有执行,那么本实施方式和Tarantula方法是一样的,这时候,sik的取值只有0或1。
Claims (1)
1.一种基于语句频度统计的程序错误定位方法,包括如下步骤:
(1)统计软件程序中各条语句在每组测试用例下的语句频度,得到对应的语句频度矩阵;
所述的语句频度的定义为:以某一测试用例作为软件程序的输入,在软件程序对于该测试用例的整个运行过程中某一条语句的执行次数即为该语句在该测试用例下的语句频度;
所述的语句频度矩阵的维度为m×n,m为软件程序中的语句总数,n为测试用例总数;该矩阵中第i行第j列的元素值为第i条语句在第j组测试用例下的语句频度,i和j均为自然数且1≤i≤m,1≤j≤n;
(2)统计每组测试用例在软件程序运行下的执行结果:正确或错误;
(3)根据所述的语句频度矩阵,根据以下算式计算各条语句在每组测试用例下的带权频度,并利用函数f(x)将所述的带权频度映射到0~1之间;
uij=ωijsij
其中:uij为软件程序中第i条语句在第j组测试用例下的带权频度,sij为语句频度矩阵中第i行第j列的元素值即软件程序中第i条语句在第j组测试用例下的语句频度,ωij为sij对应的权重系数;
所述的函数f(x)满足以下两个条件:
a.f(x)在(0,+∞)单调递增,且f(0)=0;
b.x∈(0,+∞),f(x)∈(0,1);
函数f(x)采用双曲正切函数,其表达式如下:
其中:x为函数f(x)的变量且为带权频度;
(4)利用映射于0~1之间的带权频度根据以下算式计算每条语句的错误可疑度,进而根据所述的错误可疑度从高到低对软件程序中的语句进行排序并逐条进行错误排查;
其中:suspi为软件程序中第i条语句的错误可疑度,vik为软件程序中第i条语句在第k组错误测试用例下的映射于0~1之间的带权频度,vip为软件程序中第i条语句在第p组正确测试用例下的映射于0~1之间的带权频度,所述的错误测试用例和正确测试用例即对应执行结果为错误和正确的测试用例,Tf和Tp分别为所有测试用例中错误测试用例和正确测试用例的个数,k和p均为自然数且1≤k≤Tf,1≤p≤Tp。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410241885.4A CN103995780B (zh) | 2014-05-30 | 2014-05-30 | 一种基于语句频度统计的程序错误定位方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410241885.4A CN103995780B (zh) | 2014-05-30 | 2014-05-30 | 一种基于语句频度统计的程序错误定位方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103995780A CN103995780A (zh) | 2014-08-20 |
CN103995780B true CN103995780B (zh) | 2017-01-04 |
Family
ID=51309952
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410241885.4A Active CN103995780B (zh) | 2014-05-30 | 2014-05-30 | 一种基于语句频度统计的程序错误定位方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103995780B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104317707B (zh) * | 2014-10-15 | 2017-09-29 | 中国科学院软件研究所 | 一种基于程序结构影响感知的软件错误定位方法 |
CN104317706B (zh) * | 2014-10-15 | 2017-08-25 | 中国科学院软件研究所 | 一种基于预运算的程序变异软件错误定位方法 |
CN104750608B (zh) * | 2015-03-25 | 2017-10-27 | 南京大学 | 一种程序中基于动态符号执行的自动错误定位方法 |
CN105468517B (zh) * | 2015-11-10 | 2018-03-02 | 中国矿业大学 | 一种基于黑盒测试用例约简的统计错误定位方法 |
CN106886490B (zh) * | 2016-12-30 | 2019-09-20 | 浙江理工大学 | 一种基于失效轨迹的程序错误定位方法 |
CN109857675B (zh) * | 2019-02-28 | 2022-05-17 | 福建师范大学 | 一种利用语句类型的程序错误定位方法 |
CN110209573B (zh) * | 2019-05-08 | 2023-06-02 | 三峡大学 | 一种增强软件故障定位效果的方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6978401B2 (en) * | 2002-08-01 | 2005-12-20 | Sun Microsystems, Inc. | Software application test coverage analyzer |
CN102521130A (zh) * | 2011-12-13 | 2012-06-27 | 南京大学 | 一种基于聚类不变式分析的错误定位方法 |
CN103136103A (zh) * | 2013-03-26 | 2013-06-05 | 哈尔滨工业大学 | 一种面向错误定位需求的测试用例约简方法 |
-
2014
- 2014-05-30 CN CN201410241885.4A patent/CN103995780B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6978401B2 (en) * | 2002-08-01 | 2005-12-20 | Sun Microsystems, Inc. | Software application test coverage analyzer |
CN102521130A (zh) * | 2011-12-13 | 2012-06-27 | 南京大学 | 一种基于聚类不变式分析的错误定位方法 |
CN103136103A (zh) * | 2013-03-26 | 2013-06-05 | 哈尔滨工业大学 | 一种面向错误定位需求的测试用例约简方法 |
Non-Patent Citations (1)
Title |
---|
通过增大边际权重提高基于频谱的错误定位效率;谭德贵等;《计算机学报》;20101231;第33卷(第12期);第2335-2342页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103995780A (zh) | 2014-08-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103995780B (zh) | 一种基于语句频度统计的程序错误定位方法 | |
US9983984B2 (en) | Automated modularization of graphical user interface test cases | |
Richardson et al. | An analysis of test data selection criteria using the RELAY model of fault detection | |
Decasse et al. | A review of automated debugging systems: Knowledge, strategies and techniques | |
Cao et al. | On the correlation between the effectiveness of metamorphic relations and dissimilarities of test case executions | |
CN105893256A (zh) | 基于机器学习算法的软件故障定位方法 | |
Perez et al. | A dynamic code coverage approach to maximize fault localization efficiency | |
Lyu et al. | An empirical study on testing and fault tolerance for software reliability engineering | |
Briand | A critical analysis of empirical research in software testing | |
CN105786678A (zh) | 一种基于相关性模型的测试性预计方法 | |
US9208272B2 (en) | Apparatus and method thereof for hybrid timing exception verification of an integrated circuit design | |
US20100333073A1 (en) | Systems and methods for automated generation of software tests based on modeling the software test domain | |
CN106886490B (zh) | 一种基于失效轨迹的程序错误定位方法 | |
Neelofar et al. | Improving spectral‐based fault localization using static analysis | |
Bekkouche et al. | LocFaults: A new flow-driven and constraint-based error localization approach | |
Wang et al. | Spectrum-based fault localization via enlarging non-fault region to improve fault absolute ranking | |
CN104317707A (zh) | 一种基于程序结构影响感知的软件错误定位方法 | |
Dakhel et al. | Effective test generation using pre-trained large language models and mutation testing | |
CN103019943B (zh) | 一种面向失败测试用例稀少情况的软件错误定位方法 | |
CN104503908A (zh) | 基于谓词频率统计的软件故障定位方法 | |
CN106776283A (zh) | 一种基于条件概率的程序错误定位方法 | |
CN117194258A (zh) | 一种代码大模型的评测方法和装置 | |
Seiler et al. | Comparing traceability through information retrieval, commits, interaction logs, and tags | |
Sharma et al. | Automated checking of the violation of precedence of conditions in else-if constructs in students' programs | |
CN107102942A (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 | ||
TR01 | Transfer of patent right |
Effective date of registration: 20201013 Address after: No.150 Pingdong Avenue, Pingchao Town, Tongzhou District, Nantong City, Jiangsu Province, 226000 Patentee after: Jiangsu Yongda power telecommunication installation engineering Co., Ltd Address before: Hangzhou City, Zhejiang province 310018 Xiasha Higher Education Park No. 2 Street No. 5 Patentee before: Zhejiang University of Technology |
|
TR01 | Transfer of patent right |