CN101286133A - 应用区间运算的软件测试方法 - Google Patents

应用区间运算的软件测试方法 Download PDF

Info

Publication number
CN101286133A
CN101286133A CNA2008101142625A CN200810114262A CN101286133A CN 101286133 A CN101286133 A CN 101286133A CN A2008101142625 A CNA2008101142625 A CN A2008101142625A CN 200810114262 A CN200810114262 A CN 200810114262A CN 101286133 A CN101286133 A CN 101286133A
Authority
CN
China
Prior art keywords
variable
interval
value
statement
node
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.)
Granted
Application number
CNA2008101142625A
Other languages
English (en)
Other versions
CN101286133B (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.)
Beijing University of Posts and Telecommunications
Original Assignee
Beijing University of Posts and Telecommunications
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 Beijing University of Posts and Telecommunications filed Critical Beijing University of Posts and Telecommunications
Priority to CN2008101142625A priority Critical patent/CN101286133B/zh
Publication of CN101286133A publication Critical patent/CN101286133A/zh
Application granted granted Critical
Publication of CN101286133B publication Critical patent/CN101286133B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明涉及软件测试技术领域,本发明能够在一定程度上解决在程序静态测试中对不可达路径的无效计算以及对变量取值信息未充分利用的技术问题。本发明提出区间集的概念,定义了数值型变量区间集上的集合运算及四则运算,对程序中布尔类型变量及引用类型变量及表达式定义了区间计算方法,本发明所述方法在软件测试过程的前期收集了变量及表达式的取值范围信息,并将其应用在控制流图的语句节点上,实验证明,添加了区间运算的软件测试方法较之未添加区间信息的原方法而言,测试结果的误报率降低,测试的准确率更高。

Description

