面向批量未解释程序的联合验证方法

文档序号:30653072发布日期:2022-07-06 00:22阅读:104来源:国知局
面向批量未解释程序的联合验证方法

1.本发明涉及程序自动分析技术领域,尤其涉及一种面向批量未解释程序的联合验证方法。


背景技术:

2.未解释程序是带有未解释函数的一类程序,未解释函数也即为没有具体的函数解释的函数。在程序分析中,某些函数的具体实现有可能无法获知,或者对要分析的性质没有影响,因而需要将该类函数抽象为未解释函数以继续程序分析。如图1所示,程序中的函数f没有具体的实现,因此被抽象为了未解释函数,这时可以利用的只有相同的输入会有相同的输出这一个性质。未解释程序的验证也即为验证程序是否满足某一性质,以图1中左侧程序为例,对该程序验证即为验证程序结束时是否满足x和y相等,即assert(x=y)的形式。由于未解释函数没有具体的函数解释,当该类函数解释为不同函数类型时,程序满足某一性质是否恒成立的结果可能是不同的,即依据函数的解释不通断言并不是恒成立的。如图1所示,经过真分支的路径无论函数f解释为何种类型,都可以满足最后的断言,而假分支的路径,当f解释为恒等函数时可以满足断言,但解释为自增函数时则无法满足断言,因此假分支的路径并不会在所有情况下满足断言。
3.未解释程序的验证问题通常是不可判定的,对于满足coherent性质的未解释程序是可判定的,而coherence性质需要要求:在未解释程序中的任一程序路径的执行计算过程中,(i)不会对已被丢弃的项信息进行重复计算(满足memoizing);(ii)项之间的等价信息得到及时传递(满足early-assumes)。针对于未解释程序的判定,现有技术通常仅是特定针对于满足上述coherent性质的未解释程序,且在实际中往往需要实现批量未解释程序的验证,现有技术中对批量未解释程序验证时,通常是分别对每个程序单独进行验证,即各个未解释程序分别独立进行验证,而实际上批量未解释程序中可能存在相似的未解释程序,相似的未解释程序中的相似部分判定过程是相同的,采用各个程序单独验证的方式,会使得需要重复判断相似部分,造成验证资源的浪费,影响验证效率。例如对不同软件版本的回归验证,对组合开发得到的一系列程序的验证,实际上这些程序之间可能是具有相似之处,重复验证会导致资源的浪费。


技术实现要素:

