一种基于形式化验证的同步数据流程序的可信排序方法

文档序号:6521578阅读:289来源:国知局
一种基于形式化验证的同步数据流程序的可信排序方法
【专利摘要】本发明公开一种基于形式化验证的同步数据流程序的可信排序方法,包括Lustre并行程序和由Lustre并行程序排序后得到的串行C程序,通过对任意两个满足拓扑排序的Lustre程序,证明其拓扑排序前的Lustre程序和拓扑排序后的Lustre程序执行语义等价,得到排序后的C程序与排序前的Lustre程序在语义上执行等价。本发明以“入度为零的顶点拓扑排序算法”为理论基础,基于形式化语言进行开发实现,通过对任意两个满足拓扑排序性质的程序在串行语义中执行是等价的证明,在形式化验证时考虑了并行语言在转化成串行语言过程中的所有情况,并分别对每种情况都做了证明,得到排序后的程序满足拓扑排序的性质,从而保证方案的正确性,提高整个软件系统的安全性和可靠性。
【专利说明】一种基于形式化验证的同步数据流程序的可信排序方法
【技术领域】
[0001]本发明涉及计算机安全领域,具体涉及针对编译器的安全性而利用形式化验证的同步数据流程序的可信排序方法。
【背景技术】
[0002]随着计算机技术越来越多地应用于航空航天、核电、高速铁路等安全关键系统(SCS, Safety-Critical System),对其系统中核心软件的安全性要求也越来越高。安全关键系统中的丝毫错误都可能引发巨大的灾难,如何为安全关键系统构造一个基础的安全软件环境是需要面对的首要问题,尤其是对操作系统、编译器等基础核心软件。
[0003]编译器的可信性很早就受到学术界和工业界的重视,从McCarthy和Painter的开创性工作开始,如何提高编译器正确性和可靠性一直是计算机科学研究领域的热点;但一致进展缓慢,在工业界的应用有限。最有突破性进展的是Xavier Leroy等人基于Coq辅助定理证明工具研究开发的Compcert编译器,它是一个完整的使用形式化方法证明了产生的可执行代码的行为与源程序的语义完全保持的C编译器,得到了业界的广泛认可。
[0004]我国经济高速发展,对能源的需要日益高涨,尤其是对新能源的需求。因此核电站在我国将迎来快速发展。Lustre是一种同步数据流语言,主要用于核电、航空航天等高可信要求的工业自动化领域中。
[0005]需要将Lustre程序转换成相应环境下的语言,如将Lustre转换为C代码。这个转换目前大多使用国际著名工具SCADE来将Lustre编译成C代码。Scade是目前为止最成熟的Lustre编译器,它已通过了多个工业标准的安全级认证,其代码生成器KCG获得了民用航空软件生产许可。在因果分析时它只在静态语义层面进行检查,通过模块化和独立编译以及更严格地定义依赖关系来解决因果分析的问题。它禁止node的输入依赖于node的输出,从而使每个node能够单独编译。SCADE工具虽然已通过多个安全级工业标准的认证,但它是通过大规模测试来保证其安全性,未经过严格的形式化验证。由于测试无法做到完全覆盖,故未经验证的编译器中隐藏的误编译错误很难被发现。另一方面,SCADE是商业公司推出的软件产品,相关技术细节没有公开,很难了解到为提升软件的可靠性和可信性在哪些方面做了技术性工作。
[0006]此外在对编译器的验证方面,目前还有如下一些方式=CompCert项目实现了 C的子集Clight到汇编的翻译过程,并用交互式定理证明器证明每个步骤在对应的语义中执行等价。相比普通的验证技术,形式化验证能在数学的层面对软件的逻辑进行抽象和证明,因此具备更高的安全性,Compcert项目虽然利用形式化验证技术对部分子模块进行验证,但是其实现的是串行语言(C语言)到串行语言(汇编语言)的转换,并不适用于并行语言(Lustre语言)到串行语言(C语言)的转换。Mike Gemunde等通过模型检查的方式对Lustre程序进行因果分析。他建立了一个形式化的因果分析定义并能够保守迅速地检查系统中的因果循环。模型检查的方式相对于基于语义的形式化验证还是有局限性。A.Bertails等用形式化验证的方法完成了对Lustre程序的类型检查和时钟演算的验证,准备开始因果分析工作和后续的翻译工作,到目前为止还未完成。他们虽然准备通过形式化验证的方式来进行因果分析,但验证还是停留在语法层面,并未在语义执行的层面进行验证,而且后续到C的翻译工作也还没有完成。
[0007]为有效提高编译器的可靠性,系统中每个环节的可靠性都不容忽视,将同步数据流语言的程序转换为串行C语言程序是L2C编译器的重要组成部分。这一功能是为了保证两个程序执行的功能是相同的,保证程序的正确逻辑。