应用区间运算的软件测试方法
技术领域
本发明涉及软件测试技术,尤其涉及区间运算在软件测试中的应用。
背景技术
软件测试分为动态测试和静态测试两种。动态测试是通过运行软件来检测软件的动态行为和运行结果的正确性;静态测试是收集、查找程序的信息,对被测程序进行特征分析,其主要优点是在程序运行之前就可以对程序故障进行检测。
在实际的软件测试中,由于程序中存在大量的不可达路径,而变量及表达式的确定取值情况在程序未运行时大多是未知的,静态测试时对于不可达路径仍然会进行无效的计算和检测,导致分析检测的结果中含有大量的误报。判断误报耗费时间且对真正的缺陷报告会起到干扰作用,因此降低误报率是静态测试追求的一大目标。另一方面,程序中存在的一些语句,如带初始化的声明语句、赋值语句等对变量的取值情况进行了限定,这些限定信息对程序的控制流有一定的影响,在已有的软件测试方法中并未充分利用这些取值信息,导致分析结果中含有较高的缺陷误报率。
发明内容
本发明的主要目的在于提供一种应用区间运算的软件测试方法,能够解决不可达路径无效计算以及对变量取值信息未充分利用的技术问题。为实现发明目的,本发明的技术方案是这样实现的:
一种应用区间运算的软件测试方法,该方法包括以下步骤:
步骤A、取符号表中的每一个变量,根据所述变量的类型设置初始区间值;
步骤B、根据控制流图产生时的节点序号顺序取控制流图中的下一个节点作为当前节点,如果所述当前节点为最后一个节点,则结束遍历,输出新生成的控制流图;否则执行步骤C;
步骤C、对所述当前节点的前驱节点上出现的除超出作用域的变量之外的每一个变量,求其在所述当前节点的所有前驱节点上的取值区间或区间集的并集,得到该变量在所述当前节点上的初始区间值或初始区间集;
步骤D、判断在所述当前节点上是否存在某个变量的初始取值区间为空,若存在则标记该节点为矛盾节点后,执行步骤B;若否,则执行步骤E;
步骤E、根据所述当前节点所对应的语句类型对该节点上的每个已获得初始区间值或初始区间集的变量进行相应的区间运算,得到所述变量新的区间取值后执行步骤B。
更进一步地,步骤A中,根据所述变量的类型设置初始区间值的步骤如下:
A1、判断符号表中所取的变量是否为数值型变量,若是则将其区间集初始化为{[MIN,MAX]},MIN和MAX为自定义的最小值和最大值,然后执行步骤B;若否,则执行步骤A2;
A2、判断符号表中所取的变量是否为布尔型变量,若是则将其区间值初始化为TRUE_OR_FALSE,然后执行步骤B;若否则执行步骤A3;
A3、判断符号表中所取的变量是否为引用型变量,若是则将其区间值初始化为NOTNULL,然后执行步骤B。
更进一步地,步骤C中,需根据所述变量的类型基于下述算式计算所述变量在当前节点上的初始区间值或区间集:
value(N,v)=merge(v,N1,...,Nm),m>1
其中,N为所述当前节点,N1,...,Nm为N的前驱节点,v为除超出作用域的变量之外的在所述当前节点N上出现的任一变量,value(N,v)代表变量v在当前节点上的初始区间值或区间集;merge表示针对变量v求其前驱节点的区间值或区间集的并集;
若所述当前节点N包含条件表达式时,则取初始的可能集为posbValue(N,v)=value(N,v),初始的必然集为necsValue(N,v)=value(N,v)。
更进一步地,步骤E中,若所述当前节点所对应的语句类型为赋值语句,则根据被赋值变量及右端表达式计算该赋值语句中表达式的取值区间,并将所述被赋值变量的取值区间重置为该新计算出的表达式的取值区间,然后执行步骤B。
基于上述技术方案,更进一步地,其特征在于,根据所述被赋值变量的类型及右端表达式计算该赋值语句中表达式的取值区间的步骤如下:
若所述被赋值变量的类型为数值型变量,则计算所述右端表达式中各子表达式的取值区间集,然后根据连接所述子表达式的运算符类型进行区间集计算,得到所述表达式的取值区间集;
若所述被赋值变量的类型为布尔类型变量,则计算所述右端表达式中各子表达式的区间,然后根据连接所述子表达式的运算符类型进行区间计算,得到所述表达式的区间;
若所述被赋值变量的类型为引用类型变量,则根据所述右端表达式是否为空得到所述表达式的区间。
更进一步地,步骤E中,若所述当前节点所对应的语句类型为条件判断语句,则对该节点所关联的每一变量取初始的可能集后计算该节点所关联的每一变量在所述条件判断语句中的取值的可能集和必然集,进而得到该节点所对应的控制流图中真假分支上的所述变量取值情况,然后执行步骤B。
基于上述技术方案,更进一步地,所述当前节点所关联的每一变量在所述条件判断语句中取值的可能集和必然集的计算步骤如下:
E1、判断所述条件判断语句的取值是否为真,若为真则执行E2,若为否则执行E4;
E2、判断所述条件判断语句是否为简单条件判断语句,若是则根据所述简单条件判断语句中操作对象的数据类型及关系运算符的类型,计算得到所述变量在所述条件判断语句中的取值的可能集和必然集;若否则执行步骤E3;
E3、首先计算组成所述条件判断语句中的各个子简单条件表达式中所述变量的可能集和必然集,然后依据关联所述子简单条件表达式的逻辑运算符的可能集和必然集的计算方法,得到所述变量在所述条件判断语句中的取值的可能集和必然集。
E4、所述变量在所述条件判断语句的取值为假时的可能集为所述变量在进入所述条件判断语句之前的取值区间减去所述变量在所述条件判断语句为真时的必然集。
更进一步地,步骤E中,若所述当前节点所对应的语句类型为单变量多分支情况判断语句中的分支判断语句,则将分支切换语句中的变量的取值区间集重置为分支判断语句中的常量值,然后执行步骤B。
更进一步地,步骤E中,若所述当前节点所对应的语句类型为单变量多分支情况判断语句中的默认分支语句,则将分支切换语句中的变量的取值区间置为该变量的初始取值区间集减去该单变量多分支情况判断语句中所有的分支判断语句中的常量值后所得的区间集,然后执行步骤B。
本发明提出的区间运算方法在软件测试过程的前期收集了变量及表达式的取值范围信息,并将其应用在控制流图的语句节点上,实验证明,添加了区间运算的软件测试方法较之未添加区间信息的原方法而言,测试结果的误报率降低,测试的准确率更高。
附图说明
图1为本发明基于控制流图和符号表进行区间运算的流程示意图;
图2为本发明源程序Test1.java中函数f的初始控制流图;
图3为本发明源程序Test1.java中函数f添加了区间信息的新控制流图;
图4为本发明源程序Test2.java中函数f的初始控制流图;
图5为本发明源程序Test2.java中函数f添加了区间信息的新控制流图;
图6为本发明源程序Test3.java中函数f的初始控制流图;
图7为本发明源程序Test3.java中函数f添加了区间信息的新控制流图。
具体实施方式
软件在实际运行时,某一变量或表达式的取值存放在计算机的内存中,取值是唯一确定的。然而在静态测试中,由于程序未被执行,变量及表达式的确定取值情况大多是未知的,因此在传统的静态测试中很难得到变量的取值信息从而对实际中不能到达的程序路径进行了测试,导致测试结果中含有一定的误报,使得准确率降低。
另一方面,程序中存在的一些语句,如带初始化的声明语句、赋值语句、条件判断语句等对变量的取值情况进行了限定,这些限定信息对程序的控制流有一定的影响,在已有的软件测试方法中并未充分利用这些取值信息。区间及区间集就是用来描述程序中变量及表达式的这种取值信息的,变量或表达式的取值区间表示一个变量或表达式当前可能或确定的取值范围。本发明提出的区间运算方法收集了变量及表达式的取值范围信息,并将其附在新控制流图的语句节点上,从而能够直接检测出程序中的不可达路径,降低测试结果的误报率,提高测试的准确率。
为了将本发明提出的区间运算应用在软件测试中,本发明根据不同变量的特点为各种变量类型给出了区间定义,并且给出在各种变量类型的区间上的运算的定义。以下分别对各种变量类型的区间定义及区间运算进行举例说明。
本发明中数值型的数据类型包括浮点型,整数型和字符型,任意一个数值型变量或表达式的取值范围都可以用区间代数中的一个区间来表示,区间的定义如下:
数学中的实数在计算机语言中以数值型的数据类型来表示,对于给定的实数xi,xs(xi∈R,xs∈R),若满足条件
xi≤xs
则闭有界数集合
X=[xi,xs]={x∈R |xi≤x≤xs}
就称为有界闭区间,其中xi称为区间X的下端点,xs称为区间X的上端点。
若区间X的上、下端点相等,即xi=xs,此时定义[xi,xi]为点区间;空区间用Φ表示。
由于计算机中表示实数大小的能力是有限的,变量v取值的最小精度用步长λ(λ>0)来表示。为了统一描述起见,对于整型和字符型变量取λ=1。
给定任意两个实数区间,X=[xi,xs],Y=[yi,ys],在区间X和Y上的区间加、减、乘、除、交集、并集运算定义如下:
X+Y=[xi+yi,xs+ys]
加法运算的结果仍为一个区间,该区间的下端点为X、Y的下端点之和,上端点为X、Y的上端点之和。
X-Y=[xi-ys,xs-yi]
减法运算的结果仍为一个区间,该区间的下端点为区间X的下端点与区间Y的上端点之差,上端点为区间X的上端点与区间Y的下端点之差。
X×Y=[min(xi×xs,xi×ys,yi×xs,yi×ys),max(xi×xs,xi×ys,yi×xs,yi×ys)]
乘法运算的结果仍为一个区间,其中min表示取最小值,max表示取最大值;
X/Y=[xi,xs]×[1/ys,1/yi],且 0 ∉ [ y i , y s ]
除法运算的结果仍为一个区间,其中yi及ys不能为零。
X∩Y=[max(xi,yi),min(xs,ys)]
区间交集表示区间X和区间Y有公共部分。
X ∪Y=[min(xi,yi),max(xs,ys)],且X∩Y≠Φ;
区间的并集运算条件是区间X和区间Y的交集不能为空。
如果xs<yi,称X<Y或者Y>X,即如果X的上端点小于Y的下端点,就称X小于Y,或者Y大于X。
如果xi=yi并且xs=ys,称X=Y。
某些情况下单个区间的描述能力是有限的。例如,设某一整数类型变量的取值是[2,4]或[9,10],用区间表示应为[2,10],而这样会包含冗余取值区间[5,8]。为了更加准确地描述一个变量的取值范围,本发明引入区间集的概念。区间集是由若干两两互不相交的区间构成的集合,区间集的表达形式如下:
IS={X1,X2,...,Xn},X1<X2<...<Xn={[x1i,x1s],[x2i,x2s],...,[xni,xns]},[x1i,x1s]<[x2i,x2s]<...<[xni,xns]。
其中,IS代表区间集,X1,X2,...,Xn代表区间集中的各区间,对于任一实数r,如果存在Xi,i=1..n,使得r∈Xi,则称r∈IS。
上述例子中整数类型变量的取值范围用区间集可表示为{[2,4],[9,10]}。
区间集的集合运算的定义如下:
设区间集IS={X1,...,Xj,Xj+1,...,Xk-1,Xk,...,Xn}={[x1i,x1s],...,[xji,xjs],...,[xki,xks],...,[xni,xns]},区间M=[mi,ms],
(1)假设M与IS中的相邻区间Xj,Xj+1,...,Xk-1,Xk相交,则IS与M的交运算记为:
IS∩M={X1,...,Xj′,Xj+1,...,Xk-1,Xk′,...,Xn},即用新区间Xj′替换原来的Xj,用新区间Xk′替换原来的Xk
其中Xj′=[max(xji,mi),xjs],xjs为Xj的上端点,xji为Xj的下端点,Xj′的下端点取Xj的下端点xji和M的下端点mi的最大值;Xk′=[xki,min(xks,ms)],xki为Xk的下端点,Xk′的上端点取Xk的上端点xks和M的上端点ms的最小值;因此,
IS∩M={[x1i,x1s],...,[max(xji,mi),xjs],...,[xki,min(xks,ms)],...,[xni,xns]};
IS与M的并运算记为:
IS∪M={X1,...,Xj′,...,Xn},即用新区间Xj′替换原来的区间Xj,Xj+1,...,Xk-1,Xk,其中Xj′=[min(xji,mi),max(xks,ms)],即Xj′的下端点取Xj的下端点xji和M的下端点mi的最小值;上端点取Xk的上端点xks和M的上端点ms的最大值;因此,
IS∪M={[x1i,x1s],...,[min(xji,mi),max(xks,ms)],...,[xni,xns]}。
(2)如果区间M不与区间集IS中的任一区间相交,则IS与M的交运算结果为:
IS∩M=Φ;
假设区间Xj<M<Xj+1,则区间集IS与区间M的并运算结果为:
IS∪M=={X1,...,Xj,M,Xj+1,...,Xn}
设区间集IS1={X1,X2,...,Xn}={[x1i,x1s],...,[xji,xjs],...,[xki,xks],...,[xni,xns]},区间集IS2={Y1,Y2,...,Yn}={[y1i,y1s],[y2i,y2s],...,[yni,yns]},则IS1与IS2的交运算记为:IS1∩IS2=(...((IS1∩Y1)∩Y2)∩...)∩Ym
IS1与IS2的并运算记为:
IS1∪IS2=(...((IS1∪Y1)∪Y2)∪...)∪Ym
设全集为Ω=[MIN,MAX](MIN为设定一个最小值,MAX为设定的一个最大值),区间集IS={X1,X2,...,Xn-1,Xn}={[x1i,x1s],[x2i,x2s],...,[x(n-1)i,x(n-1)s],[xni,xns]},IS的补集~IS表示从全集Ω中去掉IS中的所有区间后剩余的区间所构成的区间集,即对IS中的任意相邻区间Xj-1[x(j-1)i,x(j-1)s]和Xj=[xji,xjs](假设Xj-1不是IS中的最小区间,且Xj不是IS中的最大区间),取Xj的下端点减去最小精度λ作为上端点,Xj-1的上端点加上最小精度λ作为下端点得到~IS中的一个新区间[x(j-1)s+λ,xji-λ],按照这种方法,可以得到~IS的结果如表1所示。
表1区间集的取补运算
  IS   ~IS
 当最小区间的下端点不等于MIN,并且最大区间的上端点不等于MAX时,即x1i≠MIN,xns≠MAX {[MIN,x1i-λ],[x1s+λ,x2i-λ],...,[x(n-1)s+λ,xni-λ],[xns+λ,MAX]}
 当最小区间的下端点不等于MIN,并且最大区间的上端点等于MAX时,即x1i≠MIN,xns=MAX {[MIN,x1i-λ],[x1s+λ,x2i-λ],...,[x(n-1)s+λ,xni-λ]}
 当最小区间的下端点等于MIN,并且最大区间的上端点不等于MAX时,即x1i=MIN,xns≠MAX {[x1s+λ,x2i-λ],...,[x(n-1)s+λ,xni-λ],[xns+λ,MAX]}
 当最小区间的下端点等于MIN,并且最大区间的上端点等于MAX时,即x1i=MIN,xns=MAX {[x1s+λ,x2i-λ],...,[x(n-1)s+λ,xni-λ]}
