一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种应用于针对源代码的运行时形式化验证方法中的验证系统与流程

2022-02-21 04:30:49 来源:中国专利 TAG:


1.本发明属于形式化验证领域,具体涉及一种应用于针对源代码的运行时形式化验证方法中的验证系统。


背景技术:

2.嵌入式系统的安全性是非常重要的,随着计算机科学的发展,越来越多的嵌入式系统渗透到人们的日常生活之中,出行的人们需要乘坐列车、飞机,银行需要对数以亿计的财产进行管理,生病的人需要到医院进行检查,这些都离不开嵌入式系统的支持,它的安全可靠性关系着人民的信息安全、财产安全乃至生命安全。因此如何保证嵌入式系统的安全可靠性,成为其开发的重要问题。测试是目前保证系统安全可靠性运用的最主要的方法,但有限的测试用例无法覆盖软件运行的所有情形。形式化方法的引入,增加了嵌入式系统可靠性的保障,形式化验证主要有两种方法,定理证明和模型检测。定理证明是以演绎推理为基础,通过一系列的推理保证高层规约的正确性,但其证明过程经常需要人工干预,自动化程度比较低,不适合大规模应用。随着系统规模的增大,需要验证的系统模型的状态数也呈指数增大,造成了状态爆炸,这也是其应用与实践的一个主要问题。


技术实现要素:

3.为了克服现有技术的上述缺陷,本发明提出了一种轻量级形式化验证方法——运行时验证,其验证过程基于被监控系统的实际运行过程,一旦程序的行为违反某些性质,能够立即给予提醒或作出反应。本发明运行时验证方法使用ltl线性时态逻辑公式对验证性质进行描述,针对程序或者程序产生的轨迹进行分析。与测试方法相比,本发明运行时验证方法引入了形式化方法,对属性的描述以及对程序的监控方面更具灵活性和可扩展性。本发明将运行时验证方法引入到systemc程序中,可提高其安全可靠性。
4.本发明提出的针对源代码的运行时形式化验证方法,包括以下步骤:
5.步骤一:根据源程序的需求规范,提取源程序所需满足的安全规范,使用ltl线性时态逻辑对安全规范进行刻画,并指定所需参数。具体包括一下步骤:
6.步骤a1:根据对源程序需求规范的分析,提取所需满足的安全规范,使用ltl线性时态逻辑来描述验证性质,得到其逻辑公式;
7.步骤a2:声明源程序中要监测的类,并定义相应的数据结构指向监测变量以及提取变量的时序关系。
8.步骤二:根据步骤一中提取的所述程序所需满足的安全规范以及指定的需参数编写配置文件,包括以下步骤:
9.步骤b1:指定配置文件的输出路径;
10.步骤b2:指定配置文件名称;
11.步骤b3:声明源程序中被监视类;
12.步骤b4:声明指向被监视类的指针,使用该指针可以指向被监视的成员变量;
13.步骤b5:声明被监视变量,并指定监视器中的变量来存储被监视变量的值;
14.步骤b6:声明监视类中监视变量的类型;
15.步骤b7:指定监视器获取监视变量值的时间段;
16.步骤b8:将步骤一中安全规范的ltl线性时态逻辑公式写入配置文件;
17.步骤b9:声明需要包含的头文件。
18.步骤三:根据所述配置文件使用运行时验证工具自动生成相应的监视器文件以及切面类文件,包括以下步骤:
19.步骤c1:运用本项目开发人员编写的工具,读取配置文件;
20.步骤c2:将配置文件中的安全规范的ltl线性时态逻辑公式转换成监视器;
21.步骤c3:将配置文件中的需要监视的变量转换成切片类。
22.步骤四:使用工具将切面类文件置入源程序,生成插桩后的源程序,包括以下步骤:
23.步骤d1:使用插桩工具生成puma.config文件,用于编译器进行预处理,生成代码连接点的知识库;
24.步骤d2:将生成的切面类文件移动到源程序所在的路径下,插桩工具根据知识库中的连接点和切面文件中的切入点将横切关注点代码插入源程序。
25.步骤五:修改仿真内核,使其适用于运行时形式化验证方法,(在整个方法中,此步骤只需进行一次)包括以下步骤:
26.步骤e1:修改内核中的上下文调度函数;
27.步骤e2:修改内核中状态转换函数。
28.步骤六:编译插桩后的源程序和监视器文件并执行,得到运行轨迹,使用监视器对得到的运行轨迹进行验证,包括以下步骤:
29.步骤f1:运行插桩后的源程序,得到运行到当前时刻的运行轨迹;
30.步骤f2:将运行轨迹传输给监视器,通过监视器监视运行轨迹,验证性质。
31.步骤七:根据验证结果判断插桩后的源程序是否满足性质。若不满足性质,对相应的运行轨迹进行记录或者进行程序自动修复;若满足性质,则继续监视程序的运行,包括以下步骤:
32.步骤g1:若验证正确,则继续监视源程序的运行;
33.步骤g2:若该运行轨迹不满足性质,在记录该运行轨迹或采用程序自修复功能,再继续运行。
34.本发明提出的针对源代码的运行时形式化验证方法中,源代码不仅可以是systemc源代码,还可以是c源代码、c 源代码。
35.本发明提出的一种用于针对源代码的运行时形式化验证系统,该系统包括:切面类文件及监视器文件自动生成工具,用户可定义描述系统性质的ltl线性时态逻辑公式以及配置文件,通过该工具自动生成监测程序性质的切面类以及监测程序状态的检测器。通过将修改后的systemc的仿真内核与运用切面类形式的插桩源代码,以及检测器联合编译,形成可运行目标文件,运行该文件,以检测程序的动态执行,实时验证系统的性质。
36.本发明针对源代码的运行时形式化验证方法,根据systemc源程序所需满足的性
质(安全规范),生成相应的切面类文件及监视类文件,使用工具将切面类文件置入源程序,实现了在程序真实运行环境下对程序性质进行实时监测的目的。
37.本发明所述方法,如何提取正确的安全规范是运行时验证中最重要的环节,关系到验证结果的有效性,因此在步骤一中首先要从系统的需求中提取所要满足的安全规范,并使用ltl线性时态逻辑公式对安全规范进行形式化的描述,基于ltl公式产生相应性质的监视器。通过运用本发明运行时验证方法,对源程序进行实时的动态分析,以及时发现程序的错误和缺陷,保证程序的安全可靠性。
38.本发明所述方法可以应用到嵌入式系统形式化验证中,提高系统的安全性、可靠性。当前并没有对systemc程序的运行时验证方面的研究,与传统的形式化验证方法如模型检测、定理证明相比,运行时验证技术是动态验证性质,属于轻量级的形式化验证。因此本发明提供的运行时验证技术是保证系统安全可靠的一种补充,具有很高的实用性。
附图说明
39.图1为本发明针对systemc程序的运行时验证方法的流程示意图。
40.图2为针对systemc程序的运行时验证方法中自运行时验证系统设计图。
41.图3为本发明针对systemc程序的运行时验证方法的工作流程图。
具体实施方式
42.结合以下具体实施例和附图,对本发明作进一步的详细说明。实施本发明的过程、条件、实验方法等,除以下专门提及的内容之外,均为本领域的普遍知识和公知常识,本发明没有特别限制内容。
43.本发明针对源代码的的运行时形式化验证方法主要通过分析系统需求规范,提取通过编写的源程序所需满足的安全性质,并编写相应的配置文件,根据配置文件中明确切面类与监视器输出路径、监测变量、取值阶段、性质表达式、所需头文件等参数,使用生成工具自动化生成切面类及监视器。使用插桩工具将切面类置入源程序,该过程也称为插桩。将插桩完成后的源程序进行编译生成可执行文件,运行源程序。在源程序运行过程中,监视器会根据程序的运行轨迹对验证性质进行监测,若运行过程中发生违反性质的事件,监视器会记录下该运行轨迹,用来对源程序进行修正,若运行过程中验证性质一直满足,则在继续运行的过程中继续监测。
44.如图1所示本发明实施例的针对systemc程序的运行时形式化验证方法的流程图,包括以下步骤:
45.步骤一:根据系统需求分析systemc源程序所需满足的安全规范,使用ltl线性时态逻辑公式描述安全规范。由于系统是根据需求规范开发的,但是需求规范并不能保证开发的软件系统是安全可靠的,所以必须要在需求规范的基础之上提取出保证系统安全可靠性的安全规范。而如何提取正确的安全规范是运行时验证中最重要的环节,关系到验证结果的有效性。因此在步骤一中首先要从系统的需求中提取所要满足的安全规范,并使用ltl线性时态逻辑公式对安全规范进行形式化的描述,基于ltl公式会产生相应的性质监视器。
46.在systemc系统的开发过程中,需要提取的安全规范主要集中在系统功能安全、内存管理、地址访问越界以及指针的安全使用等方面。例如:在经典的生产者消费者程序中,
需要保证消费者每次能够正确完整的读取生产者所产生的字符串。因此需要提取描述正确读取字符串过程的性质,通过ltl线性时态逻辑公式正确刻画性质,以保证程序的正确性。
47.步骤二:编写相应的配置文件。配置文件中包含监视器文件的输出路径、监视器文件名、执行轨迹输出选项、声明需监视的类、定义数据类型及变量值获取时间点以及安全规范的ltl线性时态逻辑表达式。如表1所示,配置文件所需的参数。
48.表1配置文件所需参数
[0049][0050][0051]
表1中的参数并不是所有都要指定,在验证不同程序时可以根据程序所需满足的不同安全规范选择不同的参数指定,以达到合适验证方式的目的。
[0052]
步骤三:根据步骤二编写的配置文件使用切面类及监视器生成工具生成相应切面类文件和验证性质的监视器文件。工具自动化生成切面类文件及监视器文件实现过程采用了基于有限状态自动机的监控器构造方法,首先将被验证的性质规约表示成ltl范式,将该ltl范式转换为一个对应的有限状态自动机,监视器文件为该自动机的具体实现。
[0053]
切面类是基于面向切面编程中的程序组成元素,面向切面编程中的程序包含两个部分,基础代码用于实现系统的核心关注点,即根据需求规范所开发的源程序,另一部分为切面代码,用于实现横切关注点,经过相应的切面语言编译器编译之后,输出组合了核心关注点和横切关注点的目标程序代码。切面类中包含通知,即横切关注点的目标执行动作,通知和切入点之间通常有三种关联关系,第一种是在进入切入点之前执行通知动作,第二种是跳过原切入点执行通知动作,第三种是在离开切入点之后执行通知动作。切入点和通知共同构成了一个关注点的模块,若干个关注点的集合则构成了一个切面。切面通常有和类相似的结构,切入点类似于面向对象中的变量声明,通知类似于面向对象中的方法声明。
[0054]
步骤四:根据步骤三生成的切面类文件及监视器文件使用工具对源程序进行插桩。在插桩之前首先要对在源程序中的切入点进行匹配,切入点是对符合特定条件的一类接入点的抽象化描述,切入点包括代码静态结构中的特定位置或程序执行流程中的特定时
刻,对于面向切面编程(aop)来说,需要在特定的切入点执行特定的通知目标代码,所以要实现切面代码中的切入点和程序中的接入点的匹配。工具首先利用编译器编译源文件生成抽象语法树,在抽象语法树的基础上,根据所支持的切入点种类、所有可能的根据其所支持的切入点种类,找出所有可能的接入点,在知识库中记录接入点的类型,名称,参数,所在文件位置等相关信息,这样在后续的匹配过程中,便可以直接将切入点和知识库进行匹配,这种匹配方式通过知识库避免同一个文件多次匹配带来的重复编译,提高了重用性,然后通过将知识库中的连接点和切面文件中的切入点进行匹配,在匹配的代码位置插入相应的横切关注点代码。在完成对源程序的每个文件插桩后,整个置入过程结束,得到插桩后的源程序。
[0055]
步骤五:修改systemc仿真内核,使其适用于运行时验证,此过程对于基于systemc的运行时验证仅需要做一次。要实现程序的运行时监测,监视器需要实时监控systemc内核状态,要想实现内核状态的监控,一种方法是实现一个返回当前执行内核相关数据的api,另一种方式是修改内核以发送有关信息。在本实施例中选择第二种方法,在函数调用时内核发送状态更新信息,监视器被触发并在到达相关采样点后执行监测。为了尽可能少的添加代码,在内核代码中封装了具有相应功能的新对象observer,observer存储对监视器的引用,接收内核状态的更新,然后通知需要在当前采样点执行的监视器。
[0056]
步骤六:安装systemc类库及仿真内核,使用编译器对插桩后的systemc程序进行编译,生成可执行代码。systemc是基于c 的编程语言,它在c 的基础之上增加了一些重要概念,如并发(多个处理器同时执行)、定时事件和数据类型等概念,systemc还增加了一个由使用合法c 代码编写的函数、数据类型和其他语言结构函数所组成的类库,该类库提供了功能强大的新机制,可以为具有硬件时序、并发和响应行为的系统结构建模。除了增加systemc的类库外,还需要安装仿真内核,基于仿真内核可以编写systemc代码来描述设计或系统规范,并对其进行仿真。因为systemc就是c ,所以可以使用标准的c 编程语言和开发工具,对其进行仿真调试和研究。
[0057]
步骤七:监视器基于systemc模型的运行轨迹来验证源程序是否满足所要求的安全规范。安全规范是通过ltl公式描述的,任意的ltl公式都有一个语言等价的有限状态自动机,这意味着验证运行轨迹是否满足ltl公式的问题可以转化为该序列是否被对应的有限状态自动机接受的问题。因此依据步骤三生成的监视器文件对程序运行轨迹进行验证,该监视器是有限状态自动机的具体实现,其自动机的字母表为程序运行的基本事件,由基本事件组成程序的运行轨迹作为监视器的输入,当运行轨迹一直可以被对应自动机接收时,证明程序满足该性质。若出现轨迹不被接收的情况时证明程序运行轨迹不满足安全规范,根据配置文件里的记录参数对不满足安全规范的路径进行记录。
[0058]
实施例1
[0059]
本具体实施例以生产者消费者程序为例,对其所要满足的安全规范进行运行时验证。对于生产者消费者程序而言,生产者向缓冲区存放数据,消费者从缓冲区读取数据,消费者在读取数据的过程中要保证数据的完整性。在本实施例中生产者向缓冲区内存放字符串,消费者读取字符串,需要满足的安全规范是消费者所读取的字符串是完整的,即程序在运行过程中不能出现只读取部分字符串的情况。
[0060]
本具体实施例中,运用本发明的针对systemc程序运行时验证方法对生产者消费
者程序所需满足的安全规范进行验证,其具体步骤如下:
[0061]
步骤一:分析生产者消费者程序所需满足的安全规范。根据生产者消费者的功能需求,总结出了以下安全规范:消费者必须读取完整字符串,不能出现遗漏字符或读取出错的情况。
[0062]
在安全规范中,使用ltl线性时态逻辑公式对安全规范进行刻画,对于消费者读取字符串的安全规范,首先要明确字符串的首字符,根据字符串长度与内容,限定在一定时间内读取到字符串尾字符,从而保证读取字符串的完整性。
[0063]
步骤二:编写配置文件。
[0064]
第一步:指定监视器文件的输出路径;
[0065]
第二步:指定监视器文件名称;
[0066]
第三步:声明源程序中被监视类,在这里分别是生产者producer类与消费者consumer类;
[0067]
第四步:声明指向被监视类的指针,使用该指针可以指向生产者类与消费者类中被监视的成员变量;
[0068]
第五步:声明被监视变量,并指定监视器中的变量来存储被监视变量的值;
[0069]
第六步:声明监视类中监视变量的类型;
[0070]
第七步:指定监视器获取监视变量值的时间段;
[0071]
第八步:将步骤一中安全规范的ltl线性逻辑表达式写入配置文件;
[0072]
第九步:声明需要包含的头文件,在本实例中为生产者类与消费者类的头文件;
[0073]
配置文件根据不同策略参数会有所不同,用户可根据需求选择不同验证策略。
[0074]
步骤三:根据配置文件使切面类及监视器生成工具自动生成切面类与监视器,命令格式如下:tim-conf path,path为配置文件路径。
[0075]
步骤四:使用ac 工具对生产者消费者源程序进行插桩。使用ac 工具命令对源程序每个文件进行插桩,命令格式如下:
[0076]
ac -c source_home/file name
[0077]-o target_home/file name
[0078]-p source_home/-i source_home
[0079]-i systemc_home/include
[0080]
‑‑
config aspectc_home/puma.config
[0081]
source_home参数为源文件路径,target_home参数为插桩后程序的输出路径,systemc_home参数为systemc类库安装路径,aspectc_home参数为切面类文件路径。
[0082]
步骤五:修改systemc仿真内核,首先新建mon_observer类,定义相关成员变量及成员函数,在sc_simcontext.h头文件中声明mon_observer类,并将其声明为sc_simcontext类的友元类,声明指向mon_observer类的指针observer,在sc_simcontext.cpp文件中,使用指针observer在内核状态变化点调用相应函数。
[0083]
步骤六:安装systemc类库及仿真内核,使用gcc编译生产者消费者源程序,生成可执行文件。
[0084]
步骤七:运行可执行文件,使用监视器监视程序运行情况,最终验证了消费者程序正确读取了字符串。
[0085]
实施例2
[0086]
本具体实施例以alu算术逻辑单元程序为例,对其所要满足的安全规范进行运行时验证。算术逻辑单元程序根据指定操作数以及操作码计算出结果并进行输出,在除法操作中若除数为零,则需要及时发现运算出错的情况。在本实施例中监视器需要监视除法操作中除数值,若出现除数为零的情况,要及时报错,防止导致严重后果。
[0087]
本具体实施例中,运用本发明的针对systemc程序运行时验证方法对alu算术逻辑单元程序所需满足的安全规范进行验证,其具体步骤如下:
[0088]
步骤一:分析算术逻辑单元程序所需满足的安全规范。根据计算要求,总结出了以下安全规范:算术逻辑单元在进行除法操作时,需要及时报错,不能出现误报以及漏报情况。
[0089]
在安全规范中,使用ltl线性时态逻辑公式式对安全规范进行刻画,对于除法操作的安全规范,首先要明确除法操作中存储除数的变量,根据变量内容,当出现为零情况时检查程序状态寄存器的值是否设为为零状态码,从而保证计算过程的正确性。
[0090]
步骤二:编写配置文件。
[0091]
第一步:指定监视器文件的输出路径;
[0092]
第二步:指定监视器文件名称;
[0093]
第三步:声明源程序中被监视类,在这里分别是算术逻辑单元类;
[0094]
第四步:声明指向被监视类的指针,使用该指针可以指向被监视的操作数变量;
[0095]
第五步:声明被监视变量,并指定监视器中的变量来存储被监视变量的值;
[0096]
第六步:声明监视类中监视变量的类型;
[0097]
第七步:指定监视器获取监视变量值的时间段;
[0098]
第八步:将步骤一中安全规范的ltl线性逻辑表达式写入配置文件;
[0099]
第九步:声明需要包含的头文件,在本实例中为定义汇编系统指令的头文件;
[0100]
配置文件根据不同策略参数会有所不同,用户可根据需求选择不同验证策略。
[0101]
步骤三:根据配置文件使切面类及监视器生成工具自动生成切面类与监视器,命令格式如下:tim-conf path,path为配置文件路径。
[0102]
步骤四:使用ac 工具对生产者消费者源程序进行插桩。使用ac 工具命令对源程序每个文件进行插桩,命令格式如下:
[0103]
ac -c source_home/file name
[0104]-o target_home/file name
[0105]-p source_home/-i source_home
[0106]-i systemc_home/include
[0107]
‑‑
config aspectc_home/puma.config
[0108]
source_home参数为源文件路径,target_home参数为插桩后程序的输出路径,systemc_home参数为systemc类库安装路径,aspectc_home参数为切面类文件路径。
[0109]
步骤五:修改systemc仿真内核,首先新建mon_observer类,定义相关成员变量及成员函数,在sc_simcontext.h头文件中声明mon_observer类,并将其声明为sc_simcontext类的友元类,声明指向mon_observer类的指针observer,在sc_simcontext.cpp文件中,使用指针observer在内核状态变化点调用相应函数。
[0110]
步骤六:安装systemc类库及仿真内核,使用gcc编译算术逻辑单元源程序,生成可执行文件。
[0111]
步骤七:运行可执行文件,使用监视器监视程序运行情况,最终验证程序正确处理了除数为零的情况。
[0112]
图2为针对systemc程序的运行时验证方法中自运行时验证系统设计图,在插桩后的systemc源程序运行过程中,当监视的变量发生变化时会生成事件,该事件会被监视器的事件接收器所接收,监视器使用性质验证器对接收到的事件进行验证,判断事件是否违背性质,若事件违背性质(安全规范),则产生相应的反馈如报告程序出错。
[0113]
图3为本发明针对systemc程序的运行时验证方法的工作流程图,首先用户使用线性时序逻辑(ltl)表达式描述系统所需满足的安全规范,同时定义切面类以及文件及监视器文件自动生成工具所需参数编写配置文件,接下来通过配置文件与ltl线性逻辑表达式生成检测程序性质的切面类以及监测程序运行状态的监测器,接下来通过ac 工具将切面类织入源程序,生成插桩后的源程序,最后通过在systemc仿真内核上运行插桩后的源程序实现对程序的运行时验证。
[0114]
本发明的保护内容不局限于以上实施例。在不背离发明构思的精神和范围下,本领域技术人员能够想到的变化和优点都被包括在本发明中,并且以所附的权利要求书为保护范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献