【发明内容】

[0008]为解决现有技术中在对Lustre程序转换为C语言程序时无法验证编译器安全性的问题,本发明提供一种形式化验证的同步数据流程序的可信排序方法。具体方案如下:一种基于形式化验证的同步数据流程序的可信排序方法,包括Lustre并行程序和由Lustre并行程序排序后得到的串行C程序,其特征在于,包括如下步骤:
[0009]步骤1、将源Lustre程序利用词法语法分析工具进行分析,得到该Lustre程序的抽象语法树,利用基于形式化方法的验证工具Coq对所得抽象语法树进行类型分析和静态语义检查,得到符合well-typed条件的抽象语法树Lustre-W ;
[0010]步骤2、对Lustre-W中所有变量的时钟周期进行归一化处理,使所有变量的时钟周期统一于标准周期;
[0011]步骤3、对归一化后的Lustre-W进行因果分析和拓扑排序、翻译后生成串行C程序;
[0012]步骤4、对任意两个`满足拓扑排序的Lustre程序,证明其拓扑排序前的Lustre程序和拓扑排序后的Lustre程序执行语义等价,验证过程如下:
[0013](I)首先建立Lustre并行程序中存储node名称的全局环境和存储各node函数执行周期中变量的局部环境,同时确保全局环境中node的名称不重复和局部环境中等式左值ID不为空;
[0014](2)建立一个与验证程序A的全局环境相同且与验证程序B的局部环境相同的验证程序C ;
[0015](3)利用验证程序A和验证程序C中node名一一对应的方式,可得到两者执行后语义等价的结果;
[0016](4)以验证程序C为基础,以仅有一步为区别的方式细化出中间验证程序Cl、C2、C3……Cn,其中验证程序Cn与验证程序B仅有一步区别,对比两个程序执行后其局部环境的值可得到两者语义执行是否等价的结果,再依次反推直至得到验证程序C和验证程序B之间语义执行是否等价的结论;
[0017](5)结合(3)和(4)的结果,得到拓扑排序前的Lustre程序和拓扑排序后的Lustre程序执行语义等价的结论;
[0018]步骤5、由此得到Lustre程序和其经过因果分析和拓扑排序后生成的C程序在执行语义上是等价的证明。
[0019]优选的:在步骤I的Coq静态语义检查中,通过分析node列表中不存在依赖环能够证明node列表在拓扑排序前后相互是同一个排列,其证明过程包括如下步骤:
[0020](I)首先证明拓扑排序前后的Lustre程序中“入度为零”的node名都是同一个排列;
[0021](2)然后证明拓扑排序前后的Lustre程序中具有依赖关系的node名都是同一个排列;
[0022](3)最后证明将上述两种结构合并到一起后的node列表的全局环境和局部环境与拓扑排序前相互是一个排列。
[0023]优选的:所述步骤2中的归一化处理是指,将所有不同长度的时钟周期按其中最快的时钟周期为单位进行拆分,然后按进行周期划分所有的变量。
[0024]优选的:所述步骤4的(4)中,所述验证程序Cn与验证程序B仅有一步区别包括四种类型:
[0025](I)这个区别点是主node ;
[0026](2)这个区别点不是主node ;
[0027](3)区别点是主node时,执行的两个主node不相等,即两个主节点的等式列表互相是一个排序,但其他信息相同;
[0028](4)区别点是主node时,两个主node所处的主节点位置不同,且两个主节点的全局环境也不同;
[0029]针对上述区别,再次对其化简,使最终的区别点统一为:不同主node下两个不相依赖的等式。
[0030]优选的:中两个不依赖的等式根据其中是否有call表达式,分为下面三种情况分别进行证明:
[0031](I)两个等式中都没有call表达式;
[0032](2)两个等式中有一个有call表达式;
[0033]( 3 )两个等式都有cal I表达式。
[0034]本发明以“入度为零的顶点拓扑排序算法”为理论基础,基于形式化语言进行开发实现,最后用形式化验证的方法对系统设计模型进行验证。形式化验证能在数学的层面对软件的逻辑进行抽象和证明,因此具备更高的安全性。本发明通过对任意两个满足拓扑排序性质的程序在串行语义中执行是等价的证明,在形式化验证时考虑了并行语言在转化成串行语言过程中的所有情况,并分别对每种情况都做了证明,得到排序后的程序满足拓扑排序的性质,从而保证方案的正确性,提高整个软件系统的安全性和可靠性。
【专利附图】

【附图说明】
[0035]图1本发明的工作过程示意图;
[0036]图2本发明的证明过程流程图;
[0037]图3本发明中环境结构示意图;
[0038]图4本发明中等式间依赖关系示意图;
[0039]图5本发明中元素和集合的示意图;
[0040]图6本发明中元素和集合的化简示意图;
[0041]图7本发明中元素和集合的另一化简示意图;
[0042]图8本发明中元素和集合的另一化简示意图;
[0043]图9本发明中元素和集合的另一化简示意图;[0044]图10本发明中元素和集合的另一化简示意图;
[0045]图11本发明中元素和集合的另一化简示意图;
[0046]图12本发明的拓扑排序分解证明示意图;
[0047]图13本发明的拓扑排序分解证明另一示意图;
[0048]图14本发明的拓扑排序分解证明另一示意图;
[0049]图15本发明的拓扑排序分解证明另一示意图;
[0050]图16本发明的拓扑排序分解证明另一示意图。
【具体实施方式】
[0051]由于Lustre是同步数据流语言,是在无限周期中进行计算,具有复杂多变的时钟演算和计算历史流数据的时态运算,其程序与C程序差异太大,直接将其翻译到C,转换过程十分复杂,验证起来也会非常困难,本发明将整个转换过程分为多步执行,每一步只做一个类型的化简,并将其化简的结果称之为中间语言,保持每步之间的相互独立,便于协作开发和提高效率,同时也简化了形式化验证的难度。
[0052]如图1所示,101、本发明的基于形式化验证的同步数据流程序的可信排序方法,包括Lustre并行程序和由Lustre并行程序排序后得到的串行C程序;
[0053]如图2所示,102、将源Lustre程序利用词法语法分析工具进行分析,得到该Lustre程序的抽象语法树,利用基于形式化方法的验证工具Coq对所得抽象语法树进行类型分析和静态语义检查,得到符合well-typed条件的抽象语法树Lustre-W ;
[0054]本发明中对于Lustre语言的词法语法分析采用行业认可的词法语法分析工具Flex和Bison对Lustre语言进行分析,得到Lustre语言的抽象语法树,由于该步骤相对简单且在现有技术中已经有严格的规则进行约束,故这里没有再进行形式化验证。
[0055]Lustre程序的抽象语法树分为:programS、nodeS、equations和exprS四个层次;分别对应程序、节点、等式和表达式;其中
[0056]programs表示整个程序,由类型定义列表、nodeS列表和主node的id三部分组成。程序执行时会通过主node的id定位nodeS列表中的主node,并执行主node。
[0057]nodeS为Lustre程序的程序执行节点,相当于C程序的函数。nodeS主要由node名、输入参数、输出参数、局部变量和equations列表五部分构成。
[0058]equations为等式,由左值列表Ihsl和表达式exprS两部分组成。每个等式都相当于是给一个或者多个左值赋值,每个变量最多被赋值一次。
[0059]exprS为表达式,分为:表达式列表、call表达式、一兀操作表达式、二兀操作表达式、时态操作表达式、原子表达式和普通表达式。为简化排序的证明,做排序前已经对时态表达式进行了处理,使得时态表达式的子表达式只能是原子表达式。
[0060]Lustre程序的抽象语法树构建在形式化验证和开发工具Coq中,现有技术中已经用形式化语言实现了对其形式化的描述,在此不再赘述。
[0061]对生成的语法树,在Coq中进行静态检查,检查的内容分为两部分,一是检查语法树中的类型,以得到Well-typed的抽象语法树Lustre-W,并证明整个过程;二是检查后续翻译证明中所需的性质是否得到满足,并证明这些性质。
[0062]Coq静态语义检查中通过分析node列表中不存在依赖环,证明node列表在拓扑排序前后相互是同一个排列,其证明过程包括如下步骤:
[0063](I)首先证明拓扑排序前后的Lustre程序中“入度为零”的node名都是同一个排列;
[0064](2)然后证明拓扑排序前后的Lustre程序中具有依赖关系的node名都是同一个排列;
[0065](3)最后证明将上述两种结构合并到一起后的node列表的全局环境和局部环境与拓扑排序前相互是一个排列。
[0066]具体的实例如下:
[0067]
Theorem toposort cqs pcrmutalion:1oralI (cqs: list equations),
Permutation cqs (toposort_cqs cqs).Theorem loposorl nodcs pcrmulalion: forall (1: list nodeS),

Permutation I (loposort_nodcs I).[0068]这一部分主要利用Coq库中List数据结构有关Permutation和map的基本性质来证明,因为排序的过程是多个步骤的嵌套,直接进行归纳证明比较难,而利用List的性质可以化简排序的步骤,简化证明。证明过程惟一的难点在于证明对依赖关系的排序前后是个排列,因为不能直接对依赖关系列表作归纳来证明,需要先对辅助参数Ien做elim归纳,再对依赖关系列表1作归纳。
[0069]Theorem toposort_depList_permutation:forall(len:nat)(1: list dependT),
[0070]length K=Ien —
[0071]Permutation I(toposort_depList Ien I).[0072]其中,Permutation I是Coq库中List数据库提供的相关定义。
[0073]103、对Lustre-W中所有变量的时钟周期进行归一化处理,使所有变量的时钟周期统一于标准周期;
[0074]由于Lustre语言是同步数据流语言,程序在无穷周期中执行。每个变量都有一个时钟,在无穷周期中为一个无限时钟流。时钟在每个周期中的值为VtrueL或VfalseL,变量在时钟的值为VtrueL时才有值。这种复杂的时钟如果带入后续验证步骤,不但使后续的语义变得非常复杂,还将使后续证明难度增大。本发明先将携带普通时钟的Lustre-W程序经过翻译转换成只携带全局基本时钟(每个周期时钟都为VtrueL)的Lustre-K程序,以有效简化后续的翻译和验证工作。其具体作法是,根据时钟的长度I秒、2秒、3秒……,最终
以基本时钟为标准,一般是最快的时钟作为标准,如以I秒为标准,而2秒、3秒......则被分
成相应的多个1秒,经过化简后,全局时钟每个周期都是VtureL,程序中每个周期都进行运算,因此时钟归一化后的程序已不需要时钟的概念,可大大简化后续证明的难度。
[0075]104、对归一化后的Lustre-W进行因果分析和拓扑排序、翻译后生成串行C程序;
[0076]Lustre程序是并发执行的,所以将其翻译到C程序之前先要对wel 1-typedLustre-W进行因果分析和拓扑排序,以将其串行化,最后再对整个过程进行可信的形式化证明。拓扑排序的过程是指在任意两个满足拓扑排序的程序执行等价。而C语言需要的是一个经过分析变量之间的依赖关系的串行程序,通过对Lustre程序的中各node之间的依赖关系分析,根据设定的标准,按不同node之间依赖关系的大小进行排序,其中入度为零的无依赖关系的node放置在程序的前面。在符合拓扑排序关系定义的情况下,无依赖关系的node列表满足拓扑排序关系;如果一个node的依赖关系不依赖自身以及后续所有的依赖关系列表,且后续的依赖关系列表满足拓扑排序关系,那么这个node和具有依赖关系的node列表之间也满足拓扑排序的关系。
[0077]在证明过程中,先证明经过因果分析检查的程序的依赖关系列表中不存在环,再证明无环的依赖关系列表满足拓扑排序的定义。如图4所示,如果依赖关系Dl的右值的id列表存在于依赖关系D2的左值的id列表中,说明Dl依赖D2,然后递归的定义拓扑排序的关系。图4中是否存在从依赖关系X到y的依赖路径,如果X依赖于I中的第一个元素,I中的每一个元素又依赖于其后续的元素,I的最后一个元素又依赖y,则存在依赖路径;只要整条路径中有一个元素不依赖于其后续的元素,则不存在依赖路径。依赖路径主要是用于表示拓扑关系图中的一条路径,存在路径,就是在图中从X到I有通路I。相应程序代码如下:
[0078]
【权利要求】
1.一种基于形式化验证的同步数据流程序的可信排序方法,包括Lustre并行程序和由Lustre并行程序排序后得到的串行C程序,其特征在于,包括如下步骤: 步骤1、将源Lustre程序利用词法语法分析工具进行分析,得到该Lustre程序的抽象语法树,利用基于形式化方法的验证工具Coq对所得抽象语法树进行类型分析和静态语义检查,得到符合well-typed条件的抽象语法树Lustre-W ; 步骤2、对Lustre-W中所有变量的时钟周期进行归一化处理,使所有变量的时钟周期统一于标准周期; 步骤3、对归一化后的Lustre-W进行因果分析和拓扑排序、翻译后生成串行C程序; 步骤4、对任意两个满足拓扑排序的Lustre程序,证明其拓扑排序前的Lustre程序和拓扑排序后的Lustre程序执行语义等价,验证过程如下: (1)首先建立Lustre并行程序中存储node名称的全局环境和存储各node函数执行周期中变量的局部环境,同时确保全局环境中node的名称不重复和局部环境中等式左值ID不为空; (2)建立一个与验证程序A的全局环境相同且与验证程序B的局部环境相同的验证程序C ; (3)利用验证程序A和验证程序C中node名一一对应的方式,可得到两者执行后语义等价的结果; (4)以验证程序C为基 础,以仅有一步为区别的方式细化出中间验证程序Cl、C2、C3……Cn,其中验证程序Cn与验证程序B仅有一步区别,对比两个程序执行后其局部环境的值可得到两者语义执行是否等价的结果,再依次反推直至得到验证程序C和验证程序B之间语义执行是否等价的结论; (5)结合(3)和(4)的结果,得到拓扑排序前的Lustre程序和拓扑排序后的Lustre程序执行语义等价的结论; 步骤5、由此得到Lustre程序和其经过因果分析和拓扑排序后生成的C程序在执行语义上是等价的证明。
2.如权利要求1所述的可信排序方法,其特征在于,在步骤I的Coq静态语义检查中,通过分析node列表中不存在依赖环能够证明node列表在拓扑排序前后相互是同一个排列,其证明过程包括如下步骤: (O首先证明拓扑排序前后的Lustre程序中“入度为零”的node名都是同一个排列; (2)然后证明拓扑排序前后的Lustre程序中具有依赖关系的node名都是同一个排列; (3)最后证明将上述两种结构合并到一起后的node列表的全局环境和局部环境与拓扑排序前相互是一个排列。
3.如权利要求1所述的可信排序方法,其特征在于,所述步骤2中的归一化处理是指,将所有不同长度的时钟周期按其中最快的时钟周期为单位进行拆分,然后按进行周期划分所有的变量。
4.如权利要求1所述的可信排序方法,其特征在于,所述步骤4的(4)中,所述验证程序Cn与验证程序B仅有一步区别包括四种类型: (I)这个区别点是主node;(2)这个区别点不是主node; (3)区别点是主node时,执行的两个主node不相等,即两个主节点的等式列表互相是一个排序,但其他信息相同; (4)区别点是主node时,两个主node所处的主节点位置不同,且两个主节点的全局环境也不同; 针对上述区别,再次对其化简,使最终的区别点统一为:不同主node下两个不相依赖的等式。
5.如权利要求4所述的可信排序方法,其特征在于,两个不依赖的等式根据其中是否有call表达式,分为下面三种情况分别进行证明: (1)两个等式中都没有call表达式; (2)两个等式中有一个有call表达式; (3)两个等式都有 call表 达式。
【文档编号】G06F21/12GK103646194SQ201310631729
【公开日】2014年3月19日 申请日期:2013年11月29日 优先权日:2013年11月29日
【发明者】张雁, 杨晨, 任保华, 张智慧 申请人:北京广利核系统工程有限公司, 中国广核集团有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1