区间集的四则运算的定义如下:
设区间集IS1={X1,X2,...,Xm-1Xm}={[x1i,x1s],[x2i,x2s],...,[xmi,xms]},区间集IS2={Y1,Y2,...,Yn-1,Yn}={[y1i,y1s],[y2i,y2s],...,[yni,yns]}。以*表示二元运算符加(+)、乘(×)、除(÷),假定区间集IS=IS1*IS2则,IS的计算过程可通过下面的程序代码得出:
IS=Φ;
for int i=1 to m{
   for int j=1 to n{
    IS=IS∪(Xi*Yj);
  }
}
上述计算程序说明,区间集IS是由区间集IS2中的每一个区间分别和区间集IS1中的每一个区间进行二元运算后取并而得到。
对于区间集的减法运算定义为:IS1-IS2=IS1+(~IS2)。
上面本发明给出了数值型变量的区间集运算,包括集合运算和“加”“减”“乘”“除”四则运算,在此基础上,本发明对程序中数值表达式的抽象语法树结构自底向上计算每个操作数的取值范围,可以得到数值表达式整个的取值范围。例如对于表达式(i+5)×j,首先根据变量i的取值区间集得到i+5的取值区间集IS,然后用j的取值区间集和IS相乘即得到表达式(i+5)×j的结果区间集。
注:在不产生混淆的情况下,也称数值类型变量的区间集为区间。
程序当中经常会用到布尔类型变量来表达某一条件或一个状态的真假,下面对布尔类型的区间及区间运算进行定义,本发明设定布尔类型变量的所有取值区间的集合为A={TRUE,FALSE,TRUE_OR_FALSE,EMPTY},其中TRUE代表布尔变量的取值为真;FALSE代表布尔变量的取值为假;TRUE_OR_FALSE代表布尔变量的取值可能为真也可能为假;EMPTY表示布尔变量的取值范围为空,取值范围为空的情况在控制流路径矛盾的时候才会发生。布尔变量的区间运算包括∪(并)、∩(交)、(非)、-(减),且<A,∪,∩,
Figure A20081011426200112
构成一个布尔格。
具体地,“并”运算定义如下所示:
TRUE∪EMPTY=TRUE;TRUE∪TRUE_OR_FALSE=TRUE_OR_FALSE;
FALSE∪EMPTY=FALSE;FALSE∪TRUE_OR_FALSE=TRUE_OR_FALSE;
TRUE∪FALSE=TRUE_OR_FALSE;
EMPTY∪TRUE_OR_FALSE=TRUE_OR_FALSE;
“交”运算定义如下所示:
TRUE∩EMPTY=EMPTY;TRUE∩TRUE_OR_FALSE=TRUE;
FALSE∩EMPTY=EMPTY;FALSE∩TRUE_OR_FALSE=FALSE;
TRUE∩FALSE=EMPTY;EMPTY∩TRUE_OR_FALSE=EMPTY;
“非”运算如下所示:
⫬ TRUE = FALSE ; ⫬ FALSE = TRUE ;
⫬ EMPRY = TRUE _ OR _ FALSE ; ⫬ TRUE _ OR _ FALSE = EMPTY ;
对于布尔类型区间X和Y,定义减操作如下:
X - Y = X ∩ ( ⫬ Y ) .
布尔型变量的取值区间只有四种情况,TRUE,FALSE,EMPTY,TRUE_OR_FALSE,布尔型变量的默认取值区间为TRUE_OR_FALSE。
引用类型的变量(Java中的句柄变量)是指向内存中对象的标识。在基于缺陷模型的软件测试中,关注的引用类型变量的所有取值区间的集合B包括4个元素{NULL,NOTNULL,NULL_OR_NOTNULL,EMPTY}。其中NULL表示句柄变量的取值为null;NOTULL表示句柄变量的取值不为null,即指向某一对象;NULL_OR_NOTULL表示句柄变量的取值可能为null也可能不为null;EMPTY表示句柄变量的取值范围为空,这种情况在控制流路径矛盾的时候会发生,需要说明的是,null是程序中某个变量的一种取值情况,而EMPTY是本发明定义的一种区间取值,表示该变量的区间取值为空,当然也就不包括null这种取值。类似布尔变量,句柄变量的区间运算包括∪(并)、∩(交)、
Figure A20081011426200121
(非)、-(减),且<B,∪,∩,
Figure A20081011426200122
也构成一个布尔格。
具体地,“并”运算定义如下所示:
NULL∪EMPTY=NULL;NULL∪NULL_OR_NOTNULL=NULL_OR_NOTNULL;
NOTNULL∪EMPTY=NOTNULL;
NOTNULL∪NULL_OR_NOTNULL=NULL_OR_NOTNULL;
NULL∪NOTNULL=NULL_OR_NOTNULL;
EMPTY∪NULL_OR_NOTNULL=NULL_OR_NOTNULL;
“交”运算定义如下所示:
NULL∩EMPTY=EMPTY;NULL∩NULL_OR_NOTNULL=NULL;
NOTNULL∩EMPTY=EMPTY;NOTNULL∩NULL_OR_NOTNULL=NOTNULL;
NULL∩NOTNULL=EMPTY;EMPTY∩NULL_OR_NOTNULL=EMPTY;
“非”运算如下所示:
Figure A20081011426200123
NULL=NOTNULL;
NOTNULL=NULL;
Figure A20081011426200125
EMPTY=NULL_OR_NOTNULL;
Figure A20081011426200126
NULL_OR_NOTNULL=EMPTY;
对于引用类型区间X和Y,定义减操作如下:
X - Y = X ∩ ( ⫬ Y ) .
引用类型的默认取值区间为NOTNULL。
表达式由变量(含常量)及运算符组成,程序中的条件表达式分为简单条件表达式和复合条件表达式,简单条件表达式包括:由>、>=、==、!=、<、<=等关系运算符构成的表达式以及由单个布尔变量或常量构成的表达式。复合条件表达式是由简单条件表达式经过布尔逻辑操作符“与”、“或”、“非”、“异或”等所连接构成的。
对于简单条件表达式,本发明中仅考虑单一变量出现在关系运算符两端的情况(如:i>j,k==3),当表达式取值为真时,表达式中变量的取值区间会受到一定的影响。
假设数值型变量v的当前取值区间集为IS0,数值型变量所对应的默认最大取值区间集为{[MIN,MAX]},关系运算符对数值变量取值区间的影响如表2所示,其中λ表示变量v取值的最小精度。为了便于计算,设关系运算符另一端的区间集取最大值h和最小值1,合并为单一区间[1,h]。
关系运算符对布尔型变量和引用型变量取值区间的影响如表3、表4所示,其中E代表v的当前取值集。
表2关系运算符对数值变量取值区间的影响
    简单条件表达式     变量v的区间值
    v>[1,h] IS0∩[1+λ,MAX]
    v<[1,h] IS0∩[MIN,h-λ]
    v>=[1,h] IS0∩[1,MAX]
    v<=[1,h] IS0∩[MIN,h]
    v==[1,h] IS0∩[1,h]
    v!=[1,h] IS0           若1不等于hIS0-[1,h]    若1等于h
表3关系运算符对布尔变量取值区间的影响
表达式  v取值范围
v==TRUE  E∩TRUE
v==FALSE  E∩FALSE
v==TRUE_OR_FALSE  E∩TRUE_OR_FALSE
v==EMPTY  EMPTY
v!=TRUE  E∩FALSE
v!=FALSE  E∩TRUE
v!=TRUE_OR_FALSE  E∩TRUE_OR_FALSE
v!=EMPTY  EMPTY
表4关系运算符对引用变量取值区间的影响
表达式 v取值范围
v==NULL  E∩NULL
v==NOTNULL  E∩NOTNULL
v==NULL_OR_NOTNULL  E∩NULL_OR_NOTULL
v==EMPTY  EMPTY
v!=NULL  E∩NOTNULL
v!=NOTNULL  E∩NULL
v!=NULL_OR_NOTNULL  E∩NULL_OR_NOTNULL
v!=EMPTY  EMPTY
当表达式中含有“非”、“异或”逻辑运算符时,通常很难直接得到变量的取值范围。比如对于表达式c=(i>0&&j<5)(其中i和j为整型变量,&&表示“与”),假设在执行条件C之前i和j的取值区间均为{[MIN,MAX]),MIN为最小值,MAX为最大值,很容易得到经过该表达式后i和j的区间取值变为{[1,MAX]},{[MIN,4]}。然而,如果对C取“非”操作,
Figure A20081011426200132
Figure A20081011426200133
中变量i和j的取值就不能简单地通过对C中i和j的取值进行求补得到,即,中i的取值不是~{[1,MAX]}={[MIN,0]},j的取值也不是~{[MIN,4]}={[5,MAX]},原因在于利用德摩根定律可知
Figure A20081011426200135
(||表示“或”),只要表达式i≤0取值为真或者只要j≥5取值为真都会使得(i≤0||j≥5)取值为真,也就是i和j的取值范围在(i≤0||j≥5)中是不会受影响的,仍然都为[MIN,MAX]。
为了更加准确地计算条件表达式中变量的取值范围,本发明引入变量取值的必然集necsValue和可能集posbValue。
设程序控制流上的某个条件为C,其中v0,v1,...,vn为C中包含的变量。
本发明中将在条件C执行之前变量vi的取值范围记作E(vi),也称作变量vi的当前全集,E(v0)×E(v1)×...×E(vn)为E(v0)、E(v1)、...、E(vn)的笛卡尔乘积则C(v0,v1...vn)为E(v0)×E(v1)×...×E(vn)映射到集合{0,1}上的一个二值函数。
本发明定义变量vi在条件C下取值范围的可能集为:
posbValue ( C , v i ) = { x | ∃ v 0 ∃ v 1 . . . ∃ v i - 1 ∃ v i + 1 . . . ∃ v n C ( v 0 , v 1 , . . . v i - 1 , x , v i + 1 , . . . v n ) }
其中
Figure A20081011426200142
是谓词逻辑中的存在量词,表示“存在...”。即对于集合posbValue(C,vi)中的任一元素x,当vi=x时,均存在一组变量v0,...,vi-1,vi+1,vn使得条件表达式C(v0,v1,...vi-1,x,vi+1,...vn)取值为真。
本发明定义变量vi在条件C下取值范围的必然集为:
necsValue ( C , v i ) = { x | ∀ v 0 ∀ v 1 . . . ∀ v i - 1 ∀ v i + 1 . . . ∀ v n C ( v 0 , v 1 , . . . v i - 1 , x , v i + 1 , . . . v n ) }
其中“”是谓词逻辑中的全称量词,表示“对任一个...”。即对于集合necsValue(C,vi)中的任一元素x,当vi=x时,对任意的一组变量v0,...,vi-1,vi+1,vn均使得条件表达式C(v0,v1,...vi-1,x,vi+1,...vn)取值为真。
由上述定义及离散数学中的定理可知:
∃ xA ( x ) ⇔ ⫬ ∀ x ⫬ A ( x )
∀ xA ( x ) ⇔ ⫬ ∃ x ⫬ A ( x )
其中A(x)表示包含变量x的任意函数,这里符号
Figure A20081011426200147
表示“非”,
Figure A20081011426200148
表示“等价于”。
可以得到如下两个性质。
posbValue ( ⫬ C , v i ) = { x | ∃ v 0 ∃ v 1 . . . ∃ v i - 1 ∃ v i + 1 . . . ∃ v n ⫬ C ( v 0 , v 1 , . . . v i - 1 , x , v i + 1 , . . . v n ) }
性质1:
= E ( v i ) - necsValue ( C , v i )
性质1表示一个表达式“非C”中某个变量vi的可能集就是该变量的当前全集E(vi)与vi在其表达式C中的必然集的差值。
posbValue ( C , v i ) = { x | ∃ v 0 ∃ v 1 . . . ∃ v i - 1 ∃ v i + 1 . . . ∃ v n C ( v 0 , v 1 , . . . v i - 1 , x , v i + 1 , . . . v n ) }
性质2:
Figure A200810114262001413
= E ( v i ) - necsValue ( ⫬ C , v i )
性质2表示一个表达式C中某个变量vi的可能集就是该变量的当前全集E(vi)与vi在其“非”表达式“非C”中的必然集的差值。
容易看出上述定义的变量v在条件C下的可能取值区间集posbValue(C,v)就是程序中变量v在程序语句C上的可能取值范围。例如对下面的程序片段:
if(x<10){
  .....
}else{
  .....
}
这里的条件C为(x<10),对于变量x,区间运算的目的就是要计算出条件C的真假分支上x的可能取值范围。即分别为posbValue(C,x)和 posbValue ( ⫬ C , x ) . 而由性质1: posbValue ( ⫬ C , x ) = E ( v i ) - necsValue ( C , x ) , 所以得到C的posbValue(C,x)和necsValue(C,x)后就能得到C所对应的真假分支上的取值情况。
以下分别给出简单条件表达式及复合条件表达式中可能集和必然集的计算方法。
对于仅由关系运算符连接的简单条件表达式(为了便于计算,仅考虑变量一端出现单一变量的情况),表5为数值类型变量取值区间的可能集和必然集定义,表6为布尔类型变量取值区间的可能集和必然集定义、表7为引用类型变量取值区间的可能集和必然集定义。其中,E表示变量x在进入表达式C之前的取值区间,λ为最小精度或步长。
表5数值变量posbValue和necsValue表
  简单条件表达式C   posb Value(C,x)   necs Value(C,x)
  x>[1,h]   E∩[1+λ,MAX]   E∩[h+λ,MAX]
  x<[1,h]   E∩[MIN,h-step]   E∩[MIN,1-λ]
  x>=[1,h]   E∩[1,MAX]   E∩[h,MAX]
  x<=[1,h]   E∩[MIN,h]   E∩[MIN,1]
