CN107844415B - 一种基于插值的模型检测路径缩减方法、计算机 - Google Patents
一种基于插值的模型检测路径缩减方法、计算机 Download PDFInfo
- Publication number
- CN107844415B CN107844415B CN201710896756.2A CN201710896756A CN107844415B CN 107844415 B CN107844415 B CN 107844415B CN 201710896756 A CN201710896756 A CN 201710896756A CN 107844415 B CN107844415 B CN 107844415B
- Authority
- CN
- China
- Prior art keywords
- interpolation
- path
- state
- cfg
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
Abstract
本发明属于计算机应用技术领域,公开了一种基于插值的模型检测路径缩减方法、计算机,读入C程序,对C程序进行语法语义分析,并从抽象语法树中提取出控制流自动机CFG;给CFG添加safety(S)插值和error(E)插值,扩展CFG;在根据CFG生成ARG的过程中,在每一个状态,判断safety插值和error插值是否被当前路径公式蕴含。本发明通过计算S插值和E插值,提高了检测的效率,使得模型检测算法可以更好地应用于大规模的程序;S插值避免不必要的探索,大大地减少ARG的状态数;E插值可以运用于快速地判断程序中是否存在真反例路径,加快了程序的验证,提高了效率;裁剪CFG中无用结点和边,缩小了遍历状态空间。
Description
技术领域
本发明属于计算机应用技术领域,尤其涉及一种基于插值的模型检测路径缩减方法、计算机。
背景技术
随着科技的快速发展和工业需求的不断提高,各种软硬件设计的的复杂度也日益增加,对于可靠性和安全性的要求也不断提高。系统的可靠性,安全性和正确性已经受到了科学界和工业界的广泛关注。形式化验证和测试是解决该问题的主要方法。形式化验证方法始于20世纪60年代末的Floyd、Hoare和Manna等在程序规范和验证方面的研究。形式化验证方法分为两大类:基于定理证明和基于模型。20世纪80年代初提出的模型检测(ModelChecking)属于基于模型的形式化验证方法,思想相对简单和自动化程度高,可以广泛用于硬件电路系统和网络协议系统的验证。模型检测就是先把系统建模为有限状态转移系统,并用时态逻辑描述特验证的规范,在有限状态转移系统上进行穷尽搜索,确定规范是否被满足,若没有满足,给出反例指出为什么没有满足。模型检测面临状态爆炸问题,所谓状态爆炸问题即系统状态数随着状态规模的增加呈指数级增加。所以该领域的研究人员使用各种方法缩减搜索的状态空间,基于反例引导的抽象模型检测是常用的技术。基于反例路径的抽象细化(Counterexample-Guided Abstraction Refinement,CEGAR)技术的过程如下:给定一个模型和性质,首先通过抽象的方法生成一个抽象模型。抽象模型包含的行为可能会多于原始模型,但是,抽象模型的结构和描述都比原始模型简单,所以可以缓解状态空间爆炸问题。然后调用模型检测器,检测公式是否在抽象模型中有效。如果有效,则程序终止;否则,会给出反例路径,然后进行重构(reconstruction)过程,即在原始模型中,如果成功找到一条路径对应于反例路径,则程序结束;否则,反例路径为虚假反例路径,下一个迭代过程开始,重新生成抽象模型,进行验证。重复此过程,直到返回有效或者无效,或者状态空间爆炸造成程序停止。动态符号执行技术是一种符号执行与具体执行相结合的测试手段。符号执行是指在不执行程序的前提下,用符号值表示程序变量的值,然后模拟程序执行来进行相关分析。首先,对待分析代码构建控制流图(Control Flow Graph,CFG),它是编译器内部用有向图表示一个程序过程的抽象数据结构。在CFG上从入口节点开始模拟执行,在遇到分支节点时,使用约束求解器判定哪条分支可行,并根据预先设计的路径调度策略实现对该过程所有路径的遍历分析,最后输出每条可执行路径的分析结果。动态符号执行是以具体数值作为输入,同时启动代码模拟执行器,并从当前路径的分支语句的谓词中搜集所有符号约束。然后根据策略反转约束中的一个分支,构造一条新的可行的路径约束,并用约束求解器求解出一个可行的新的具体输入,接着符号执行引擎对新输入值进行新一轮的分析。通过使用这种输入迭代产生新输入的方法,理论上所有可行的路径都可以被计算并分析一遍。动态符号执行技术的主要瓶颈是路径爆炸问题,即随着程序中分支数的增多,路径呈指数级增加。插值是缓解路径爆炸问题的有效方法,主要是一种搜索剪枝的思想,通过利用不可行路径给行节点标记插值,插值是指一定不会到达被标记为错误行的条件约束。对于分支节点,若该节点的每个分支都被探索过,那么在该节点标记的插值为全插值,否则为半插值。在动态符号执行中,若从开始节点到当前节点的路径约束满足当前节点的全插值,则该路径可被归并,即不被探索,从而有效缓解了路径爆炸问题。对于大规模系统,抽象模型在进行验证时细化次数过多。细化的次数越多,占用的时间就越多。每次细化后,都要重新构建抽象模型,重复遍历的许多路径,降低了验证效率。而且验证模型时,产生的状态数随系统的规模和复杂性增大而增大,会引起状态空间爆炸问题,从而消耗大量的内存和时间,导致验证崩溃,因此,在验证的过程中,找到一种方法,可以减少遍历的路径和细化的次数,快速地对程序进行验证,从而降低状态数,使之可以对大规模的程序进行验证,已经成为一个亟待解决的问题。
综上所述,现有技术存在的问题是:对于大规模系统,抽象模型在进行验证时细化次数过多,且模型检测的瓶颈是状态爆炸,消耗大量的内存和时间,导致验证崩溃。
发明内容
针对现有技术存在的问题,本发明提供了一种基于插值的模型检测路径缩减方法、计算机。
本发明是这样实现的,一种基于插值的模型检测路径缩减方法,所述基于插值的模型检测路径缩减方法读入C程序,对C程序进行语法语义分析,并从抽象语法树中提取出控制流自动机CFG;给CFG添加safety插值和error插值,扩展CFG;在根据CFG生成ARG的过程中,在每一个状态,判断safety插值和error插值是否被当前路径公式蕴含。
进一步,如果某一个状态的error插值被蕴含,则说明程序存在一条真反例路径,程序不安全,验证结束;如果safety插值被蕴含,则说明该状态的后续所有路径都是安全的,不需要遍历,减少了遍历的路径;如果发现一个虚假反例路径,则根据Craig插值,计算和更新safety插值和error插值。
进一步,所述基于插值的模型检测路径缩减方法包括以下步骤:
步骤一,根据待验证的程序,生成控制流图CFG,给CFG中的结点添加3个属性:R插值,S插值和E插值,R插值是结点可达的约束条件,判断一个状态的可达性;S插值和E插值对路径进行规约,加快程序的验证;给CFG的边添加属性W;一条边的W值表示以该边指向的结点为根结点的子图中,还没有被遍历的分支的个数;
步骤二,根据生成的CFG,生成抽象可达图ARG,如果沿着一条路径生成一个新状态s,如果s对应的R插值被满足,说明状态s可达,继续沿着状态s遍历该路径;否则,状态s不可达,则该路径终止,遍历其他路径;对于一个可达的状态s,如果状态s对应的E插值被该路径对应的路径公式蕴含,说明沿着该状态存在一条到达目标状态的路径,程序不安全;如果状态s对应的S插值被蕴含,说明以状态为起点的所有路径都是安全的,不需要沿着状态s探索程序;如果状态s是可达的,且E插值和S插值都不被蕴含,则继续沿着状态s遍历该路径;
步骤三,在生成ARG的过程中,发现一条反例路径,到达目标状态,则需要进一步判断反例路径是否虚假;不是虚假反例,则说明程序是不安全的;否则,根据虚假反例,细化模型,分别计算并更新对应状态的R插值,S插值和E插值,执行重新生成ARG,直到找到一条真反例路径或不存在反例路径。
进一步,所述步骤一生成待验证程序的CFG,并且初始化结点和边的属性,包括以下步骤:
(1)找到CFG中的目标结点,从目标结点开始反向遍历CFG,遍历的结点和边都保留,没有遍历到的结点和边都删除;
(2)得到裁剪后的CFG,初始化属性的值,对各个结点的三种插值进行初始化,初次遍历CFG,生成ARG的过程中,每一个结点的R插值的初始值都为{true};对于S插值,定义了为一个二元组:(F,Is),其中,F的值域为{full,half},Is的值是一个由谓词组成的合取式;对于一个结点l,如果l没有后继结点或者l的所有后继结点的S插值都是full,记为f,表示l的所有后继结点都被遍历过,则l的S插值也是full,否则,l的S插值为half,记为h,具体的形式如下:
l是终结点,S插值的初始值为(full,true),表示如果到达终结点,路径一定是安全的;l是目标结点,S插值的初始值为(full,false),表示如果到达目标结点,路径一定是反例路径;对于其他结点,S插值的初始值为(half,true),具体的形式如下:
l是目标结点,E插值的初始值为true,表示路径一定是真反例;l是终结点,E插值的初始值为false,表示路径一定不可能到达目标结点;对于其他结点,E插值的初始值为false,初始认为都不能到达目标结点;对于每一条迁移的W属性,初始值为⊥,表示还没开始遍历,其中,W的值域为{N+,⊥},N+是正整数集合。
进一步,所述步骤二中,利用W属性决定分支边的遍历顺序,同时,利用S插值和E插值,加快验证的效率,具体的步骤包括:
(1)得到一个可达状态s',根据CFG的迁移关系,产生后继状态;如果存在多个可能的后继,根据边的W值,决定遍历顺序;边的W值的优先级为:(>0)>⊥>0;如果边的W值相同,则随机选择;对于一个后继状态s,根据R插值,如果状态s不可达,则当前路径终止,遍历其他路径;如果当前状态s可达,首先判断s的E插值是否为false;如果是false,说明s[0]的后继结点还没被遍历过,跳转到(2);如果不是false,首先采用SSA原则,每一个变量至多被赋值一次,得到从初始状态s0到达s的路径公式,记为Pf(s0,…,s);用求解器判断Pf(s0,…,s)是否蕴含s的E插值;如果蕴含,则说明程序存在一条真反例,程序不安全,验证结束;否则跳转到(2);
(2)判断s的S插值是否为full插值;如果不是full插值,则跳转到(3);如果是full插值,得到从初始状态s0到达s的路径公式,记为Pf(s0,…,s),然后用求解器判断Pf(s0,…,s)是否蕴含s的S插值;如果蕴含,则说明以状态s为起点的所有路径都是安全的,不需要探索,当前路径终止,遍历其他路径;
(3)判断s是否目标状态,如果是目标状态,则发现一条反例路径,执行步骤三;如果不是,进一步判断s是否被其他状态覆盖;如果s被覆盖,则不需要探索当前路径,遍历其他路径;如果s不被覆盖,则继续探索当前路径;
(4)如果存在没有被遍历的可达状态,则跳转到(1);否则,验证结束,程序安全。
进一步,所述步骤三中优化策略包括:
在步骤一中,生成程序对应的CFG,根据目标结点,遍历整个CFG减掉不可能到达目标状态的结点和边;
在步骤三中,如果存在一条虚假反例路径,在计算三种插值的同时,计算反例路径中每一条边的W值;在步骤二中,一个状态如果存在多个后继状态,根据边的W值,决定后继状态的遍历顺序。
进一步,所述步骤三中计算插值和W属性的具体步骤包括:
1)在生成ARG的过程中,发现一条反例路径path:〈s0,e0,s1,…,en-1,sn〉。利用SMT求解器判断path是不是虚假;如果path是真反例,则程序不安全,验证结束;如果path是虚假的,则执行2);
2)计算R插值,对于状态si,0<i<n,将path划分为两部分:pre和post。pre子序列为<s0,…,si>,post子序列为<si,…,sn>,利用Craig插值公式计算新的R插值,Craig(pre,post),更新si[0]的R插值,形式化地表示为:
R-Intp(si[0])=R-Intp(si[0])∪Craig(Pf(s0,..,si),Pf(si,…,sn));
其中,Pf(s0,…,si)表示从s0到si的路径对应的路径公式;
3)计算S插值,首先找到path的可达的有效序列Π=<s0,...,sm>,0<m<n,且si状态可达,si+1状态不可达;对于Π的每一个状态si,0<i≤m,判断S插值的的第一个元素是full还是half;si[0]的所有后继结点的S插值都是full,则si[0]的S插值为full,否则,si[0]的S插值为half;具体的形式如下:
对于S插值的第二个元素,记为Is(si[0]),分两种情况,如果i=m,则Is(si[0])是边ei+1的路径公式取反。如果0<i<m,Is(si[0])利用Craig插值计算,记为Craig(A,B);其中,A表示从s0到si的路径公式,B是边ei对应的公式和状态si+1对应的S插值取反的合取式;具体的形式如下:
其中,A=Pf(s0,…,si),B=Pf(si,ei,si+1)∧!(Is(si+1[0]);从sm状态开始倒序地计算每个状态的插值,直到初始状态或者某一状态的S插值为half;
4)计算E插值,找到path的最大有效后缀序列Π=<si,…,sn>,0<i≤n;从si状态开始,利用Craig插值,倒序地计算对应的E插值,记为Craig(A,B);对于si,A是从si到sn的路径公式和sn的E插值的合取式,B是从s0到si的路径公式;对于状态sj,0<j<i,A是从sj到sj+1的路径公式和sj+1的E插值的合取式,B是从s0到sj的路径公式,具体的形式如下:
5)计算边的W值,根据反例路径和更新后的S插值,来计算对应边的W值,对于一条边e:(s,op,s'),如果s'的S插值是full,则e的W值为0;如果s'的S插值是half,且s'是最后一个可达状态,e的W值为s'[0]的出边的个数-1;如果s'的S插值是half,且s'不是最后一个可达状态,e的W值为两部分的和:1)s'[0]的出边中W值不为⊥的边的W值的和,2)s'[0]的出边中W值为⊥的边的个数。对于边e:(s,op,s'),s':(l',c',p')具体的形式如下:
6)跳转到步骤二,重新生成ARG。
进一步,所述4)中计算最大有效后缀序列的具体步骤包括:
(1)对于反例路径path:〈s0,e0,s1,…,en-1,sn〉,边分为两类:分支边集合Eb和非分支边Ea;
(2)生成path对应的路径公式,其中,对于e∈Eb,对应的公式用true代替;对于e∈Ea,生成其对应的公式,生成新的路径公式Pf;
(3)从边en-1开始反向搜索,如果0<i1<n,用对应的公式代替Pf中相应位置的true,得到新的路径公式Pf,用SMT求解器判断Pf是否可满足;如果可满足,则继续搜索下一条边0<i2<i1,将对应的公式代替Pf中相应位置的true,得到路径公式Pf,用SMT求解器判断Pf是否可满足,如此循环,直到用边的公式替换true后,用SMT求解器判断出Pf不可满足,则最大有效后缀序列为
本发明的另一目的在于提供一种利用所述基于插值的模型检测路径缩减方法的计算机。
本发明的优点及积极效果为:本发明更加充分地利用了模型检测中虚假反例路径提供的信息,通过计算S插值和E插值,提高了检测的效率,使得模型检测算法可以更好地应用于大规模的程序;S插值可以判断出一个状态后续所有可能的路径序列是否都是安全的,从而避免探索状态后续的所有路径,大大地减少ARG的状态数;E插值可以运用于快速地判断程序中是否存在真反例路径,加快了程序的验证,提高了效率。
本发明对提出的方法进行了大量实验,并与现有的工具进行了对比。表1显示了现有工具的实验结果。其中,“#Suc”列表示的是对应工具成功验证的程序数。“Package-names”是测试的程序包的名字,“#Programs”给出了每个包所包含的程序数。可以看到,在四种工具中,CPAChecker(ABE),即仅使用R插值,验证的成功率最高,为66.9%。表2给出了本发明提出方法的实验结果。本发明比较了五种模式:R+E,R+S,R+S+E,R+S+W和R+S+E+W。可以看到,R+E和R+S模式下的成功率分别为67.6%和68.8%,比R模式高出0.7%和1.9%。R+S+E模式的成功率为69.3%,比R+E和R+S模式分别高出1.7%和0.5%。
表1现有工具测试数据
表2实验数据
本发明裁剪了CFG中无用的结点和边,进一步缩小了遍历的状态空间,在CFG的边上添加W属性,使得程序验证的效率得到进一步的提升。表2中,R+S+W模式的成功率比R+S的成功率高出0.6%。R+S+E+W模式的成功率比R+S+E高出0.7%。
表3对消耗的时间进行了对比。可以看出,R+S+E+W所消耗的时间最少,比R模式少了10.8%(1-TRSEW/TR)。R+S+E消耗的时间比R+E和R+S都少。R+S+W模式比R+S消耗的时间少。
本发明通过计算S插值和E插值,缩减抽象模型验证时的路径搜索空间从而缓解状态爆炸问题,加快验证效率。同时提供了两种优化操作,使得验证过程更加高效,可以更好地应用于大规模的程序;主要应用于工业,军事,农业,科研等领域设计的软硬件系统正确性的形式化验证,以及各类通信协议安全性,可靠性的形式化验证。
表3时间对比
附图说明
图1是本发明实施例提供的基于插值的模型检测路径缩减方法流程图。
图2是本发明实施例提供的实施例1的待验证程序Exa.c及CFG示意图。
图3是本发明实施例提供的实施例1仅使用R插值所要遍历的路径示意图。
图4是本发明实施例提供的实施例1使用R插值和S插值所要遍历的路径示意图。
图5是本发明实施例提供的实施例1使用R插值和E插值所要遍历的路径示意图。
图6是本发明实施例提供的实施例1使用R插值,S插值及E插值所要遍历的路径示意图。
图7是本发明实施例提供的使用三种插值检测程序的总体过程示意图。
图8是本发明实施例提供的实施例1裁剪CFG后所需遍历的路径示意图。
图9是本发明实施例提供的实施例2的待验证程序weight.c及CFG示意图。
图10是本发明实施例提供的实施例2使用W属性后遍历CFG的过程示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明使用safety插值和error插值有效缩减了抽象模型验证的路径空间,加快了抽象模型的验证,使系统复杂性质的验证更方便有效,使得模型检测算法更好地应用在大规模的程序。本发明适用于工业、农业、军事、科研等领域软件系统设计缺陷的检测和安全性的验证。
下面结合附图对本发明的应用原理作详细的描述。
如图1所示,本发明实施例提供的基于插值的模型检测路径缩减方法包括以下步骤:
S101:读入C程序,对C程序进行语法语义分析,并从抽象语法树中提取出控制流自动机CFG;
S102:给CFG添加safety插值和error插值,扩展CFG;
S103:在根据CFG生成ARG的过程中,在每一个状态,判断safety插值和error插值是否被当前路径公式蕴含。
在本发明的优选实施例中,在步骤S103中:如果某一个状态的error插值被蕴含,则说明程序存在一条真反例路径,程序不安全,验证结束。如果safety插值被蕴含,则说明该状态的后续所有路径都是安全的,不需要遍历,减少了遍历的路径。如果发现一个虚假反例路径,则根据Craig插值,计算和更新safety插值和error插值,保障验证的精确性。
下面结合附图对本发明的应用原理作进一步的描述。
本发明基于CEGAR的模型检测方法,利用插值的思想,通过归类探索的路径,缩减生成的状态空间,加快验证效率,使其可以更好地验证大规模的程序。
CFG是对C程序进行语法语义分析后,从抽象语法树中提取出来的程序控制结构图。一个CFG定义为一个四元组(L,T,l0,f)。其中,L是结点集合,l∈N对应于程序的一个位置。T是迁移集合,t∈T对应程序的一个操作。l0∈N是初始结点,f∈N是终结点。一条迁移t记为(l,op,l'),表示l结点经过op操作到达l'结点。其中,op∈Ops对应一个具体的操作,包括赋值操作,条件语句,函数调用和return语句等。
本发明在CFG的结点和边上添加了相应的属性。在一个结点l,添加三个属性:R插值,S插值和E插值,分别记为l(R),l(S),l(E)。在一条迁移t上添加属性W,记为t(W),表示迁移t的权重值。
ARG(AbstractReachability Graph)是抽象可达图。ARG是通过展开CFG而生成的。给定一个CFG G=(L,T,l0,f),可以得到一个ARGA,定义为(SA,EA),SA是状态集合,EA)是边的集合。在ARG中,一个状态s∈SA有三部分组成:一个CFG中的结点l,当前的调用栈c(CFG结点组成的序列,代表返回地址)和布尔公式p(又称可达域,reachable region,一个数据域集合),记为s:(l,c,p)。一条边e∈EA对应一条CFG上的边,可能是一个判定谓词,一个函数调用或者返回语句等。为了方便,给出定义:对于一个n元组r:(r0,r1,…,rn),r[i]表示r的第i个元素,即ri。例如,对于一个状态s:(l,c,p),s[0]表示l,s[1]表示c,s[2]表示p。对于状态s和s',如果s[0]=s'[0],s[1]=s'[1],且s[2]蕴含s'[2],则说明s'被s覆盖,不需要探索s'后面的路径。ARG上的一个路径π是一个有限的、状态和边交替出现的序列,表示的是程序的一次执行,记为〈s0,e0,s1,…,en-1,sn〉。路径π的长度定义为边的个数。
本发明实施例的三种插值,都是利用Craig插值计算的,模型检测的具体的步骤包括:
步骤1:首先根据待验证的程序,生成对应的CFG。然后,利用策略1对CFG进行裁剪,删除不可能到达目标结点的结点和边,得到新的CFG,初始化每一个结点和每一条边的属性。具体的步骤如下:
步骤1.1:首先找到CFG中的目标结点,然后,从目标结点开始反向遍历CFG,所有可以遍历的结点和边都保留,没有遍历到的结点和边都删除。
步骤1.2:得到裁剪后的CFG,初始化属性的值。首先,对各个结点的三种插值进行初始化。初次遍历CFG,生成ARG的过程中,所有的结点都被认为是可达的,因此,每一个结点的R插值的初始值都为{true}。对于S插值,定义了为一个二元组:(F,Is),其中,F的值域为{full,half},Is的值是一个由谓词组成的合取式。对于一个结点l,如果l没有后继结点或者l的所有后继结点的S插值都是full,记为f,即表示l的所有后继结点都被遍历过,则l的S插值也是full,否则,l的S插值为half,记为h,具体的形式如下:
因此,如果l是终结点,S插值的初始值为(full,true),表示如果到达终结点,该路径一定是安全的。如果l是目标结点,S插值的初始值为(full,false),表示如果到达目标结点,该路径一定是反例路径。对于其他结点,S插值的初始值为(half,true),因为CFG还没有开始被遍历,具体的形式如下:
由于E插值是判断是否存在一条真反例,不需要保证一个结点l的所有后继都被遍历,因此,E插值不需要二元组。如果l是目标结点,E插值的初始值为true,表示路径一定是真反例;如果l是终结点,E插值的初始值为false,表示路径一定不可能到达目标结点;对于其他结点,E插值的初始值为false,初始认为都不能到达目标结点。对于每一条迁移的W属性,初始值为⊥,表示还没开始遍历,其中,W的值域为{N+,⊥},N+是正整数集合。
步骤2:展开CFG,生成ARG,利用R插值,来判断一个状态是否可达,采用深度优先策略,遍历每一条路径。根据边的W值,来选择遍历顺序。同时,在验证过程中,使用S插值和E插值,加快验证效率。如果没有反例路径,则程序安全,验证结束。如果根据E插值,判断存在一条真反例,则程序不安全,验证结束。否则,找到一条反例路径,需要进一步判断其是否为虚假反例,跳转到步骤3。具体的步骤如下:
步骤2.1:得到一个可达状态s',根据CFG的迁移关系,产生后继状态。如果存在多个可能的后继,根据边的W值,决定遍历顺序。边的W值的优先级为:(>0)>⊥>0。这样是为了更快地形成full插值,更好地使用S插值。如果边的W值相同,则随机选择。然后对于一个后继状态s,根据R插值,如果状态s不可达,则当前路径终止,遍历其他路径。如果当前状态s可达,首先判断s的E插值是否为false。如果是false,说明s[0]的后继结点还没被遍历过,跳转到步骤2.2。如果不是false,首先采用static single assignment(SSA)原则,即每一个变量至多被赋值一次,得到从初始状态s0到达s的路径公式,记为Pf(s0,…,s),然后用求解器判断Pf(s0,…,s)是否蕴含s的E插值。如果蕴含,则说明程序存在一条真反例,即程序不安全,验证结束。否则跳转到步骤2.2。
步骤2.2:首先判断s的S插值是否为full插值。如果不是full插值,则跳转到步骤2.3。如果是full插值,得到从初始状态s0到达s的路径公式,记为Pf(s0,…,s),然后用求解器判断Pf(s0,…,s)是否蕴含s的S插值。如果蕴含,则说明以状态s为起点的所有路径都是安全的,不需要探索,当前路径终止,遍历其他路径。
步骤2.3:判断s是否目标状态,如果是目标状态,则发现一条反例路径,执行步骤3。如果不是,进一步判断s是否被其他状态覆盖。如果s被覆盖,则不需要探索当前路径,遍历其他路径。如果s不被覆盖,则继续探索当前路径。
步骤2.4:如果存在没有被遍历的可达状态,则跳转到步骤2.1;否则,验证结束,程序安全。
步骤3:如果步骤2返回一条反例路径,则需要判断其是否虚假。如果不是虚假反例,则程序不安全,验证结束。否则,需要进一步细化,并且更新结点和边的各个属性的值,重新生成ARG。具体的步骤如下:
步骤3.1:在生成ARG的过程中,发现一条反例路径path:〈s0,e0,s1,…,en-1,sn〉。利用SMT求解器判断path是不是虚假。如果path是真反例,则程序不安全,验证结束。如果path是虚假的,则执行步骤3.2;
步骤3.2:计算R插值,对于状态si,0<i<n,将path划分为两部分:pre和post。pre子序列为<s0,…,si>,post子序列为<si,…,sn>,利用Craig插值公式计算新的R插值,即Craig(pre,post),更新si[0]的R插值,可以形式化地表示为:
R-Intp(si[0])=R-Intp(si[0])∪Craig(Pf(s0,..,si),Pf(si,…,sn));
其中,Pf(s0,…,si)表示从s0到si的路径对应的路径公式。
步骤3.3:计算S插值,首先找到path的可达的有效序列Π=<s0,...,sm>,0<m<n,且si状态可达,si+1状态不可达。对于Π的每一个状态si,0<i≤m,首先判断S插值的的第一个元素是full还是half。如果si[0]的所有后继结点的S插值都是full,则si[0]的S插值为full,否则,si[0]的S插值为half。具体的形式如下:
对于S插值的第二个元素,记为Is(si[0]),分两种情况,如果i=m,则Is(si[0])是边ei+1的路径公式取反。如果0<i<m,Is(si[0])利用Craig插值计算,记为Craig(A,B)。其中,A表示从s0到si的路径公式,B是边ei对应的公式和状态si+1对应的S插值取反的合取式。具体的形式如下:
其中,A=Pf(s0,…,si),B=Pf(si,ei,si+1)∧!(Is(si+1[0])。由于S插值是对一个状态后续所有可能的路径进行判断,所以将新的S插值与原来的插值进行合取。从sm状态开始倒序地计算每个状态的插值,直到初始状态或者某一状态的S插值为half。
步骤3.4:计算E插值,首先找到path的最大有效后缀序列Π=<si,…,sn>,0<i≤n。然后从si状态开始,利用Craig插值,倒序地计算对应的E插值,记为Craig(A,B)。对于si,A是从si到sn的路径公式和sn的E插值的合取式,B是从s0到si的路径公式。对于状态sj,0<j<i,A是从sj到sj+1的路径公式和sj+1的E插值的合取式,B是从s0到sj的路径公式。具体的形式如下:
由于E插值是判断一个状态后续所有可能的路径是否存在一条真反例路径,所以将新的E插值与原来的插值进行析取。
步骤3.5:计算边的W值,根据反例路径和更新后的S插值,来计算对应边的W值。对于一条边e:(s,op,s'),如果s'的S插值是full,则e的W值为0;如果s'的S插值是half,且s'是最后一个可达状态,e的W值为s'[0]的出边的个数-1。如果s'的S插值是half,且s'不是最后一个可达状态,e的W值为两部分的和:1)s'[0]的出边中W值不为⊥的边的W值的和,2)s'[0]的出边中W值为⊥的边的个数。对于边e:(s,op,s'),s':(l',c',p')具体的形式如下:
步骤3.6:跳转到步骤2,重新生成ARG。
本发明在计算E插值时,首先要找到最大有效后缀序列,具体的步骤如下:
步骤3.4.1:对于反例路径path:〈s0,e0,s1,…,en-1,sn〉,将其里面的边分为两类:分支边集合Eb和非分支边Ea。
步骤3.4.2:首先生成path对应的路径公式,其中,对于e∈Eb,其对应的公式用true代替。对于e∈Ea,生成其对应的公式,生成新的路径公式Pf。
步骤3.4.3:从边en-1开始反向搜索,如果0<i1<n,用对应的公式代替Pf中相应位置的true,得到新的路径公式Pf,用SMT求解器判断Pf是否可满足。如果可满足,则继续搜索下一条边0<i2<i1,将对应的公式代替Pf中相应位置的true,得到路径公式Pf,用SMT求解器判断Pf是否可满足,如此循环,直到用边的公式替换true后,用SMT求解器判断出Pf不可满足,则最大有效后缀序列为
下面结合具体实施例对本发明的应用原理作进一步的描述。
本发明的实施例基于CEGAR的抽象模型检测方法实现的,接下来,通过实施例来具体地阐述本发明的步骤,通过对比使用S插值和E插值前后生成的ARG,说明使用本发明的优势。
实施例1
图2是实施例1待检测程序及其CFG,其中,目标结点为L11,终结点是L9。通过验证目标结点L11的可达性验证程序是否安全。如果L11是可达的,则说明程序不安全。否则,程序是安全的。具体的验证步骤如下:
本发明的实现是基于CEGAR的抽象模型检测,它通过抽象谓词,即R插值,来判断一个状态的可达性,从而不断地进行反例-细化-抽象的过程,精确地验证程序。为了说明本发明提出的插值与R插值的区别及优势,首先介绍只使用R插值的检测过程。图3是在没有使用S插值和E插值的情况下,仅利用R插值验证程序所遍历过的路径。其中,被“'”标记的状态表示状态被覆盖,其后续路径不需要遍历,边用虚线表示,L11是目标状态。具体的步骤如下:
步骤1:首先得到程序的CFG,。所有结点的R插值的初始值都为{true}。再根据CFG的初始结点,得到初始状态,根据深度优先策略展开CFG,生成ARG。由于每个结点的R插值都是{true},所以每个分支都被认为是可达的。当程序沿着图2中最左边的路径P1探索时,发现P1不是反例路径,继续探索别的分支。当到达目标结点L11时,发现反例路径P2,结点序列为:<L1,L2,L3,L4,L6,L7,L10,L11>。
步骤2:生成反例路径对应的路径公式:
s1=1∧!(a1==1)∧!(i1>1)∧s2=s1+2∧true∧s2>3∧true;
用SMT求解器判断该路径公式不可满足,公式s1=1∧s2=s2+2和s2>3和相互矛盾,因此P2为虚假反例路径。然后利用Craig(pre,post)计算R插值。对于L10,pre为s1=1∧!(a1==1)∧!(i1>1)∧s2=s2+2∧true∧s2>3,post为true,利用Craig插值的定义得到的结果为false。对于L7,pre为s1=1∧!(a1==1)∧!(i1>1)∧s2=s2+2∧true,post为s2>3∧true,利用Craig插值的定义得到的结果为s2<=3,去掉SSA标记,得到s<=3。依次计算P2中每个状态的R插值,直到根状态。
步骤3:根据新的R插值,重新展开CFG,生成ARG。图3中,每个状态的p表示利用R插值计算的可达域。可达域是false表示该状态不可达,停止遍历当前路径。因此,当再一次到达P2路径中的L10时,L10不可达,所以不会到达目标状态,继续遍历别的路径。当沿着路径P3遍历时,到达L8,利用覆盖规则,判断L8被P1中的L8覆盖,因此,停止遍历P3。探索路径P4,第二次发现反例路径,则执行步骤2。如此重复执行步骤3和步骤2。当探索到路径P8时,发现反例路径,利用SMT求解器判断,P8为真反例,所以,程序不安全,验证结束。
本发明提出的算法,在上述模型检测的过程中,利用S插值和R插值,归类探索的路径,缩减生成的状态空间,加快验证效率。S插值可以判断一个状态的后续所有可能的路径是否都是安全的,从而,避免不必要的探索,减少了状态空间。图4描述了在R插值的基础上,使用S插值后遍历过的所有路径。加入S插值后,具体的检测步骤如下:
步骤1:首先对CFG中结点和边各自的属性进行初始化。所有结点的R插值的初始值都为{true}。终结点的S插值初始值为(f,true)。目标结点的S插值初始值(f,false)。其余的结点S插值的初始值为(h,true)。由于S插值初始都是half,所以,第一次探索过程与上述过程相同。当程序沿着图4中最左边的路径P1探索时,发现P1不是反例路径,继续探索别的分支。当到达目标结点L11时,发现反例路径P2,状态序列为:<L1,L2,L3,L4,L6,L7,L10,L11>。
步骤2:生成反例路径对应的路径公式:
s1=1∧!(a1==1)∧!(i1>1)∧s2=s1+2∧true∧s2>3∧true;
用SMT求解器判断该路径公式不可满足,公式s1=1∧s2=s2+2和s2>3和相互矛盾,因此P2为虚假反例路径。R插值的计算过程同上述过程。然后,计算对应的S插值。具体的步骤如下:
步骤2.1:首先得到路径P2的可达的有效序列π,其状态序列为<L1,L2,L3,L4,L6,L7>。根据S插值的计算规则,L7的S插值的Is值为true∧!(s>3),即s<=3。由于L7的两个后继都被遍历过,因此L7的S插值的F值为full。因此L7的插值为(f,s<=3)。对于L6,由于它只有一个后继且被遍历,所以L6的S插值的F值为full。根据计算规则,新的Is值为:
Craig(s1=1∧!(a1==1)∧!(i1>1)∧s2=s1+2,true∧!(s2<=3))=s2<=3;
因此,更新后,L6的插值为(f,s<=3)。如此依次计算L4,L3的S插值。由于L3还有一个后继没有遍历,所以L3的S插值为(h,s<=1)。
步骤3:根据新的R和S插值,重新展开CFG,生成ARG。当沿着路径P3遍历时,到达L6,由于L6的插值是full,且Pf(L1,…,L6)蕴含Is(L6),即
F(L6)=full and(s1=1∧!(a1==1)∧(i1>1)∧s2=s2+1)→s<=3;
因此,确定沿着P3的L6的后续路径都是安全的,不需要遍历。这样,L3的所有后继被遍历,L3的插值为(f,s<=3),L2的S插值为(h,s<=3)。继续遍历别的路径,直到找到真反例路径P8。
图4中,使用S插值后,被“””标记的状态后续的路径都不需要遍历,表示为虚线,比图3整体少遍历了4条路径,减少了状态的生成。
本发明提出了E插值,可以加快反例路径的判断,加快验证过程。图5描述了在R插值的基础上,使用E插值后遍历过的所有路径。具体的步骤如下:
步骤1:首先对CFG中结点和边各自的属性进行初始化。所有结点的R插值的初始值都为{true}。目标结点的E插值为true,其他结点的E插值为false。第一次探索过程与上述过程相同。当程序沿着图5中最左边的路径P1探索时,发现P1不是反例路径,继续探索别的分支。当到达目标结点L11时,发现反例路径P2,状态序列为:<L1,L2,L3,L4,L6,L7,L10,L11>。
步骤2:P2的判断跟图4的过程一样,用SMT求解器判断P2是虚假的,然后计算R插值。同时,计算E插值。根据计算规则,首先找到P2的最大有效后缀序列:<L10,L11>。对L10,新的Ie(L10)=
Craig(true∧true,s1=1∧!(a1==1)∧!(i1>1)∧s2=s1+2∧true∧s2>3)=true;
因此,更新后,L10的E插值为true。依次计算L7,L6,L4,L3和L2的插值,结果如图5所示。
步骤3:根据新的R和E插值,重新展开CFG,生成ARG。在对应的状态,判断其E插值是否被蕴含。如图4所示,在沿着路径P7到达L15时,L15的E插值为s>3,可判断出Pf(L1,L2,L11,L13,L15)蕴含s>3,即:
(s1=1∧a1==1∧!(i1>1)∧s2=s2+3)→s>3;
因此,L15后存在一条真反例路径到达目标状态,程序不安全,停止遍历。
图5中,在使用了E插值后,被“”'”标记的状态的后续路径不需要遍历,也比仅使用R插值少遍历了一些路径。图6显示了使用三种插值后需要遍历的路径。
本发明在R插值的基础上,使用S插值和E插值,通过减少遍历的路径,缓解了状态空间爆炸问题,加快了验证过程,在时间和空间上都有所提高。整个检测过程如图7所示,具体的步骤如下:
对于一个ARGA:(SA,EA),如果不存在未被遍历的新状态,则说明程序安全。否则,选择一个新的状态s探索,如果s是目标状态,则当前路径是反例路径,用求解器判断其是否虚假。如果不是虚假的,则程序不安全。否则,计算三种R插值。然后,继续生成ARG。如果s不是目标状态,且可达,则利用s的E插值判断是否存在真反例。如果s的E插值被蕴含,则说明程序不安全。否则,接着使用s的S插值判断是否需要继续沿着s遍历。如果s的S插值被蕴含,说明不需要,继续遍历其他路径。否则,进一步判断s是否被蕴含,如果s被蕴含,则也不需要继续沿着s遍历。否则,继续沿着s状态遍历。循环上述过程,直到验证程序安全或不安全。
本发明为了进一步提高验证的效率,利用优化策略,裁剪CFG,减少状态搜索空间。首先根据待验证的程序,生成对应的CFG。然后,对CFG进行裁剪,删除不可能到达目标结点的结点和边,得到新的CFG,初始化每一个结点和每一条边的属性。后续的检测过程如上述过程,图8刻画了使用了策略1后遍历过的路径,可以看出,路径P1不需要遍历。
本发明提出的S插值,只要当S插值为full时,才可以使用,为了加快full插值的形成,本发明通过给边添加属性W,来决定遍历的分支顺序,更好地使用S插值,下面通过实施例2说明边属性W的作用。
实施例2:
图9是实施例2待检测程序及其CFG,其中,目标结点为L13,终结点是L4。通过验证目标结点L13的可达性验证程序是否安全。如果L13是可达的,则说明程序不安全。否则,程序是安全的。图10显示了使用W值遍历的路径。具体的步骤如下:
步骤1:裁剪CFG,去掉无用边和结点,用虚线表示。初始化结点的属性,过程同实施例1。同时所有边的W值为⊥。
步骤2:同实施例1,利用三种插值,展开CFG,生成ARG。直到第一次发现反例路径P1,如图10(1),计算三种插值。同时计算边的W值。由于P1中L10不可达,L8可达,所以从边e:(L7,a=2,L8)开始计算。由于e指向的结点L8的出边都没遍历过,所以e的W值为0,同理,计算其他边的W值,结果如图10(1)所示。
步骤3:第二次生成ARG时,由于W的优先级为(>0)>⊥>0,因此,会先遍历路径P2,如图10(2)所示。P2是反例路径,继续按照插值和W的计算规则,更新相应的值,如图10(2)所示。第三次生成ARG,先沿着图10(3)的路径P3遍历,且判断P3是真反例路径,程序不安全,验证结束。使用W值后,只遍历了三条路径。如果没有使用W值,则需要遍历四条路径。
综上所述,本发明属于计算机应用技术领域,主要涉及模型检测领域和程序分析领域,尤其涉及基于CEGAR的抽象模型检测方法和SMT理论的应用。本发明主要针对现有模型检测方法检测效率低,验证规模小及状态空间爆炸问题,提出了两种新的插值,利用Craig插值方法,计算两种插值,并应用在模型检测过程中,对路径进行了归类,缓解了状态空间爆炸问题,提高了验证的效率。本发明可应用于工业,军事,科研等领域的软件系统的安全检测,提高软件系统的可靠性和安全性。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (6)
1.一种基于插值的模型检测路径缩减方法,其特征在于,所述基于插值的模型检测路径缩减方法读入C程序,对C程序进行语法语义分析,并从抽象语法树中提取出控制流图CFG;给CFG添加safety插值和error插值,扩展CFG;在根据CFG生成抽象可达图ARG的过程中,在每一个状态,判断safety插值和error插值是否被当前路径公式蕴含;
如果某一个状态的error插值被蕴含,则说明程序存在一条真反例路径,程序不安全,验证结束;如果safety插值被蕴含,则说明该状态的后续所有路径都是安全的,不需要遍历,减少了遍历的路径;如果发现一个虚假反例路径,则根据Craig插值,计算和更新safety插值和error插值;
所述基于插值的模型检测路径缩减方法包括以下步骤:
步骤一,根据待验证的程序,生成控制流图CFG,给CFG中的结点添加3个属性:R插值,S插值和E插值,R插值是结点可达的约束条件,判断一个状态的可达性;S插值和E插值对路径进行规约,加快程序的验证;给CFG的边添加属性W;一条边的W值表示以该边指向的结点为根结点的子图中,还没有被遍历的分支的个数;
步骤二,根据生成的CFG,生成抽象可达图ARG,如果沿着一条路径生成一个新状态s,如果s对应的R插值被满足,说明状态s可达,继续沿着状态s遍历该路径;否则,状态s不可达,则该路径终止,遍历其他路径;对于一个可达的状态s,如果状态s对应的E插值被该路径对应的路径公式蕴含,说明沿着该状态存在一条到达目标状态的路径,程序不安全;如果状态s对应的S插值被蕴含,说明以状态为起点的所有路径都是安全的,不需要沿着状态s探索程序;如果状态s是可达的,且E插值和S插值都不被蕴含,则继续沿着状态s遍历该路径;
步骤三,在生成ARG的过程中,发现一条反例路径,到达目标状态,则需要进一步判断反例路径是否虚假;不是虚假反例,则说明程序是不安全的;否则,根据虚假反例,细化模型,分别计算并更新对应状态的R插值,S插值和E插值,执行重新生成ARG,直到找到一条真反例路径或不存在反例路径。
2.如权利要求1所述的基于插值的模型检测路径缩减方法,其特征在于,所述步骤一根据待验证的程序,生成控制流图CFG,并且初始化结点和边的属性,包括以下步骤:
(1)找到CFG中的目标结点,从目标结点开始反向遍历CFG,遍历的结点和边都保留,没有遍历到的结点和边都删除;
(2)得到裁剪后的CFG,初始化属性的值,对各个结点的三种插值进行初始化,初次遍历CFG,生成ARG的过程中,每一个结点的R插值的初始值都为{true};对于S插值,定义了为一个二元组:(F,Is),其中,F的值域为{full,half},Is的值是一个由谓词组成的合取式;对于一个结点l,如果l没有后继结点或者l的所有后继结点的S插值都是full,记为f,表示l的所有后继结点都被遍历过,则l的S插值也是full,否则,l的S插值为half,记为h,具体的形式如下:
若l是终结点,S插值的初始值为(full,true),表示如果到达终结点,路径一定是安全的;若l是目标结点,S插值的初始值为(full,false),表示如果到达目标结点,路径一定是反例路径;对于其他结点,S插值的初始值为(half,true),具体的形式如下:
若l是目标结点,E插值的初始值为true,表示路径一定是真反例;若l是终结点,E插值的初始值为false,表示路径一定不可能到达目标结点;对于其他结点,E插值的初始值为false,初始认为都不能到达目标结点;对于每一条迁移的W属性,初始值为⊥,表示还没开始遍历,其中,W的值域为{N+,⊥},N+是正整数集合。
3.如权利要求1所述的基于插值的模型检测路径缩减方法,其特征在于,所述方法还包括:利用W属性决定分支边的遍历顺序,同时,利用S插值和E插值,加快验证的效率,具体的步骤包括:
(1)得到一个可达状态s',根据CFG的迁移关系,产生后继状态;如果存在多个可能的后继,根据边的W值,决定遍历顺序;边的W值的优先级为:(>0)>⊥>0;如果边的W值相同,则随机选择;对于一个后继状态s,根据R插值,如果状态s不可达,则当前路径终止,遍历其他路径;如果当前状态s可达,首先判断s的E插值是否为false;如果是false,说明s[0]的后继结点还没被遍历过,跳转到(2);如果不是false,首先采用SSA原则,每一个变量至多被赋值一次,得到从初始状态s0到达s的路径公式,记为Pf(s0,…,s);用求解器判断Pf(s0,…,s)是否蕴含s的E插值;如果蕴含,则说明程序存在一条真反例,程序不安全,验证结束;否则跳转到(2);
(2)判断s的S插值是否为full插值;如果不是full插值,则跳转到(3);如果是full插值,得到从初始状态s0到达s的路径公式,记为Pf(s0,…,s),然后用求解器判断Pf(s0,…,s)是否蕴含s的S插值;如果蕴含,则说明以状态s为起点的所有路径都是安全的,不需要探索,当前路径终止,遍历其他路径;
(3)判断s是否目标状态,如果是目标状态,则发现一条反例路径,执行步骤三;如果不是,进一步判断s是否被其他状态覆盖;如果s被覆盖,则不需要探索当前路径,遍历其他路径;如果s不被覆盖,则继续探索当前路径;
(4)如果存在没有被遍历的可达状态,则跳转到(1);否则,验证结束,程序安全。
4.如权利要求1所述的基于插值的模型检测路径缩减方法,其特征在于,所述步骤三中优化策略包括:
在步骤一中,生成程序对应的CFG,根据目标结点,遍历整个CFG减掉不可能到达目标状态的结点和边;
在步骤三中,如果存在一条虚假反例路径,在计算三种插值的同时,计算反例路径中每一条边的W值;在步骤二中,一个状态如果存在多个后继状态,根据边的W值,决定后继状态的遍历顺序。
5.如权利要求2所述的基于插值的模型检测路径缩减方法,其特征在于,计算插值和W属性的具体步骤包括:
1)在生成ARG的过程中,发现一条反例路径path:〈s0,e0,s1,…,en-1,sn〉;利用SMT求解器判断path是不是虚假;如果path是真反例,则程序不安全,验证结束;如果path是虚假的,则执行2);
2)计算R插值,对于状态si,0<i<n,将path划分为两部分:pre和post;pre子序列为<s0,…,si>,post子序列为<si,…,sn>,利用Craig插值公式计算新的R插值,Craig(pre,post),更新si[0]的R插值,形式化地表示为:
R-Intp(si[0])=R-Intp(si[0])∪Craig(Pf(s0,..,si),Pf(si,…,sn));
其中,Pf(s0,…,si)表示从s0到si的路径对应的路径公式;
3)计算S插值,首先找到path的可达的有效序列Π=<s0,...,sm>,0<m<n,且si状态可达,si+1状态不可达;对于Π的每一个状态si,0<i≤m,判断S插值的第一个元素是full还是half;si[0]的所有后继结点的S插值都是full,则si[0]的S插值为full,否则,si[0]的S插值为half;具体的形式如下:
对于S插值的第二个元素,记为Is(si[0]),分两种情况,如果i=m,则Is(si[0])是边ei+1的路径公式取反;如果0<i<m,Is(si[0])利用Craig插值计算,记为Craig(A,B);其中,A表示从s0到si的路径公式,B是边ei对应的公式和状态si+1对应的S插值取反的合取式;具体的形式如下:
其中,A=Pf(s0,…,si),B=Pf(si,ei,si+1)∧!(Is(si+1[0]);从sm状态开始倒序地计算每个状态的插值,直到初始状态或者某一状态的S插值为half;
4)计算E插值,找到path的最大有效后缀序列Π=<si,…,sn>,0<i≤n;从si状态开始,利用Craig插值,倒序地计算对应的E插值,记为Craig(A,B);对于si,A是从si到sn的路径公式和sn的E插值的合取式,B是从s0到si的路径公式;对于状态sj,0<j<i,A是从sj到sj+1的路径公式和sj+1的E插值的合取式,B是从s0到sj的路径公式,具体的形式如下:
5)计算边的W值,根据反例路径和更新后的S插值,来计算对应边的W值,对于一条边e:(s,op,s'),如果s'的S插值是full,则e的W值为0;如果s'的S插值是half,且s'是最后一个可达状态,e的W值为s'[0]的出边的个数-1;如果s'的S插值是half,且s'不是最后一个可达状态,e的W值为两部分的和:1)s'[0]的出边中W值不为⊥的边的W值的和,2)s'[0]的出边中W值为⊥的边的个数;对于边e:(s,op,s'),s':(l',c',p')具体的形式如下:
6)跳转到步骤二,重新生成ARG。
6.如权利要求5所述的基于插值的模型检测路径缩减方法,其特征在于,所述4)中计算最大有效后缀序列的具体步骤包括:
(1)对于反例路径path:〈s0,e0,s1,…,en-1,sn〉,边分为两类:分支边集合Eb和非分支边Ea;
(2)生成path对应的路径公式,其中,对于e∈Eb,对应的公式用true代替;对于e∈Ea,生成其对应的公式,生成新的路径公式Pf;
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710896756.2A CN107844415B (zh) | 2017-09-28 | 2017-09-28 | 一种基于插值的模型检测路径缩减方法、计算机 |
US15/912,588 US10503628B2 (en) | 2017-09-28 | 2018-03-06 | Interpolation based path reduction method in software model checking |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710896756.2A CN107844415B (zh) | 2017-09-28 | 2017-09-28 | 一种基于插值的模型检测路径缩减方法、计算机 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107844415A CN107844415A (zh) | 2018-03-27 |
CN107844415B true CN107844415B (zh) | 2021-02-05 |
Family
ID=61661853
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710896756.2A Active CN107844415B (zh) | 2017-09-28 | 2017-09-28 | 一种基于插值的模型检测路径缩减方法、计算机 |
Country Status (2)
Country | Link |
---|---|
US (1) | US10503628B2 (zh) |
CN (1) | CN107844415B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108650675A (zh) * | 2018-04-23 | 2018-10-12 | 许昌学院 | 一种基于大数据的同态加密机制的位置隐私保护系统 |
CN108804391A (zh) * | 2018-04-27 | 2018-11-13 | 湖南农业大学 | 一种基于b样条的插值曲线或曲面的构造方法及系统 |
US11226797B2 (en) * | 2018-05-24 | 2022-01-18 | Chaldal, Inc. | Representation and analysis of workflows using abstract syntax trees |
CN108900320B (zh) * | 2018-06-04 | 2021-02-09 | 佛山科学技术学院 | 一种互联网测试床拓扑结构大比例规模缩减方法及装置 |
CN110489335B (zh) * | 2019-07-25 | 2023-01-24 | 金陵科技学院 | 应用于自动售卖机系统的基于模型检测的反例精化系统 |
CN111597103B (zh) * | 2020-03-23 | 2023-11-28 | 浙江工业大学 | 一种嵌入式软件SysML模型状态空间约简方法 |
CN111679964B (zh) * | 2020-04-21 | 2022-07-26 | 华东师范大学 | 基于边界模型检测技术的微内核操作系统接口的形式化验证方法 |
CN111813675A (zh) * | 2020-07-08 | 2020-10-23 | 北京嘀嘀无限科技发展有限公司 | Ssa结构解析方法、装置、电子设备和存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1204215A1 (en) * | 1999-07-21 | 2002-05-08 | NEC Corporation | Path searching method and device |
CN101894072A (zh) * | 2010-07-20 | 2010-11-24 | 山东省计算中心 | 一种模型检测中异常终止的检测方法 |
CN105446881A (zh) * | 2015-11-26 | 2016-03-30 | 福建工程学院 | 一种程序不可达路径的自动检测方法 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7930659B2 (en) * | 2005-06-03 | 2011-04-19 | Nec Laboratories America, Inc. | Software verification |
US7587707B2 (en) * | 2005-07-01 | 2009-09-08 | Microsoft Corporation | Predicate abstraction via symbolic decision procedures |
US8005661B2 (en) * | 2007-05-07 | 2011-08-23 | Nec Laboratories America, Inc. | Modeling and verification of concurrent systems using SMT-based BMC |
US20090282289A1 (en) * | 2008-05-06 | 2009-11-12 | Microsoft Corporation | Generation and evaluation of test cases for software validation and proofs |
US9720925B1 (en) * | 2012-04-12 | 2017-08-01 | Orchard Valley Management Llc | Software similarity searching |
US9141354B2 (en) * | 2012-04-23 | 2015-09-22 | Ecole polytechnique fédérale de Lausanne (EPFL) | Advantageous state merging during symbolic analysis |
US9098620B2 (en) * | 2012-05-12 | 2015-08-04 | Palo Alto Research Center Incorporated | System and method for parallel model checking utilizing parallel structured duplicate detection |
JP5901668B2 (ja) * | 2013-02-28 | 2016-04-13 | タタ コンサルタンシー サービシズ リミテッドTATA Consultancy Services Limited | 静的解析中に発生した警告をグループ化するシステムおよび方法 |
US20170212829A1 (en) * | 2016-01-21 | 2017-07-27 | American Software Safety Reliability Company | Deep Learning Source Code Analyzer and Repairer |
-
2017
- 2017-09-28 CN CN201710896756.2A patent/CN107844415B/zh active Active
-
2018
- 2018-03-06 US US15/912,588 patent/US10503628B2/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1204215A1 (en) * | 1999-07-21 | 2002-05-08 | NEC Corporation | Path searching method and device |
CN101894072A (zh) * | 2010-07-20 | 2010-11-24 | 山东省计算中心 | 一种模型检测中异常终止的检测方法 |
CN105446881A (zh) * | 2015-11-26 | 2016-03-30 | 福建工程学院 | 一种程序不可达路径的自动检测方法 |
Non-Patent Citations (1)
Title |
---|
黄宏涛等." 基于克雷格插值的反例理解方法".《吉林大学学报(理学版)》.2013,第51卷(第1期), * |
Also Published As
Publication number | Publication date |
---|---|
US20190095314A1 (en) | 2019-03-28 |
US10503628B2 (en) | 2019-12-10 |
CN107844415A (zh) | 2018-03-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107844415B (zh) | 一种基于插值的模型检测路径缩减方法、计算机 | |
Vora et al. | Kickstarter: Fast and accurate computations on streaming graphs via trimmed approximations | |
Hahn et al. | Lazy probabilistic model checking without determinisation | |
Alur et al. | Predicate abstraction for reachability analysis of hybrid systems | |
Chaudhuri | Subcubic algorithms for recursive state machines | |
Chatterjee et al. | An O (n 2) time algorithm for alternating Büchi games | |
US7788646B2 (en) | Method for optimizing integrated circuit device design and service | |
JP2007528059A (ja) | ソフトウェアのモデル化、抽象、および分析のためのシステムと方法 | |
Bacci et al. | Probabilistic guarantees for safe deep reinforcement learning | |
Hooimeijer et al. | StrSolve: solving string constraints lazily | |
JP2010506309A (ja) | パラメータ化された並行ソフトウェアのプロシジャ間データフロー解析 | |
Strejček et al. | Abstracting path conditions | |
Ciesinski et al. | Reduction techniques for model checking Markov decision processes | |
Etessami et al. | Model checking of recursive probabilistic systems | |
Basten | Tracking down the origins of ambiguity in context-free grammars | |
Chatterjee et al. | Symbolic algorithms for qualitative analysis of Markov decision processes with Büchi objectives | |
CN108009298B (zh) | 一种互联网人物搜索信息整合分析控制方法 | |
CN106682514B (zh) | 基于子图挖掘的系统调用序列特征模式集生成方法 | |
Pira | Using knowledge discovery to propose a two-phase model checking for safety analysis of graph transformations | |
Hüls et al. | Analyzing Hybrid Petri nets with multiple stochastic firings using HyPro | |
Brückner et al. | Slicing abstractions | |
Zhang et al. | A resolution calculus for the branching-time temporal logic CTL | |
Santone | Heuristic search+ local model checking in selective mu-calculus | |
Lal et al. | Counterexample guided abstraction refinement for polyhedral probabilistic hybrid systems | |
Farheen | Improvements to transitive-closure-based model checking in Alloy |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |