一种并发系统组合验证装置的制作方法

文档序号:17720991发布日期:2019-05-22 02:09阅读:184来源:国知局
本申请涉及形式化验证
技术领域
:,尤其涉及一种并发系统组合验证装置。
背景技术
::isabelle是一个通用的证明工具,它允许将数学公式以形式化语言表示,并且提供用于在逻辑演算中证明这些公式的工具。现在isabelle最广泛的例子是isabelle/hol,它提供了一个高阶逻辑定理证明环境,可以用于证明大型应用程序。反应系统是由一组明确定义的输入事件组成,系统通过对每个事件执行相关的处理程序来做出反应。在并发环境中,事件处理程序可以与其他程序的执行交互,例如抢先系统中的硬件中断,或多和架构中的反应系统的其他实例。最先进的基于依赖保证的验证框架进关注命令性程序,并且在依赖和保证关系中,在可能无限的事件处理程序和事件处理程序的输入参数情况下,难以捕捉相互作用关系。依赖保证技术代表了对具有共享变量的并发程序组合推理的基本方法,但是现有依赖保证方法中使用的并发语言没有提供指定和验证反应系统的方式。例如,如果我们考虑调用操作系统提供的服务作为输入事件,我们可以为每个服务提供规范处理程序,并对os处理程序建模作为覆盖所有服务的案例,但这使保证关系变得更加复杂。此外输入参数可能是状态的一部分,有时它们在执行事件期间不得更改,因此关系必须反应这种情况。然而,在不考虑事件的语言中,当具有事件的顺序组合时,在依赖中陈述并且保证参数在事件的执行期间不改变是不容易的。然而,当没有适当的框架来处理这些功能时,这种系统的规范和验证变得更加困难。申请内容为解决上述技术问题,本申请实施例提供了一种并发系统组合验证装置。本申请实施例提供的并发系统组合验证装置,包括:配置模块,用于提供一种形式化语言;验证模块,用于提供程序验证功能和事件系统验证功能;约束模块,用于提供条件约束。本申请实施例中,所述配置模块提供的所述形式化语言能够描述程序代码、事件系统和并发事件系统。本申请实施例中,所述配置模块提供的所述形式化语言,包括:形式化语言的抽象语法和操作语义。本申请实施例中,所述抽象语法包括程序语法和事件语法,其中:所述程序语法包括:基本赋值语句、条件语句、循环语句、顺序语句、原子语句;所述事件语法包括:基本事件、事件系统和并行事件系统。本申请实施例中,所述验证模块,包括:程序验证子模块,用于提供如下功能:基本赋值语句的验证功能、条件语句的验证功能、循环语句的验证功能、顺序语句的验证功能、原子语句的验证功能和并发程序的组合验证功能;事件系统验证子模块,用于提供如下功能:基本事件验证功能,事件系统验证功能和并行事件系统验证功能。本申请实施例中,所述约束模块,包括:前置条件约束子模块,用于确定程序的初始状态,所述程序的初始状态必须满足前置条件约束;依赖条件约束子模块,用于确定程序执行环境的转换范围,在运行过程中的任何环境转换都必须满足依赖条件约束;保障条件约束子模块,用于确定程序运行的状态转化范围,在执行过程中由该程序导致的状态转换都必须满足保障条件约束;后置条件约束子模块,用于确定程序运行结束后的结束状态,当程序运行结束后内存状态必须满足后置条件约束。本申请实施例中,所述状态是内存状态,其中,所述内存状态包括局部变量状态和全局变量状态。采用本申请实施例的技术方案,解决了现有技术中对程序的并发执行和并发事件的把握不足的问题。附图说明图1为本申请实施例提供的并发系统组合验证装置的结构示意图;图2为本申请实施例提供的形式化语言的抽象语法。图3为本申请实施例提供的形式化语言的操作语义。图4为本申请实施例提供的验证模块的组合验证规则。图5为本申请实施例提供的无人驾驶车辆检测障碍物的结构图。图6为本申请实施例提供的forward事件。图7为本申请实施例提供的雷达发送中断请求的事件。图8为本申请实施例提供的程序中断处理程序接受中断请求的事件。图9为本申请实施例提供的arinc653多核内核的结构图。图10为本申请实施例提供的schedule事件和send_qmsg事件。图11为本申请实施例提供的send_qmsg事件的条件定义。图12为本申请实施例提供的为系统定义的条件不变式。图13为本申请实施例提供的isabelle平台具体实现的配置模块的程序语法。图14为本申请实施例提供的isabelle平台具体实现的配置模块的事件系统语法。图15为本申请实施例提供了isabelle平台具体实现的配置模块的程序语句操作语义。图16为本申请实施例提供的isabelle平台具体实现的验证模块的程序组合验证规则。图17为本申请实施例提供的isabelle平台具体实现的配置模块的事件系统操作语义;图18为本申请实施例提供的isabelle平台具体实现的验证模块的事件系统组合验证规则。具体实施方式为便于理解本申请实施例的技术方案,以下对本申请实施例涉及到的相关概念进行说明。图1为本申请实施例提供的并发系统组合验证装置的结构示意图,如图1所示,所述并发系统组合验证装置包括:配置模块,用于提供一种形式化语言;验证模块,用于提供程序验证功能和事件系统验证功能;约束模块,用于提供条件约束。本申请实施例中的并发系统组合验证装置的使用包括以下步骤:1)使用配置模块提供的形式化语言,实现所要验证的程序代码或事件系统。2)根据所要验证代码或事件系统的需求,实现约束条件。3)依据约束模块中的提供的约束条件,对配置模块中使用形式化语言实现的代码或事件系统进行验证。其中,具体实现是在isabelle平台上完成的,其中配置模块在isabelle平台上实现的相关描述,包括形式化语言的抽象语法和操作语义。其中,抽象语法包括程序抽象语法和事件系统抽象语法。程序的抽象语法:(1)basicf:表示程序的基本赋值语句。(2)p1;;p2:p1和p2表示两段程序,该语句表示这两段程序的顺序执行。(3)condbp1p2:b是一个判定条件,该语句表示当b为true时执行p1,当b为false时执行p2。(4)whilebp:该语句表示循环语句,当b为true时执行p,否则,该语句执行完毕。(5)awaitbp:原子语句,当b为true时,执行程序p的操作是原子操作。(6)nondtr:通过状态关系r模拟非确定性。(7)⊥:该语句表示空语句。事件系统的抽象语法:(1)eventα:表示非触发事件,称为基本事件,该事件是一个三元组event(l,g,p),其中l表示事件的名称,g表示事件的条件,p表示事件的主体。(2)表示的已触发事件,p表示事件的主体。(3){ε0,...,εn}:表示事件集合,当一个事件执行完成时会在该事件序列中寻找下一个事件执行。(4)表示一个事件和一个事件序列链接形成的事件序列。(5)k→s:表示的是从k到事件系统的函数,其中k表示事件系统的标识符,主要用于并行事件系统。其中操作语义包括程序语句操作语义和事件系统操作语义。程序语句操作语义包括:(1)basic:基本赋值语句的操作语义,(basicf,s)执行完成之后变为(⊥,fs),当前状态变为f执行之后的状态。(2)seq:顺序语句的执行语义分为两种,一种是当p1执行完成之后变为空语句,并且状态变为s′,则(p1;;p2,s)执行完之后变为(p2,s′)。另一种为当p1执行完之后变为p′1,并且状态变为s′,则(p1;;p2,s)执行完成之后变为(p′1;;p2,s′)。(3)cond:条件语句的执行语义也为两种,一种为当前状态s不满足b时,(condbp1p2,s)执行完成之后变为(p2,s),当前状态s不变。第二种为当前状态s满足b,则(condbp1p2,s)执行完成之后变为(p1,s),当前状态s不变。(4)whilet:循环语句的操作语义分为两种,一种为当前状态s不满足b,(whilebp,s)执行完成之后变为(⊥,s),当前状态不变。另一种为当前状态s满足b,则(whilebp,s)执行完成之后变为(p;;(whilebp),s),接下来执行程序p,然后再继续执行while语句,当前的状态s不变。(5)nondt:如果状态转换(s,s′)满足条件r时,(nondtr,s)执行完成之后变为(6)await:原子语句的操作语义,若当前状态满足s满足b,并且(p,s)经过多次执行变为(⊥,s′),则(awaitbp,s)执行完成之后变为(⊥,s′),当前状态变为p执行之后的状态。事件系统操作语义包括:(1)innerevt:如果(p,s)执行完成之后变为(p′,s′),执行完成之后变为其中事件的变为p程序执行完成之后的事件,当前状态变为p程序执行完成之后的状态,系统当前执行的事件不变。(2)basicevt:对于事件eventα,如果p是eventα的主体,s是满足eventα的状态,则(eventα,s,x)执行事件之后变为其中x′为x(k→eventα),表示在事件系统k中执行事件eventα。(3)evtset:在事件系统k中执行事件εi,则存在(εi,s,x)变为(ε′i,s,x′)的转换。所以对于事件集合{ε0,...,εn},如果执行事件εi,则({ε0,...,εn},s,x)执行完成之后会变为,表示先执行触发事件ε′i,然后在执行事件集合中的事件。(4)evtseq:该操作语义分为两种,一种为如果(ε,s,x)经过任意类型的转换变为(ε′,s′,x′),其中ε′不为则经过该类型的转换可以变为另一种为如果(ε,s,x)经过任意类型的转换变为则经过该类型的转换可以变为(s,s′,x′)。(5)par:对于并行事件系统,如果(ps(k),s,x)经过任意类型的转换可以变为(s′,s′,x′),则(ps,s,x)经过该类型的转换可以变为(ps′,s′,x′),其中ps′为ps(k→s′)。其中验证模块在isabelle平台上实现的相关描述,包括程序验证子模块和事件系统验证子模块。程序验证子模块的相关实现描述:(1)basic:如果对于前置条件pre中包含的状态,在执行完语句f之后的状态全部满足后置条件pst,语句f执行的之前的状态和执行之后的状态所形成的元组属于g,并且满足stable(pre,r)和stable(pst,r),则可以推出(basicf)sat<pre,r,g,pst>,即basicf语句满足该规范。(2)cond:如果p1满足<pre∩b,r,g,pst>,p2满足<pre∩-b,r,g,pst>,满足stable(pre,r),并且对于任意的状态s,均满足(s,s)∈g,可以推出(condbp1p2)sat<pre,r,g,pst>,其中pre∩b表示pre中所有状态执行b后的结果为true的状态形成的集合,pre∩-b表示pre中所有的状态执行b后的结果为false的状态形成的集合。(3)seq:如果程序p满足<pre,r,g,m>,程序q满足<m,r,g,pst>,可以推出(p;;q)sat<pre,r,g,pst>。(4)while:如果程序p满足<pre∩b,r,g,m>,pre∩-b是后置条件pst的子集,满足stable(pst,r)和stable(pst,r),并且对于任意的状态s,均满足(s,s)∈g,可以推出(whilebp)sat<pre,r,g,pst>。(5)await:对于任意的状态v,如果能推出psat〈pre∩{v},id,univ,{s|(v,s)∈g}∩pst〉,并且满足stable(pre,r)和stable(pst,r),则能推出(awaitbp)sat<pre,r,g,pst>。(6)nondt:如果存在状态s′,使得(s,s′)∈r,并且对于任意(s,s′)∈r可以推出s′∈pst,并且对于(s,s′)所成的集合是g的子集,其中s∈pre∧(s,s′)∈g,同时满足stable(pre,r)和stable(pst,r),可以推出(nondtr)sat<pre,r,g,pst>。(7)conseq:如果pre是pre′的子集,r是r′的子集,g是g′的子集,pst是pst′的子集,且对于任意程序满足<pre,r,g,pst>规范,则可以推出#sat<pre,r,g,pst>,其中#表示任意程序。程序的辅助验证模块相关实现描述:(1)unpre:如果psat<pre,r,g,pst>,并且psat<pre′,r,g,pst>,可以推出psat<pre∪pre′,r,g,pst>。(2)intpost:如果psat<pre,r,g,pst>,并且psat<pre,r,g,pst′>,可以推出psat<pre,r,g,pst∩pst′>。(3)univpre:如果对于pre中任意的状态v都有psat<{v},r,g,pst>,可以推出psat<pre,r,g,pst>。(4)emptypre:如果前提条件pre为空集,则psat<{},r,g,pst>成立。事件系统验证子模块的相关实现描述:(1)basicevt:如果事件eventα的主体满足规范<pre∩guard(α),r,g,pst>,其中guard(α)表示满足事件eventα的出发状态,并且满足stable(pre,r),并且对于任意的状态s,均满足(s,s)∈g,则可以推出eventαsat<pre,r,g,pst>。(2)inner:如果程序p满足规范<pre,r,g,pst>,则可以推出(3)evtseq:如果事件ε满足规范<pre,r,g,m>,事件集合s满足规范<m,r,g,pst>,则可以推出(4)evtset:对于事件集合{ε0,...,εn},如果对于集合内任意的事件εi,都有εisat<presi,rsi,gsi,pstsi>,其中presi表示第i个事件的前置条件,满足stable(pre,r),并且对于事件集合中的任意事件εi,其后置条件都是其他事件的前置条件的子集,事件集合的前置条件pre是集合中任意事件的前置条件的子集,集合中任意事件的后置条件均是事件集合的后置条件的子集,此外,事件集合中的任意事件都满足和并且对于任意的状态s,均满足(s,s)∈g,则可以推出({ε0,...,εn})sat<pre,r,g,pst>。(5)par:对于并行事件系统ps中的k事件系统,都满足其相应的规范<presk,rsk,gsk,pstsk>,并且对于并行事件系统中的任意事件k,并且对于任意不同的事件系统k和事件系统k′,则可以推出pssat<pre,r,g,pst>。其中根据所述的stable(f,g)条件是指对于任意的状态下x和y,如果x∈f∧(x,y)∈g,那么可以推出y∈f。其中约束模块在isabelle平台上实现的相关描述,包括前置条件约束子模块、依赖条件约束子模块、保障条件约束子模块和后置条件约束子模块:(1)前置条件约束子模块,用于确定程序的初始状态,程序的初始状态必须满足前置条件约束;(2)依赖条件约束前置条件约束,用于确定程序执行环境的转换范围,在运行过程中的任何环境转换都必须满足依赖条件约束;(3)保障条件约束前置条件约束,用于确定程序运行的状态转化范围,在执行过程中由该程序导致的状态转换都必须满足保障条件约束;(4)后置条件约束前置条件约束,用于确定程序运行结束后的结束状态,当程序运行结束后内存状态必须满足后置条件约束。以下结合具体应用示例对本申请实施例的技术方案做进一步详细说明。应用示例一:在该应用示例中,本申请将本申请的验证方法应用于抢占和多级中断。本申请用该方法证明具有步进电机和雷达控制器的无人驾驶车辆检测障碍物的正确性和安全性。对于该应用示例的结构图如图5所示,主要包括三个模块:雷达(r),控制器(c)和程序中断控制器(pic)。应用的系统调用和雷达的检测会向pic发送中断请求(irq),然后pic会阻塞当前程序并且跳转到新的程序执行。为了能够表示多级中断,本申请定义了一个栈来保存这些irq,并且本申请使用该语句来表示只有当处理程序是栈的顶层元素时,才能执行处理程序c的内部步骤p。该系统的状态是通过变量car_pos,obstacle_pos,pos_aux,obst_pos_aux来表示,其中参数car_pos表示当前电机所在的位置,参数obstacle_pos用来表示所有已经被探测出来的障碍物的位置,参数pos_aux和参数obst_pos_aux是应用在事件中的局部参数。本申请定义了一组事件用来指定系统调用,检测障碍物和向pic发送irq。图6中黑色字体所示的便是forward事件,对backward事件与forward事件类似,这里不再列出。这两个事件用来驱使电机向前移动或者向后移动,直到该电机已经移动了距离v。在整个的移动过程中,如果程序发现在下一个要移动的位置存在障碍物,电机便会立即停止。在该程序最后,iret语句会对irq栈进行pop操作。图7所示的是从雷达发送的irq的处理程序,该事件会将出现的障碍物的位置插入到变量obstacle_pos。这里本申请假设障碍物不会出现电机当前位置的前一个位置或者后一个位置。图8所示的事件模拟了pic接受irq的操作,并且将新收到的irq添加到栈中。本申请假设如果一个设备发送的irq正在被处理,那么该设备便不会再发送irq。就在该应用示例中,本申请保证事件forward,事件backward和事件obstacle之间是可以相互抢占的。对于系统的功能正确性,本申请通过事件的依赖保证条件来验证。本申请对每个事件定义了依赖保证条件。例如,表达式{||}是表示满足的状态集合的具体语法,本申请用表示变量x在状态中的值,用和表示状态中的变量x在转换前和转换后的值。对于事件forward,pre-condition放宽到{|true|}。rely-condition显示变量car_pos和两个局部变量(i和pox_aux)均没有被环境改变,此外,在处理雷达的irq时,rely-condition包含了事件obstacle和事件irqs中状态的变化。在第一个例子中,在执行栈操作和赋值操作=的过程中,变量onstacle_pos一直保持不变。在第二个例子中,新的障碍随时可能出现,因此,同时rely-condition也要求在+1处的碰撞在障碍发生前和发生后是相同的。如果没有探测到新的障碍物,控制器会继续执行,环境也不会改变变量obstacle_pos和变量obst_pos_aux。pic可能接收到雷达的irq,这时forward事件将会被中断。post-condition定义了forward事件的正确性,它表示电机如果在距离v的范围内没有障碍物出现,则i=v,否则电机要停在障碍物之前。通过引入依赖证明规则证明了forward事件的功能正确性。本申请使用r和g分别表示forward_rgcondition的rely-condition和guar-condition。在图6中,每个语句的前后置条件是以蓝色显示的,验证条件是以绿色显示的。本申请为while语句应用了一个循环不变式{|′car_pos=′pos_aux+′i|},然后应用图4中的evtset证明规则来证明ctrl,radar和pic的功能正确性。最后本申请为整个系统定义了依赖保证条件并且使用par证明规则证明该系统的正确性。本申请验证了inv≡{||}的安全性,这就意味着车辆在任何时候都不会与障碍物碰撞。根据系统功能的正确性和conseq证明规则,可以看出是正确的。然后本申请使用theorem2,并且根据和每个事件的保证条件对于inv是稳定的来证明inv是vehiclespec的不变式。应用示例二:本应用示例研究的内容涉及多核并发和不变性的验证。由于设备驱动程序在特殊分区中运行,因此本申请不考虑内核中的多级中断。如图9所示,arinc653中的ipc通过在各个分区中配置的信道来进行传递消息。各个分区可以通过端口访问通道,这些端口是通道的端点。在isabelle中的内核配置分为静态和动态组件。本申请创建一个常量conf,用于定义规范中状态的静态组件。在conf中,c2s是从核心到调度程序的映射,并且是双射。p2s是为调度程序部署分区。p2p表示端口所属的分区。chsrc和chdest表示排队通道的源端口和目标端口。最后,chmax定义了通道的最大容量。规范已经创建了基于这些元素的抽象数据类型:core,part,qchannel,port,message。这就意味着本申请对任意系统配置进行验证,而不是具体实例。内核状态的动态组件涉及调度程序,通道和分区的状态。调度程序的状态显示正在执行的当前分区。通道的状态将消息的信息保存在fifo队列中。分区的状态定义为idle,ready或run。本申请将定义为系统的初始状态。本申请定义一组时间来指定调度和通信服务。这些事件通过其输入的参数和核心标识符k进行参数化。schedule和send_qmsg事件如图10所示。当p部署在k上并且p的状态不是idle时,可以在核心处理器k上调度分区p。该事件首先将当前运行的分区状态设置为ready,将当前分区的k设置为none。然后将p设置为当前分区,并且将其状态设置为run。当在当前分区中配置源端口p时,send_qmsg事件可能发生在处理器核心k上的当前分区中。该事件一直被阻塞的,直到操作的信息通道由可用的空间。然后将它的信息插入消息队列的尾部并且增加队列的大小。因此,多内核的并行时事件系统的定义如下。每个核心都部署于核心标识符k参数化的相同事件序列。在每个处理器内核上启动内核实例时,本申请使用事件core_init来初始化每个内核的内核状态。然后,内核实例相应esysk中定义的系统调用,其中esysk是一个事件集。出于基于事件的组合推理的目的,本申请指定每个事件的依赖保证条件。事件send_qmsg的条件定义如图11。在k上执行的事件依赖于k上当前分区没有被其他核心上的事件改变。保证条件显示事件内部步骤不会修改任何核心上的当前分区,任何分区的状态以及消息队列和其他通道的大小。该事件还保证如果大小等于内部步骤之前的消息数,则在步骤之后它们仍然相等。对于系统的不变式inv验证,如图12,inv1表示如果分区p是调度程序sched的当前正在执行的分区,则应该再调用程序上部署p。inv2表示如果在调度程序sched上部署分区p并且p是当前分区,则p的状态是run。inv3定义了对于任何排队通道c,当前大小应该是队列中的消息数量。本申请已经知道并且arincspec中所有的事件都是基本事件。此外,本申请证明了arincspec中每个事件的保证条件对于inv都是稳定的。本申请使用这些结果并且直接应用事件组合和事件证明规则可以得出。根据theorem2,本申请证明了inv是的不变式。本申请实施例所记载的技术方案之间,在不冲突的情况下,可以任意组合。以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本
技术领域
:的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1