x==[1,h] E∩[1,h]   Φ        1!=hE∩[1,h] 1==h
x!=[1,h]   E        1!=hE-[1,h] 1==h E-[1,h]
表6布尔变量posbValue和necsValue表
  简单条件表达式C   posbValue(C,x)   necs Value(C,x)
  x==TRUE   E∩TRUE   E∩TRUE
  x==FALSE   E∩FALSE   E∩FALSE
  x==TRUE_OR_FALSE   E∩TRUE_OR_FALSE   EMPTY
  x==EMPTY   EMPTY   EMPTY
  x!=TRUE   E∩FALSE   E∩FALSE
  x!=FALSE   E∩TRUE   E∩TRUE
  x!=TRUE_OR_FALSE   E∩TRUE_OR_FALSE   EMPTY
  x!=EMPTY   EMPTY   EMPTY
表7引用变量posbValue和necsValue表
  简单条件表达式C   posbValue(C,x)   necsValue(C,x)
v==NULL   E∩NULL   E∩NULL
v==NOTNULL   E∩NOTNULL   E∩NOTNULL
v==NULL_OR_NOTNULL   E∩NULL_OR_NOTNULL   EMPTY
v==EMPTY   EMPTY   EMPTY
v!=NULL   E∩NOTNULL   E∩NOTNULL
v!=NOTNNULL   E∩NULL   E∩NULL
v!=NULL_OR_NOTNULL   E∩NULL_OR_NOTNULL   EMPTY
v!=EMPTY   EMPTY   EMPTY
对于复合条件表达式中可能集和必然集的计算方法,设C为复合条件表达式,x为C中所包含的某一变量,E(x)表示变量x在进入表达式C之前的取值区间。对于“非”、“或”、“与”、“异或”表达式,其中变量可能集和必然集的计算方法如下:
(1)“非”类型复合条件表达式
Figure A20081011426200161
中可能集和必然集的计算方法:
posbValue ( ⫬ C , x ) = E ( x ) - necsValue ( C , x )
necsValue ( ⫬ C , x ) = E ( x ) - posbValue ( C , x )
(2)“或”类型复合条件表达式(C=A||B)中可能集和必然集的计算方法:
假设A中包含的变量集合为VA={va1,va2,...van},B中包含的变量集合为VB={vb1,vb2,...vbn}。
Figure A20081011426200164
Figure A20081011426200165
(3)“与”类型复合条件表达式(C=A&&B)中可能集和必然集的计算:
假设A中包含的变量集合为VA={va1,va2,...van},B中包含的变量集合为VB={vb1,vb2,...vbn}。
Figure A20081011426200166
Figure A20081011426200171
(4)“异或”类型复合条件表达式(C=A^B)中可能集和必然集的计算:
假设A中包含的变量集合为VA={va1,va2,...van},B中包含的变量集合为VB={vb1,vb2,...vbn}。
Figure A20081011426200172
Figure A20081011426200173
例如,设表达式if((i>5)||(j<2))执行之前整型变量i和j的取值区间集均为{[0,10]},则
necsValue((i>5)||(j<2),i)={[6,10]},
necsValue((i>5)||(j<2),j)={[0,1]},
posbValue((i>5)||(j<2),i)={[0,10]},
posbValue((i>5)||(j<2),j)={[0,10]}。
上面讨论了简单条件表达式及基本的复合条件表达式中变量的区间集运算,在此基础上,对程序中条件表达式的抽象语法树结构自底向上计算每个操作数取值区间的可能集和必然集取值,可以得到各变量在整个表达式中的取值范围。
为了能直观地描述在控制流遍历过程中各变量的区间集计算过程,本发明定义如下一些函数(函数中N表示控制流图中的一个节点):
necsValue(N,v)
该函数表示:当N包含某个条件表达式,且该表达式取值为真时,变量v的必然取值区间集。
posbValue(N,v)
该函数表示:当N包含某个条件表达式,当该表达式取值为真时,变量v的可能取值区间集。
value(N,v)
该函数表示:若N包含非条件表达式时,该函数值为变量v的取值区间集;特别地,若N包含某个条件表达式时,value(N,v)=posbValue(N,v)。
merge(v,N1,...,Nm)
该函数表示:变量v在控制流图中节点N1,...,Nm上取值的并,即value(N1,v)∪...∪value(Nm,v)。
以下结合附图,对本发明提出的变量的区间及区间集的运算在软件测试实施例中的应用进行解释和说明,图1为本发明区间运算在软件测试中的应用流程示意图。如图1所示,该方法包括以下步骤:
步骤A、取符号表中的每一个变量,据该变量的类型设置初始区间值;
符号表被用来记录标识符(包含变量)的类型、作用域以及绑定信息。符号表将标识符与其类型和位置进行映射。在处理类型、变量和函数的声明的时候,这些标识符应该可以在符号表中得到解释。当发现有标识符被使用时,这些标识符应该都可以在符号表中找到。另外,程序中每个标识符都有一个在其内可见的作用域,不同的作用域中允许出现相同名称的标记符。作用域之间是包含的关系,形成一个树状数据结构。
此步骤中需根据变量的类型进行相应的初始化操作,执行的步骤如下:
A1、判断符号表中所取的变量是否为数值型变量(包括浮点型、整数型和字符型),若是则根据数值型变量的区间集定义将其初始化为{[MIN,MAX]}(MIN和MAX为自定义的最小值和最大值);若否,则执行步骤A2;
A2、判断符号表中所取的变量是否为布尔型变量,若是则根据布尔型变量的区间定义将其初始化为TRUE_OR_FALSE;若否则执行步骤A3;
A3、判断符号表中所取的变量是否为引用型变量,若是则根据引用型变量的区间定义将其初始化为NOTNULL。
步骤B、根据控制流图产生时的节点序号顺序取控制流图中的下一个节点作为当前节点,如果所述当前节点为最后一个节点,则执行步骤G;否则执行步骤C;
一个程序控制流图可表示为(N,E,Entry,Exit)。其中,N代表结点的集合,反映程序中的语句和条件判断;E代表有向边的集合,反映程序中语句间的控制流关系;Entry为程序固定的唯一入口结点;Exit为程序唯一的退出结点。简单地说:控制流图就是具有单一、固定入口结点和出口结点的有向图。控制流图反映了程序的控制结构,控制流图的每一个节点对应语法树上的一个语句。例如图2为初始生成的控制流图,图3为添加了区间信息后新生成的控制流图。
步骤C、对所述当前节点的前驱节点上出现的除超出作用域的变量之外的每一个变量,求其在所述当前节点的所有前驱节点上的取值区间(布尔型及引用型)或区间集(数值型)的并集,得到该变量在当前节点上的初始区间值或初始区间集。
设当前控制流图的节点为N,其前驱节点为N1,...,Nm(m>1)。对于N1,...,Nm中出现的任一变量v(超出作用域的变量除外),则v在当前节点上初始区间值为value(N,v)=merge(v,N1,...,Nm);
步骤D、判断在所述当前节点上是否存在某个变量的取值区间为空的情况,若是则执行步骤F;若否,则执行步骤E;
步骤E、根据所述当前节点所对应的语句类型对节点上的每个已获得初始值的变量进行相应的区间运算,得到所述变量新的区间取值后,继续执行步骤B。
此步骤中,需要根据当前节点对应的源程序中的语句类型来确定所述变量的取值区间,执行步骤如下:
E1、判断当前节点对应的源程序中的语句是否为赋值语句(含由“+=”、“-=”等连接的复合赋值语句),若是,则使用本发明公开的区间运算计算方法计算赋值语句中右端表达式的取值区间,并将所述被赋值变量的取值区间重置为该新计算出的取值区间;若否,则执行步骤E2。
E2、判断当前节点对应的语句是否为条件判断语句(包含if语句,while语句,for语句,do-while语句),若是,则首先对该节点所关联的每一变量v,取初始的可能集为posbValue(N,v)=value(N,v),接着计算该节点所关联每一变量在表达式中取值的可能集和必然集,最终得到该条件节点所对应的控制流图中真假分支上的变量取值情况;若否,则执行步骤E3。
E3、判断当前节点对应的语句是否为多分支情况判断语句(switch...case)中的分支判断(case)语句,即”case CONST:”,其中CONST代表常量,并且该case语句对应的分支切换(switch)语句为“switch(v)”时(v代表单一变量而非表达式),则将该节点上变量v的取值区间集重置为case语句中的常量CONST;否则执行步骤E4。
E4、判断当前节点对应的语句是否为多分支情况判断语句(switch...case)中的默认分支(default)语句,且该default语句对应的分支切换(switch)语句为“switch(v)”(v代表单一变量而非表达式),若是,则将该节点上变量v的取值区间用分支切换语句(switch)中变量v的取值区间集减去所有的case语句中变量取值的结果来进行重置。
步骤F:标记所述当前节点为矛盾节点,然后执行步骤B;
矛盾节点在实际运行中为不可达节点,包含该节点的路径均为不可达路径,本发明将其在新的控制流程图中进行标识。对于数值类型变量,取值区间为空的表示为Φ,对于布尔变量,取值区间为空的表示为EMPTY,对于引用类型的变量,取值区间为空的表示为EMPTY。
步骤G:则结束遍历,输出新生成的控制流图。
下面本发明结合具体实例对本发明做进一步说明。
对于下面的源程序Test1.java中的函数f,建立的初始控制流图如附图2,图中的节点与源程序中行号的对应关系如表8所示,其中节点名字的最后一个数字标识了产生的顺序号,边上标识的最后一个数字标识了该边产生的顺序号,以“T”开头表示为条件表达式的真分支,以“F”开头则表示为假分支。符号表中与区间运算有关的变量为i和j,因为i和j均为int整数型,故初始化为{[MTN,MAX]}。
Test1.java
1:public class Test1{
2:  void f(int i,intj){
3:      if(i>=3){
4:          if(i<0&&j<-5)
5:              i+=6;
6:          else
7:              j-=15;
8:      }
9:      else
10:        i--;
11:  }
12:}
表8Test1.java中函数f的控制流图和源程序的对应关系
  控制流图中的节点名   对应的源程序行号
  func_head_f_0   2
  if_head_1   3
  if_head_2   4
  stmt_3   5
  stmt_4   7
  if_out_5   4
  stmt_6   10
  if_out_7   3
  func_out_f_8   2