4.本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种面向批量未解释程序的联合验证方法,能够有效实现各类未解释程序的验证,同时提高批量未解释程序的验证效率以及精度。
5.为解决上述技术问题,本发明提出的技术方案为:
6.一种面向批量未解释程序的联合验证方法,步骤包括:
7.步骤s01.使用当前保存的抽象模型对当前的程序自动机进行精化以去除已被验证的路径,得到精化后的程序自动机,所述程序自动机为由当前待验证的未解释程序抽象
得到,抽象模型由保存验证过程中不可行路径泛化的反例自动机得到;
8.步骤s02.判断所述精化后的程序自动机是否为空,如果为空则判断当前待验证的未解释程序正确,转入步骤s05,否则转入步骤s03;
9.步骤s03.从所述精化后的程序自动机中抽取一条路径并进行路径可行性检查,若路径可行则判定当前待验证的未解释程序错误,得到一条错误路径,转入步骤s05;若路径不可行则转入步骤s04;
10.步骤s04.根据抽取出路径的路径类型进行路径泛化得到反例自动机,使用所述反例自动机对所述精化后的程序自动机进行精化以去除已被验证的路径,并将所述反例自动机保存为所述抽象模型以在新未解释程序验证时进行复用,返回步骤s02;
11.步骤s05.判断是否完成所有未解释程序验证,如果是则退出验证,否则取新的未解释程序后返回步骤s01。
12.进一步的,所述步骤s01中,通过将所述抽象模型取反操作后结果与所述程序自动机求取交集,使得去除所述程序自动机中已被验证的路径,实现初始精化。
13.进一步的,所述步骤s03中,采用基于一致性的路径可行性检查方式检查抽取出路径的可行性。
14.进一步的,所述步骤s04中根据路径类型进行泛化包括:判断抽取出路径的路径类型,对不同路径类型使用不同的补全信息方式进行信息补全,并基于一致性的抽象方法进行路径抽象,得到所述泛化的反例自动机。
15.进一步的,所述基于一致性的抽象方法进行路径抽象包括:计算当前抽取的不可行路径对应的状态序列,对所述状态序列进行等价状态合并,得到抽象后的反例自动机作为所述泛化结果。
16.进一步的,所述判断抽取出路径的路径类型时,如果为coherent的路径类型,直接利用基于一致性的抽象方法进行抽象;如果为违反memoizing的路径类型,通过添加辅助变量补全丢失项的信息,然后利用基于一致性的抽象方法进行抽象;如果为违反early-assumes的路径类型,通过将assume语句提前以补全丢失的信息,然后利用基于一致性的抽象方法进行抽象,得到抽象后的自动机。
17.进一步的,如果为coherent的路径类型,直接根据对应的状态序列进行等价状态合并,得到抽象后的自动机;如果为违反memoizing的路径类型,通过添加辅助变量补全丢失项的信息后,删掉辅助变量作用域(即辅助变量保存的项第一次被计算和最后一次被计算之间)之外的信息,然后将根据对应的状态序列进行等价状态合并,得到抽象后的自动机;如果为违反early-assumes的路径类型,将违反early-assumes的语句提前至程序最前面的位置,然后根据对应的状态序列进行等价状态合并,得到抽象后的自动机。
18.进一步的,所述步骤s04中,所述反例自动机对所述精化后的程序自动机进行精化包括:将泛化得到的所述反例自动机取反然后与所述精化后自动机进行取交集操作,得到最终的精化结果。
19.一种面向批量未解释程序的联合验证装置,包括处理器以及存储器,所述存储器用于存储计算机程序,所述处理器用于执行所述计算机程序,所述处理器用于执行所述计算机程序以执行如上述方法。
20.一种存储有计算机程序的计算机可读存储介质,所述计算机程序执行时实现如上
述的方法。
21.与现有技术相比,本发明的优点在于:
22.1、本发明基于反例抽象精化框架来实现未解释程序的验证,通过从程序的路径空间中选取一条路径,如果路径可行则判定程序错误,如果路径不可行,则通过路径抽象方法泛化出更多路径,然后从程序空间中去掉该泛化出的路径,如果程序空间为空,则判定所有的路径都被验证为不可行,原程序正确,否则继续从程序空间中抽取路径,重复直到得到程序验证结果,可以快速、有效的实现各类未解释程序的验证。
23.2、本发明在采用反例抽象精化方法对批量未解释程序进行验证的基础上,同时考虑批量未解释程序中相似程序之间重复验证问题,通过将中间的验证结果保存,使得在遇到相似的新批量未解释程序时可以复用该验证结果,避免大量不必要的重复验证过程,从而大大提高批量未解释程序的验证效果。
24.3、本发明进一步根据路径是否coherent、违反memoizing、违反eraly-assumes的不同类型,分类进行路径泛化,可以有效提高各类型路径泛化的泛化能力,从而可实现对不满足coherence性质等各类未解释程序的验证。
附图说明
25.图1是未解释程序的示例图。
26.图2是本实施例面向批量未解释程序的联合验证的实现流程示意图。
27.图3是本发明具体应用实施例中实现未解释程序的验证的详细流程示意图。
28.图4是本发明在具体应用实施例中所需要验证的三个程序的示意图。
29.图5是本发明在具体应用实施例中验证第一个程序的原理示意图。
30.图6是本发明具体应用实施例中验证第二个程序的原理示意图。
31.图7是本发明具体应用实施例中验证第三个程序的原理示意图。
32.图8是本发明在具体应用实施例中对coherent路径泛化的原理示意图。
33.图9是本发明在具体应用实施例中对违反memoizing路径泛化的原理示意图。
34.图10是本发明在具体应用实施例中对违反early-assumes路径泛化的原理示意图。
具体实施方式
35.以下结合说明书附图和具体优选的实施例对本发明作进一步描述,但并不因此而限制本发明的保护范围。
36.本发明基于反例抽象精化框架来实现未解释程序的验证:通过从程序的路径空间中选取一条路径,如果路径可行,说明程序错误,如果路径不可行,则通过路径抽象方法泛化出不可行原因相同的更多路径,然后从程序空间中去掉这部分路径,如果程序空间为空,则表明所有的路径都被验证为不可行,原程序正确,否则继续从程序空间中抽取路径,重复上述过程,直到得到程序验证结果;在采用上述反例抽象精化方法对批量未解释程序进行验证的基础上,同时考虑批量未解释程序中相似程序之间重复验证问题,通过将中间的验证结果保存,使得在遇到相似的新批量未解释程序时可以复用该验证结果,避免大量不必要的重复验证过程,节省了计算资源,从而在确保验证精度的前提下,大大提高批量未解释
程序的整体验证效率。
37.如图2所示,本实施例面向批量未解释程序的联合验证方法的步骤包括:
38.步骤s01.对当前待验证的未解释程序进行抽象得到程序自动机,使用当前保存的抽象模型对程序自动机进行精化以去除已被验证的路径,得到精化后自动机,抽象模型为保存的验证过程中由不可行路径泛化得到的反例自动机;
39.步骤s02.判断精化后的程序自动机是否为空,如果为空则判断当前待验证的未解释程序正确,转入步骤s05,否则转入步骤s03;
40.步骤s03.从精化后的程序自动机中抽取一条路径并进行路径可行性检查,若路径可行则判定当前待验证的未解释程序错误,则这条路径作为一条错误路径以说明当前程序存在错误,转入步骤s05;若路径不可行则转入步骤s04;
41.步骤s04.根据抽取出路径的路径类型进行路径泛化得到反例自动机,使用反例自动机对精化后的程序自动机进行精化以去除已被验证的路径,并将反例自动机保存为抽象模型以在新未解释程序验证时进行复用,返回步骤s02;
42.步骤s05.判断是否完成所有未解释程序验证,如果是则退出验证,否则取新的未解释程序后返回步骤s01。
43.本实施例通过基于反例抽象精化框架来实现未解释程序的验证,同时在验证过程中保存验证过程中由不可行路径泛化得到的反例自动机,使用该保存的反例自动机作为抽象模型对待验证程序的程序自动机进行净化,能够避免重复执行不必要的验证过程而浪费资源,有效提高批量未解释程序的整体验证效率。
44.本实施例步骤s01中,通过将抽象模型取反操作后结果与程序自动机求取交集,使得去除程序自动机中已被验证的路径,实现初始精化。例如当前待验证的未解释程pi抽象的程序自动机表示为api,as表示为保存的抽象模型所对应的自动机,即验证过程中保存的由不可行路径泛化得到的反例自动机,则初始精化的过程即可表示为:抽象模型中保存有已经验证过的路径,则通过抽象模型取反与程序自动机求交集操作后,可以将程序自动机中已被验证的路径去除,实现程序自动机精化。
45.如图3所示,本实施例对批量未解释程序进行验证时,每次取一个未解释程序pi进行初始精化,通过将抽象模型as取反操作后结果与程序自动机api求取交集,即复用保存的中间验证结果(抽象模型as)去除程序自动机api中已经验证的路径,然后判断精化后的程序自动机是否为空,如果为空则判断当前待验证的未解释程序正确,如果不为空则从精化后的程序自动机中抽取一条路径c,进行路径可行性检查,如果可行则可判定程序pi是错误的,如果不可行则进一步将路径c采用路径抽象泛化的方法进行路径泛化,得到泛化后的反例自动机ac,使用泛化后的反例自动机ac对精化后的程序自动机进行再次精化,同时通过as=as∪ac保留泛化结果以在后续程序验证过程中复用该结果。
46.以对三个具体程序进行验证为例,如图4所示,其中以block1表示x:=decr(x);x:=incr(x);y:=decr(x);y:=incr(x),以block2表示x:=incr(x);y:=incr(y),以non-focus代表z:=next(z),assume(z!=n1),assume(z=n1),assume(z!=n2),assume(z=n2)。首先对程序p0进行验证,首先将p0抽象为程序自动机,如图5(a)所示,对该程序进行反例抽象精化验证,取出的路径为不可行路径,对该路径抽象得到的反例自动机如图5(b)所
示,由程序自动机p0以及反例自动机取反对程序自动机进行精化,结果程序自动机为空,程序p0被验证为正确,同时将反例自动机与抽象模型求并,保存该条路径的验证结果。
47.继续对程序p1进行验证。如图6(a)所示为程序p1的程序自动机,通过保存的抽象模型对该程序自动机精化之后,得到图6中(b)所示的精化的程序自动机,继续对该程序自动机进行反例抽象精化,其不可行路径抽象的反例自动机如图6中(c)所示,使用该反例自动机对图6中(b)的程序自动机继续精化,得到程序自动机为空,则可判定程序p1正确,同时保存图6(c)中的反例自动机。
48.继续对程序p2进行验证,如图7(a)所示,为程序p2对应的程序自动机,图7(b)表示已经保存的抽象模型,可以看到程序p2的程序自动机所识别的语言包含在图7(b)的抽象模型之中,因此对p2的程序自动机精化之后,p2的程序自动机为空,则可判定p2正确。
49.本实施例步骤s03中,具体可采用基于一致性的路径可行性检查方式检查抽取出路径的可行性,基于一致性的路径可行性检查方式具体可采用现有技术中方式实现,当然也可以采用其他的方式实现该路径可行性检查。
50.本实施例步骤s04中根据路径类型进行泛化具体包括:判断抽取出路径的路径类型,对不同路径类型使用不同的补全信息方式进行信息补全,并基于一致性的抽象方法进行路径抽象,得到泛化结果。基于一致性的抽象方法进行路径抽象包括:计算当前抽取的不可行路径对应的状态序列,对状态序列进行等价状态合并,得到抽象后的反例自动机作为泛化结果。即对不可行路径进行抽象精化时,采用基于一致性的路径抽象方法,对不可行路径计算其对应的状态序列,然后根据路径的不同类型,如coherent、违反memoizing、违反eraly-assumes等的不同情况,若判断有缺失信息则先进行信息补全,之后对状态序列进行等价状态合并,得到抽象后的反例自动机。
51.本实施例中判断抽取出路径的路径类型时,如果为coherent的路径类型,直接利用基于一致性的抽象方法进行抽象;如果为违反memoizing的路径类型,通过添加辅助变量补全丢失项的信息,然后利用基于一致性的抽象方法进行抽象;如果为违反early-assumes的路径类型,通过将assume语句提前以补全丢失的信息,然后利用基于一致性的抽象方法进行抽象,得到抽象后的反例自动机。通过上述方式,根据路径的不同类型分类进行路径泛化,可以有效提高路径泛化的泛化能力,从而可实现对不满足coherence性质等各类未解释程序的验证。
52.本实施例对于如coherent、违反memoizing、违反early-assumes等不同路径不同的类型,采用不同的信息补全以及路径抽象方式具体包括:对coherent的情况,由于信息没有丢失,直接利用基于一致性的抽象方法进行抽象;对于违反memoizing的情况,通过添加辅助变量的方式补全信息然后利用基于一致性的抽象方法进行抽象,对于违反early-assumes的情况,则通过将assume语句提前的方式补全信息然后利用基于一致性的抽象方法进行抽象。
53.在具体应用实施例中,如果为coherent的路径类型,直接根据对应的状态序列进行等价状态合并,得到抽象后的自动机;如果为违反memoizing的路径类型,通过添加辅助变量补全丢失项的信息后,删掉辅助变量作用域(即辅助变量保存的项第一次被计算和最后一次被计算之间)之外的信息,然后将根据对应的状态序列进行等价状态合并,得到抽象后的反例自动机;如果为违反early-assumes的路径类型,将违反early-assumes的语句提
前至程序最前面的位置,然后根据对应的状态序列进行等价状态合并,得到抽象后的反例自动机。
54.本实施例步骤s04中,使用反例自动机对精化后的程序自动机进行精化包括:将泛化结果对应的抽象后的反例自动机取反然后与精化后的程序自动机进行取交集操作,得到精化结果。同时通过对得到的反例自动机ac与抽象模型as进行求并操作,即as=as∪ac,可以将泛化得到的中间结果进行保留,从而在后续新未解释程序的验证时可以复用该中间结果,有效提高批量未解释程序验证的效率。
55.以对上述程序p1、p0进行验证为例,对于程序p1,进入假分支的路径为coherent的路径(去除了对最后断言没有影响的语句),直接根据其对应的状态序列进行等价状态合并,如图8所示,执行完x:=y之后的状态和执行完x:=y;x:=incr(x);y:=incr(y)之后的状态等价,将这两个状态合并,得到抽象之后的反例自动机。
56.在对程序p0进行验证时,进入循环一次的路径为违反memoizing的路径(去除了对最后断言没有影响的语句),由于该路径违反了memoizing,因此对应的状态序列中出现信息丢失,通过添加辅助变量的方式来进行信息补全,如图9中(a)所示,使用辅助变量g0保存丢失的项的信息,考虑到g0的作用范围有限,当g0保存的项不再被计算时将g0的相关信息删掉。如图9中(a)所示,补全信息之后再将g0不起作用的位置g0相关的信息删除,可以看到状态q1和状态q5等价,则将等价状态合并,可以得到图9(b)抽象而得的反例自动机。
57.如图10最左所示为一条违反early-assumes的路径,该路径由于违反了early-assumes导致对应的三元组信息丢失,通过将assume语句提前来补全信息。图10中间部分对应为补全信息的方式,即将违反early-assumes的语句提前可以提前的最前面的位置,补全信息之后可以看到状态q6和状态q8等价,将状态q6和q8合并之后,得到泛化之后的自动机如图10中最右部分所示。
58.本实施例还提供面向批量未解释程序的联合验证装置,包括处理器以及存储器,存储器用于存储计算机程序,处理器用于执行计算机程序,处理器用于执行计算机程序以执行如上述方法。
59.本实施例还提供存储有计算机程序的计算机可读存储介质,计算机程序执行时实现如上述方法。
60.本领域技术人员可以理解,上述计算机装置的描述仅仅是示例,并不构成对计算机装置的限定,可以包括比上述描述更多或更少的部件,或者组合某些部件,或者不同的部件,例如可以包括输入输出设备、网络接入设备、总线等。所称处理器可以是中央处理单元(central processing unit,cpu),还可以是其他通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现成可编程门阵列(field-programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述计算机装置的控制中心,利用各种接口和线路连接整个计算机装置的各个部分。
61.所述存储器可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述计算机装置的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序
区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(smart media card,smc),安全数字(secure digital,sd)卡,闪存卡(flashcard)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
62.所述计算机装置集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述面向批量未解释程序的联合验证方法的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、电载波信号、电信号以及软件分发介质等。
63.上述只是本发明的较佳实施例,并非对本发明作任何形式上的限制。虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明。因此,凡是未脱离本发明技术方案的内容,依据本发明技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均应落在本发明技术方案保护的范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1