一种快速的循环扩展检测方法

文档序号:6424871阅读:128来源:国知局
专利名称:一种快速的循环扩展检测方法
技术领域
本发明涉及软件模型检测技术以及状态空间归约技术,针对含有关于聚合类型的循环的data-based程序的验证空间爆炸问题,提出了一种新的循环扩展的检测方法。
背景技术
模型检测技术是一种验证系统的有限状态空间是否满足正确属性的方法。传统的模型检测技术从被测系统的初始状态出发,产生并验证该初始状态的所有后继状态是否满足某个给定的正确或者安全属性。目前已提出很多针对状态爆炸问题的软件模型检测技术以及状态归约技术(参考文献Chaki,S.,E. Clarke, et al. (2003).Modular verification of software components in C. Software Engineering,2003.Proceedings. 25th International Conference on.;文献Henzinger,T. A.,R. Jhala, et al. (2002). Lazy abstraction. Proceedings of the 29th ACM SIGPLAN-SIGACTsymposium on Principles of programming languages. Portland, Oregon,ACM :58-70.;文献Corbett, J. C.,Μ. B. Dwyer, et al. (2000). Bandera !extracting finite-statemodels from Java source code.Software Engineering,2000. Proceedings of the 2000International Conference on.),例如偏序规约技术以及谓词抽象技术,然而这些技术主要用于检测control-based的程序,而不能有效的检测data-based的程序。data-based的程序通常有非常庞大(通常是无限的)的测试空间,虽然小范围假设(small scopehypothesis)理论的验证,可以将测试空间缩小到一个限定的有限空间内,但是这个空间仍然非常大。目前存在的一些针对data-based程序的模型检测技术,如Korat产生并验证限定空间中的每个合法(满足某个给定的前置条件)的状态,然而这样依次独立检查每个状态的方法往往是非常低效的(参考文献Boyapati,C.,S. Khurshid, et al. (2002).Korat !automated testing based on Java predicates. Proceedings of the 2002ACM SIGS0FT international symposium on Software testing and analysis. Roma,Italy,ACM :123-133.)。Glass Box技术是另一种针对data-based程序的模型检测技术(参考文献Darga,P. T. and C. Boyapati (2006). Efficient software model checkingof data structure properties. Proceedings of the 21st annual ACM SIGPLANconference on Object-oriented programming systems, languages,and applications.Portland, Oregon, USA,ACM :363-382.),它利用了测试空间中状态的相似性,同时检测相似状态(而不是单独的检测每个状态)。Module Glass Box技术(参考文献Roberson,M. and C. Boyapati(2010). Efficient modular glass box software model checking.Proceedings of the ACM international conference on Object oriented programmingsystems languages and applications. Reno/Tahoe,Nevada,USA,ACM :4-21.)利用执行路径信息来寻找相似状态,该方法能找到更多的相似状态。然而我们观察到,很多数据结构的方法中都包含有关于聚合类型的循环,而这些循环是导致测试用例和检测时间增多的一个主要原因。目前已有的模型检测方法不能有效的检测这类程序,这就使得提出一种有效的针对含有聚合类型的循环结构的程序的模型检测方法尤为重要。

发明内容
针对 现有技术存在的问题,本发明的目的在于提出一种检测含有关于聚合类型的循环(以下均简称循环)的程序的检测方法,以快速规约测试状态空间。本发明以检测含循环的程序为分析对象,公开了一种快速的循环扩展检测方法。与已有的模型检测方法相t匕,该方法能在更短的时间内显示检测更少的状态来检测含有循环的程序的性质。为了验证某个程序的实现是否满足某个给定的正确属性,本方法检测被测程序是否在测试空间中的所有状态上的行为都表现正确。被测程序的合法前置状态是指满足被测程序的前置条件的状态,被测程序的合法后置状态是指满足被测程序的后置条件的状态。一个状态通过检测,当且仅当被测程序在该状态上的行为表现正确,也就是基于该状态执行被测程序后的后置状态是满足后置条件的合法后置状态。本方法只考虑限定的测试空间中的所有满足前置条件的状态。因此本方法首先初始化测试空间为被测程序的限定范围内所有满足前置条件的状态;然后从测试空间中随机挑选一个未检测的状态,并基于该状态调用被测程序,在程序的动态执行过程中收集动态执行信息以及路径信息;然后分析收集到的动态执行信息,依次静态计算刚收集的执行路径的循环扩展相似的路径,并执行静态分析检查是否所有经过该循环扩展相似路径的状态的正确性;将所有通过检测的状态从测试空间中裁剪掉;如果存在某个状态未通过检测,则表明被测程序的实现中存在错误,此时本方法打印出错,并给出反例;迭代执行这个检查过程,直到检测完测试空间中的所有状态。最终本方法验证被测程序的实现满足所检查的属性,或者给出反例集合以发现存在的错误。为了达到上述目的,本发明采用的技术方案主要包含了动态和静态分析相结合的方法来标识状态以及检测被标识的状态的正确性,该方法包含以下几个步骤Ia)限定测试空间中的每个变量的取值范围,并将测试空间的状态初始化为限定范围内的所有满足被测程序前置条件的状态,进入步骤Ib);Ib)判断测试空间中是否存在未检测的状态,如果没有则检测结束;否则进入步骤 Ic);Ic)挑选一个未检测的状态S,基于状态s执行被测程序,同时符号执行(symbolicexecution)(参考文献J. C. King. Symbolic execution and program testing. Commun.ACM, 19 (7) :385-394,1976.)被测程序来收集该状态经过被测程序的路径p所经过的程序分支约束条件信息以及其他动态执行信息,进入步骤Id ;Id)分析收集到的动态执行信息,依次检测路径P的所有循环相似扩展路径P’,然后返回步骤Ib)对路径P的每条循环扩展相似路径P’,计算P’的路径约束(是指路径P’经过的所有程序分支约束条件的交运算),满足P’的路径约束的所有状态肯定经过被测程序的路径P’,本方法执行静态分析同时检查这些状态的正确性,如果所有状态都通过检测,则可以安全的将路径P’的路径约束表示的状态从测试空间中裁剪掉而不必执行显示执行测试用例来检测这些状态;如果存在未通过检测的状态,本方法打印出错信息,并给出反例。如果基于状态S执行被测程序得到执行路径P,则可以说状态S经过路径P,而路径P标识了状态S。通过上述技术方案可以看出,由于本发明在每次调用被测程序时,都静态的构造与前一个执行路径循环扩展相似的所有路径,每条循环扩展相似路经的路径约束都表示测试空间中的一个状态集合,本方法依次静态检查这些状态集合(而不是显示检测这些状态),在这些状态集合中的所有状态都通过检查的时候,本方法将其从测试空间中裁剪掉。与 现有技术相比,本发明的积极效果为跟其他data-based的模型检测工具和方法相比,比如Korat与Glass Box模型检测方法,本方法通过静态的检测更多的状态来减少显示检测的状态数,进而减少了执行的测试用例个数,加快检测速度。