根据区间运算在软件测试中的应用流程遍历图2中的控制流图,更新各节点中变量(即i和j)的取值区间,得到输出的控制流图如附图3所示。图中pV(i)代表posbValue(N,i),nV(i)代表Value(N,i)(N为当前节点),j没有出现的节点意味着j取默认区间集{[MIX,MAX]}。标识为浅灰色的节点stmt_3为矛盾节点,因为该节点中存在变量i取值区间或区间集为Φ的情况,该节点在实际程序运行时不会执行,包含该节点的路径均为不可达路径。
下面对布尔型变量的区间运算进行举例说明。对下面的Java程序Test2.java中的函数f,生成的原始控制流图如图4所示,添加了区间信息的新的控制流图如图5所示(在节点上未出现的变量表明其取值为默认区间)。图中的节点与源程序中行号的对应关系如表9所示。同样地,图5中标识为灰色的节点stmt_4为矛盾节点。
Test2.java
1:  class Test2{
2:    void f(in i){
3:       boolean b;
4:       b=false&&(i>0);
5:       if(b)
6:           i++;
7:       else
8:           i--;
9:    }
10: }
表9Test2.java程序中函数f的控制流图和源程序的对应关系
  控制流图中的节点名   对应的源程序行号
  func_head_f_0   2
  decl_stmt_1   3
  stmt_2   4
  stmt_3   5
  if_head_4   6
  stmt_5   7
  stmt_6   9
  if_out_7   6
  func_out_f_8   2
下面对引用型变量的区间运算进行举例说明。对下面的Java程序Test3.java中的函数f,生成的原始控制流图如图6所示,添加了区间信息的新的控制流图如图7所示(在节点上未出现的变量表明其取值为默认区间)。图中的节点与源程序中行号的对应关系如表10所示。同样地,图7中标识为灰色的节点stmt_3为矛盾节点。
Test3.java
1:  class Test3{
2:    void f(Object obj){
3:       Object obj=null;
4:       if(obj!=null)
5:           obj=new Object();
6:       else
7:           obj=new Object();
8:    }
9:  }
表10Test3.java程序中函数f的控制流图和源程序的对应关系
  控制流图中的节点名   对应的源程序行号
  func_head_f_0   2
  decl_stmt_1   3
  if_head_2   4
  stmt_3   5
  stmt_4   7
  if_out_5   4
  func_out_f_6   2
以下结合一具体的测试实例来说明采用本发明的区间运算的软件测试方法如何能有效的减少计算时间、提高检测效率。
程序中存在大量的不可达路径。由于变量及表达式的确定取值情况在程序未运行时大多是未知的,因而在静态测试中对于不可达路径仍然进行无效的计算和检测,耗费大量的检测时间,导致较低的检测效率。采用区间运算的静态测试方法由于能有效检测出不可达路径,在检测过程中能随时对检测路径进行“剪枝”,减少了检测时间,提高了检测速度。
以检测开源代码tomcat-6.0.14(包括1123个java文件,约32万行代码)中的空指针引用缺陷为例,分别使用如下工具进行测试:采用了本发明的区间运算的缺陷检测工具DTSJava1.0,及同类未采用区间运算的Java程序静态测试工具FindBugs1.3.1,PMD4.1,Klocwork K7,测试结果如表11所示。(实验条件:Windows XP操作系统,Intel Pentium 43.0GHz CPU、1.0GB内存)可以看出DTSJava所花费的检测时间较少,速度较快。
表11测试结果
  检测工具   所用时间(秒)
  FindBugs1.3.1   285
  PMD4.1   23
  Klocwork K7(试用版)   153
  DTSJava1.0   49
以下结合另一具体的测试实例来说明采用本发明所述区间运算的软件测试方法如何降低缺陷检测的误报率,提高检测的准确率。
在遍历程序控制流的过程中,采用区间运算可以有效地检测出不可达路径,从而避免了这类分支路径上的分析检测,结果也不会对这些路径上的缺陷进行报告,降低了误报率。
David Hovemeyer提出了一套空指针引用故障基准测试程序,程序内容以左右两列示例如下:
int intra1(int level){                  int intra1(int level){
     Object x=null;                        Object x=null;
     if(level>0)                            if(level>0)
         x=new Object();                       x=new Object();
     if(level</*>*/4)                        if(level</*>*/4)
         return x.hashCode();                   return x.hashCode();
     return 0;                              return 0;
}                                       }
int intra2(boolean b){                  int intra2(boolean b){
     Object x=null;                        Object x=null;
     if(b)                                   if(b)
         x=new Object();                       x=new Object();
     if(!b/*b*/)                            if(!b/*b*/)
          return x.hashCode();                   return x.hashCode();
     return 0;                              return 0;
}                                       }
int intra3(Object x){                   int intra3(Object x){
     Object y=null;                        Object y=null;
     if(x!=null)                           if(x!=null)
         y=new Object();                       y=new Object();
     if(y!=null)                           if(y!=null)
         return x.hashCode()+                    return x.hashCode()+
                y.hashCode();                          y.hashCode();
     else                                    else
         return x.hashCode()/*0*/;              return x.hashCode()/*0*/;
}                                       }
该测试程序包括6个测试用例intra1~intra6。本发明使用基于区间运算的DTSJava1.0和KlocworkK7对其进行了测试,测试结果添加到了表格的最后两行。比较结果如表12所示。每个测试用例都会产生一个空指针引用故障,如果用注释代码替换源代码相应部分,则空指针故障不会产生。表项中v代表x为局部变量的情况,f代表将x改为成员变量后的情况。一个v代表正确地报告出了故障,两个v代表代码替换前后都报告故障,其中一个是误报。f情况类似,空白表示没有报告故障。
表12测试结果
Figure A20081011426200231
从表中可以看出,DTSJava测试函数内部测试用例时没有误报,而且漏报很少,相比较而言,它的误报率较小,测试准确度较高。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。

Claims (9)