图I是本方法检测算法的流程图;图2是收集动态执行彳目息流程图;图3是计算循环相似路径P’的行号列表流程图;图4是静态构造循环扩展相似路径P’的路径约束和经过路径P’后的后置状态流程图;图5是静态检测经过路径P’的所有状态流程图。
具体实施例方式下面结合附图和具体实施方式
对本发明作更进一步的说明本方法是检测含有关于聚合类型的循环的数据结构方法的模型检测方法。如图I所示,本方法不断迭代检测步骤,来检查整个测试空间,直到迭代检查完测试空间中的所有操作为止。该检测算法的伪代码描述如下所示
1void check(Bounds b) {Il 限制测试空间b
2S = {s e b I s.repOK() == True} Il 初始化测试空间3while (S != ο) {
4s = any state in SIl从S中随机选一个未检查的状态s
5P = run(s)//基于s执行被测程序,并符号执行以收集路径p
7while (not all LESPs of p are considered) {
8p’= validLESPOf(p);//p’是路径p的一条合法的循环相似路径
9S’= similarStates (p’) Il计算经过路径p’的所有状态
10if (some state in S5 fails check) { // 检查正确性
11print (“error” and a counterexample)
12}
13S = S-S5// 从S中裁剪S’
14}
15} 16}为了更清楚地理解本发明,将本方案的具体实施过程描述如下(I)初始化测试空间S ;本方法首先限定测试空间中的各个变量的取值范围,并初始化测试空间中的状态为限定测试空间中的所有满足被测程序的前置条件的状态。为了能有效的管理测试空间,本方法用一种增量式求解器,YICES,来管理(包括从测试空间中随机挑选一个未检测的状态,删除一个或者多个状态等操作)测试空间。本方法将被测程序的前置条件转换为一个求解器HCES可接收的公式,并将该公式加入求解器HCES中,以使求解器产生的所有解都能编码为满足被测程序的前置条件的状态。(2)如果测试空间S非空,则从测试空间S中随机选择一个未检测的状态s进入步骤(3),否则结束;如果管理测试空间的求解器还能提供一组对测试空间中的变量的赋值,则表明测试空间S非空,此时本方法从求解器获取一组对测试空间中的变量的赋值,并将该组赋值编码为下一个检查状态s ;如果求解器不能提供一组对测试空间中的变量的赋值,则表明已检测完所有状态,并且没有发现被测程序中的任何错误。(3)基于状态s执行被测程序,并同时符号执行该程序收集执行路径P (为了便于表不,每条路径用该路径经过的行号序列来表示)的路径分支约束信息,以及其他动态执行信息;在步骤(2)中选择的未检测的状态s上执行被测程序的过程中,本方法在动态执行过程中自动收集其路径分支约束信息以及其他动态执行信息。该方法收集的动态信息包括以下几个方面执行过程中遇到的路径分支约束条件(例如执行语句if (a > b)时,如果该条件成立,那么记录路径条件a > b),执行语句的effect rules (effect rule是一个三元组(ln,oldValue,newValue),该三元组表示行号为In的语句将oldValue变量的符号值改变为newValue的符号值),以及此次执行经过的所有循环子路径(是完整路径的行号序列的一部分,且该部分的下一个行号等于该部分的第一个行号,例如在完整路径I,2, 3,4,5,6,4,7,8中,4,5,6是一个循环子路径)。图2描述了收集动态执行信息流程图,其具体步骤为(3a)用一个列表记录执行路径依次经过的语句行号,并初始化该列表为空,进入步骤3b ;(3b)执行下一条程序语句(设该语句的行号为In),首先判断行号列表中是否已存在行号In,是则将行号列表中从In开始到列表末尾的子列表记录为一个循环子路径,并为该循环子路径分配一个唯一标识,然后将行号列表中的刚发现的循环子路径部分用它的唯一标识来替换,最后将当前执行的语句的行号In加入行号列表并进入步骤(3c);如果没有发现循环子路径,则将当前执行的行号In直接加入行号列表,并进入步骤(3c);(3c)判断当前语句是否为条件分支语句,是则记录该条件分支语句产生的分支条件,然后进入步骤(3d);否则直接进入步骤(3d)(3d)如果当前语句改变前置状态的某些值或被测程序的某些局部变量,则记录该语句的effect rule,并接着进入步骤(3e);否则直接进入步骤(3e);
(3e)判断此次执行是否结束,如果没有结束则进入步骤(3b),否则进入步骤(3f);(3f)将整个行号列表记录为一个特殊的循环子路径,称其为top循环子路径,该循环子路径只能循环一次,进入步骤(3g);(3g)计算每个循环子路径的循环模式(一个循环子路径的循环模式是一个行号列表,该列表记录该循环子路径依次经过的行号或者其他的循环子路径),然后结束。如果一个循环子路径a连续两次或者多次经过循环子路径b,那么循环子路径a的循环模式中只记录一个而不是多个b。例如循环子路径a为{l,2,3,b,b,b,5,6},那么a连续三次经过循环子路径b,此时a的循环模式为{1,2,3,b,5,6}。(4)如果存在还未考虑的路径P的循环扩展相似路径(某个路径的循环扩展相似路径是指与该路径以相同的顺序经过相同的循环子路径,但可能经过相同循环子路径不同的次数),则设定还未考虑过的循环子路径的循环次数组合后进入步骤(5),否则进入步骤
(2);如果路径P共有η个循环子路径lbl,. . . Ibn,用tl,. . tn分别表示这η个循环子路径在循环扩展相似路径P’中的循环次数,那么每个对tl,... tn的一组赋值就对应着一个P的可能的循环扩展相似路径。在设定好tl. . . tn的值后进入步骤(5)。如果所有的循环子路径的循环次数组合都考虑过,则直接进入步骤(2)。(5)根据步骤(4)的设定,构造路径P的循环扩展相似路径P’ ;构造路径P’包括构造路径P’的路径约束条件以及经过路径P’后的后置状态。本方法首先找出路径P’经过的行号列表,如图3所示。具体来说根据步骤(4)的设定依次赋值tl, . . . tn,将ti (I <= i < = η)设定为循环子路径Ibi的循环次数,并按照此种设定计算出对应的路径P’经过的行号列表。用一个列表list来记录路径ρ’依次经过的行号或者循环子路径,并将list初始化为top循环子路径的循环模式;然后依次遍历list中的各个元素e,如果e表示循环子路径lbi,则表示循环子路径Ibi在路径P’中的循环次数为ti,因此将Ibi的循环模式迭代ti次后得到的列表替换list中的元素e。依次处理完list中的所有元素后,list记录了路径ρ’依次经过的行号列表。在得到路径P’经过的行号列表后,本方法构造路径P’的路径约束和经过路径P’后的后置状态,如图4所示。具体步骤为依次遍历路径P’经过的行号列表,如果行号对应的语句带有effect rule,则根据该effect rule改变前置状态;如果行号对应的语句能产生分支条件,则产生对应的分支条件。当遍历完list中的所有元素时,本方法得到了路径P’的所有分支条件,因此得到了路径P’的路径约束(所有分支条件的交运算得到的约束条件)。为了保证路径P’是一条合法的循环扩展路径,本方法判断路径P’的路径约束是否是可满足的。如果P’的路径约束是不可满足的,则表明P’是一条非法的路径,此时返回步骤⑷。(6)检查经过路径P’的所有状态,并返回步骤4.图5描述了本方法静态检测经过路径P’的所有状态的流程图。具体步骤为6a)满足路径P’的路径约束的所有状态为经过路径P’的状态,设这个状态集合为S,。6b)检测路径P’的后置状态是否满足测试程序的后置条件,如果后置状态不满足被测程序的后置条件,则本方法打印错误信息,并给出反例,然后进入步骤(6c);否则直接进入步骤(6c)。具体来说,本方法检测工具S’ - > R的合法性,其中S’是表示经过路径ρ’的所有状态,R表示被测程序的后置条件,该公式成立则表示所有经过路径P’的状态的后置状态都满足后置条件R。为了便于该公式的合法性检测,本方法检测公式 (S’ - > R)是否有解,如果该公式有解,则表明原公式S’-> R不是恒成立,此时存在某个状态未通过检测,因而发现反例。 6c)从测试空间S中裁剪所有经过路径P’的状态集合S’,并返回步骤5a。从以上的对本方法描述可知,如果本方法在步骤(5d)中给出被测程序的反例,则每个反例发现被测程序中的一个错误,如果在步骤(5d)中未生成任何反例,则表示本方法没有发现被测程序中的任何错误。
权利要求
1.一种快速的循环扩展检测方法,其步骤为 1)限定测试空间中各个变量的取值范围,并将测试空间中的状态初始化为被测程序限定范围内所有满足被测程序的前置条件的状态; 2)从测试空间中随机挑选一个未检测的状态S,并基于该状态s调用被测程序,记录该状态s经过被测程序的执行路径P,以及动态执行信息; 3)根据所收集的动态执行信息,依次计算并检测执行路径p的循环扩展相似路径p’执行静态分析,检查路径P’的路径约束条件表示的所有状态是否正确;如果所有状态都通过检测,则将这些通过检测的状态从测试空间中裁剪掉;如果存在某个状态未通过检测,则打印该出错状态并给出反例; 4)重复步骤2) 3),直到检测完测试空间中的所有状态。
2.如权利要求I所述的方法,其特征在于所述将测试空间中的状态初始化为被测程序限定范围内所有合法的前置状态的方法为将被测程序的前置条件转换为一个求解器YICES可接收的公式,并将该公式加入求解器HCES中,然后将求解器HCES产生的所有解编码为满足被测程序前置条件的限定范围内所有状态。
3.如权利要求I所述的方法,其特征在于所述从测试空间中随机挑选一个未检测的状态s的方法为利用求解器获取一组对测试空间中的变量的赋值,并将该组赋值编码为状 S O
4.如权利要求I所述的方法,确定是否检测完测试空间中的所有状态的方法为如果求解器不能提供一组对测试空间中的变量的赋值,则确定已检测完测试空间中的所有状态。
5.如权利要求I所述的方法,其特征在于记录所述动态执行信息的方法为 a)建立并初始化一列表,用于记录执行路径依次经过的语句行号; b)执行程序的第In行语句,首先判断行号列表中是否已存在行号In;如果存在,则将行号列表中从In开始到列表末尾的子列表记录为一个循环子路径,并为该循环子路径分配一个唯一标识,然后将行号列表中的子列表部分用其唯一标识替换,最后将当前执行语句的行号In加入行号列表并进入步骤c);如果不存在,则将当前执行的行号In直接加入行号列表,并进入步骤c); c)判断当前语句是否为条件分支语句;如果是,则记录该条件分支语句产生的分支条件,然后进入步骤e);否则直接进入步骤d); d)判断当前语句是否会改变前置状态的某些值或被测程序的某些局部变量;如果是,则用一个effect rule来记录该语句对前置状态产生的影响,然后进入步骤e);否则直接进入步骤e);其中,effect rule是一个三元组(In, oldValue, newValue), In为行号、oldValue为修改前的变量值、newValue修改后的变量值; e)执行下一行语句,直到程序结束,将整个行号列表记录为top循环子路径; f)执行top循环子路径,计算所有找到的循环子路径的循环模式。
6.如权利要求5所述的方法,其特征在于所述动态执行信息包括执行过程中遇到的路径条件、语句的effect rule、此次执行经过的所有循环子路径。
7.如权利要求I或5或6所述的方法,其特征在于所述根据所收集的动态执行信息,依次构造并检测执行路径P的每条循环扩展相似路径P’的方法为设路径P共有n个循环子路径Ibl,.. lbn,用tl,. . tn分别表示这n个循环子路径的循环次数;对于tl,. . . tn的每一组赋值对应路径P的一条循环扩展相似路径P’。
8.如权利要求7所述的方法,其特征在于计算所述循环扩展相似路径p’的方法为用一个列表list来记录路径p’依次经过的行号或者循环子路径,并将list初始化为top循环子路径的循环模式;然后依次遍历list中的各个元素e,如果e表示循环子路径lbi,则将Ibi的循环模式迭代ti次后得到的列表替换list中的元素e ;依次处理完list中的所有元素后,list记录了路径p’依次经过的所有行号,得到路径p’的行号列表;然后计算路径P’的路径约束和经过路径P’的后置状态。
9.如权利要求8所述方法,其特征在于计算所述循环扩展相似路径p’的路径约束和经过路径p’的后置状态的方法为依次遍历路径P’经过的行号列表,如果行号对应的语句带有effect rule,则根据该effect rule改变前置状态;如果行号对应的语句能产生分支条件,则产生对应的分支条件;当遍历完list中的所有元素时,得到路径p’的所有分支条件和路径约束。
10.如权利要求7所述的方法,其特征在于检查经过路径p’的状态是否正确的方法为 a)设满足路径P’的路径约束的所有状态为经过路径P’的状态,设这个状态集合为S’; b)检测是否所有经过路径S’的所有状态的后置状态都满足测试程序的后置条件,如果有状态未通过检查,则打印错误信息并给出反例,否则,从测试空间中裁剪所有经过路径P’的状态集合S’。
全文摘要
本发明公开了一种快速的循环扩展检测方法,属于软件模型检测技术领域。本方法为1)限定测试空间中各个变量的取值范围,并将测试空间中的状态初始化为被测程序限定范围内所有满足被测程序的前置条件的状态;2)随机挑选一个未检测的状态s,调用被测程序,记录该状态s经过被测程序的执行路径p以及动态执行信息;3)根据动态执行信息,依次计算并检测执行路径p的循环扩展相似路径p’,检查路径p’的路径约束条件表示的所有状态是否正确;如果正确则将这些通过检测的状态从测试空间中裁剪掉;如果未通过检测,则打印出错状态并给出反例;4)迭代检查测试空间中的所有状态。本方法减少了执行的测试用例个数,加快检测速度。
文档编号G06F11/36GK102799517SQ20111013779
公开日2012年11月28日 申请日期2011年5月25日 优先权日2011年5月25日
发明者易秋萍, 刘剑, 沈武威, 汪孙律, 李斌 申请人:中国科学院软件研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1