1、一种应用区间运算的软件测试方法,其特征在于,该方法包括:
步骤A、取符号表中的每一个变量,根据所述变量的类型设置初始区间值;
步骤B、根据控制流图产生时的节点序号顺序取控制流图中的下一个节点作为当前节点,如果所述当前节点为最后一个节点,则结束遍历,输出新生成的控制流图;否则执行步骤C;
步骤C、对所述当前节点的前驱节点上出现的除超出作用域的变量之外的每一个变量,求其在所述当前节点的所有前驱节点上的取值区间或区间集的并集,得到该变量在所述当前节点上的初始区间值或初始区间集;
步骤D、判断在所述当前节点上是否存在某个变量的初始取值区间为空,若存在则标记该节点为矛盾节点后,执行步骤B;若否,则执行步骤E;
步骤E、根据所述当前节点所对应的语句类型对该节点上的每个已获得初始区间值或初始区间集的变量进行相应的区间运算,得到所述变量新的区间取值后执行步骤B。
2、根据权利要求1所述的方法,其特征在于,步骤A中,根据所述变量的类型设置初始区间值的步骤如下:
A1、判断符号表中所取的变量是否为数值型变量,若是则将其区间集初始化为{[MIN,MAX]},MIN和MAX为自定义的最小值和最大值,然后执行步骤B;若否,则执行步骤A2;
A2、判断符号表中所取的变量是否为布尔型变量,若是则将其区间值初始化为TRUE_OR_FALSE,然后执行步骤B;若否则执行步骤A3;
A3、判断符号表中所取的变量是否为引用型变量,若是则将其区间值初始化为NOTNULL,然后执行步骤B。
3、根据权利要求1所述的方法,其特征在于,步骤C中,需根据所述变量的类型基于下述算式计算所述变量在当前节点上的初始区间值或区间集:
value(N,v)=merge(v,N1,...,Nm),m>1
其中,N为所述当前节点,N1,...,Nm为N的前驱节点,v为除超出作用域的变量之外的在所述当前节点N上出现的任一变量,value(N,v)代表变量v在当前节点上的初始区间值或区间集;merge表示针对变量v求其前驱节点的区间值或区间集的并集;
若所述当前节点N包含条件表达式时,则取初始的可能集为posbValue(N,v)=value(N,v),初始的必然集为necsValue(N,v)=value(N,v)。
4、根据权利要求1所述的方法,其特征在于,步骤E中,若所述当前节点所对应的语句类型为赋值语句,则根据被赋值变量的类型及右端表达式计算该赋值语句中表达式的取值区间,并将所述被赋值变量的取值区间重置为该新计算出的表达式的取值区间,然后执行步骤B。
5、根据权利要求4所述的方法,其特征在于,根据所述被赋值变量的类型及右端表达式计算该赋值语句中表达式的取值区间的步骤如下:
若所述被赋值变量为数值型变量,则计算所述右端表达式中各子表达式的取值区间集,然后根据连接所述子表达式的运算符类型进行区间集计算,得到所述表达式的取值区间集;
若所述被赋值变量为布尔类型变量,则计算所述右端表达式中各子表达式的区间,然后根据连接所述子表达式的运算符类型进行区间计算,得到所述表达式的区间;
若所述被赋值变量为引用类型变量,则根据所述右端表达式是否为空得到所述表达式的区间。
6、根据权利要求1所述的方法,其特征在于,步骤E中,若所述当前节点所对应的语句类型为条件判断语句,则对该节点所关联的每一变量取初始的可能集后计算该节点所关联的每一变量在所述条件判断语句中的取值的可能集和必然集,进而得到该节点所对应的控制流图中真假分支上的所述变量取值情况,然后执行步骤B。
7、根据权利要求6所述的方法,其特征在于,所述当前节点所关联的每一变量在所述条件判断语句中取值的可能集和必然集的计算步骤如下:
E1、判断所述条件判断语句的取值是否为真,若为真则执行E2,若为否则执行E4;
E2、判断所述条件判断语句是否为简单条件判断语句,若是则根据所述简单条件判断语句中操作对象的数据类型及关系运算符的类型,计算得到所述变量在所述条件判断语句中的取值的可能集和必然集;若否则执行步骤E3;
E3、首先计算组成所述条件判断语句中的各个子简单条件表达式中所述变量的可能集和必然集,然后依据关联所述子简单条件表达式的逻辑运算符的可能集和必然集的计算方法,得到所述变量在所述条件判断语句中的取值的可能集和必然集;
E4、所述变量在所述条件判断语句的取值为假时的可能集为所述变量在进入所述条件判断语句之前的取值区间减去所述变量在所述条件判断语句为真时的必然集。
8、根据权利要求1所述的方法,其特征在于,步骤E中,若所述当前节点所对应的语句类型为单变量多分支情况判断语句中的分支判断语句,则将分支切换语句中的变量的取值区间集重置为分支判断语句中的常量值,然后执行步骤B。
9、根据权利要求1所述的方法,其特征在于,步骤E中,若所述当前节点所对应的语句类型为单变量多分支情况判断语句中的默认分支语句,则将分支切换语句中的变量的取值区间置为该变量的初始取值区间集减去该单变量多分支情况判断语句中所有的分支判断语句中的常量值后所得的区间集,然后执行步骤B。
CN2008101142625A 2008-06-02 2008-06-02 应用区间运算的软件测试方法 Expired - Fee Related CN101286133B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2008101142625A CN101286133B (zh) 2008-06-02 2008-06-02 应用区间运算的软件测试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2008101142625A CN101286133B (zh) 2008-06-02 2008-06-02 应用区间运算的软件测试方法

Publications (2)

Publication Number Publication Date
CN101286133A true CN101286133A (zh) 2008-10-15
CN101286133B CN101286133B (zh) 2010-06-16

Family

ID=40058349

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2008101142625A Expired - Fee Related CN101286133B (zh) 2008-06-02 2008-06-02 应用区间运算的软件测试方法

Country Status (1)

Country Link
CN (1) CN101286133B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104035864A (zh) * 2013-12-17 2014-09-10 北京邮电大学 一种基于矛盾片段模式的路径生成方法
CN107085533A (zh) * 2017-03-27 2017-08-22 北京北大软件工程股份有限公司 一种指针修改影响的分析方法和系统
CN107239395A (zh) * 2016-03-29 2017-10-10 阿里巴巴集团控股有限公司 一种源代码中无效函数的查找方法和设备
CN108198066A (zh) * 2017-11-29 2018-06-22 南京农纷期电子商务有限公司 一种金融行业自动化计费系统
CN111198911A (zh) * 2018-11-19 2020-05-26 珠海格力电器股份有限公司 一种数据提取增量区间的获取方法、数据提取方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100461132C (zh) * 2007-03-02 2009-02-11 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104035864A (zh) * 2013-12-17 2014-09-10 北京邮电大学 一种基于矛盾片段模式的路径生成方法
CN104035864B (zh) * 2013-12-17 2017-10-20 北京邮电大学 一种基于矛盾片段模式的路径生成方法
CN107239395A (zh) * 2016-03-29 2017-10-10 阿里巴巴集团控股有限公司 一种源代码中无效函数的查找方法和设备
CN107239395B (zh) * 2016-03-29 2020-06-02 阿里巴巴集团控股有限公司 一种源代码中无效函数的查找方法和设备
CN107085533A (zh) * 2017-03-27 2017-08-22 北京北大软件工程股份有限公司 一种指针修改影响的分析方法和系统
CN107085533B (zh) * 2017-03-27 2019-09-06 北京北大软件工程股份有限公司 一种指针修改影响的分析方法和系统
CN108198066A (zh) * 2017-11-29 2018-06-22 南京农纷期电子商务有限公司 一种金融行业自动化计费系统
CN108198066B (zh) * 2017-11-29 2021-10-15 南京农纷期电子商务有限公司 一种金融行业自动化计费系统
CN111198911A (zh) * 2018-11-19 2020-05-26 珠海格力电器股份有限公司 一种数据提取增量区间的获取方法、数据提取方法
CN111198911B (zh) * 2018-11-19 2021-05-25 珠海格力电器股份有限公司 一种数据提取方法

Also Published As

Publication number Publication date
CN101286133B (zh) 2010-06-16

Similar Documents

Publication Publication Date Title
CN101937388B (zh) 一种高可扩展性和可维护性的源代码缺陷检测方法及装置
de Moura et al. Proofs and Refutations, and Z3.
CN101286133B (zh) 应用区间运算的软件测试方法
Khoshgoftaar et al. Classification of fault-prone software modules: Prior probabilities, costs, and model evaluation
Barthou et al. Fuzzy array dataflow analysis
Heeren et al. Generalizing Hindley-Milner type inference algorithms
Fernandez et al. Constraint functional logic programming over finite domains
Hofer et al. Combining models for improved fault localization in spreadsheets
Dold A formal representation of Abstract State Machines using PVS
CN102662829B (zh) 一种复杂数据结构在代码静态测试中的处理方法和装置
Morasca Software measurement
Zhu et al. A new node-based concept for solving the minimal path problem in general networks
Fernández et al. Solving combinatorial problems with a constraint functional logic language
Wang et al. Invariant based fault localization by analyzing error propagation
CN101840372B (zh) 应用符号分析的软件测试方法
Babu et al. Assessment of maintainability factor
Teichmann et al. A link between multioperator and tree valuation automata and logics
Green et al. An introduction to slice-based cohesion and coupling metrics
Kneis et al. A new satisfiability algorithm with applications to Max-Cut
Albert et al. Experiments in cost analysis of Java bytecode
Hanmer et al. Data analytics: Predicting software bugs in industrial products
Hamilton Poítin: Distilling theorems from conjectures
Zhang et al. A novel memory leak classification for evaluating the applicability of static analysis tools
Stumptner et al. Comparing two models for software debugging
Fauth et al. Process-based building permit review–A knowledge engineering approach

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
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20100616

Termination date: 20180602