CN112817599B - 软件函数形式语义及形式化证明脚本自动生成方法 - Google Patents
软件函数形式语义及形式化证明脚本自动生成方法 Download PDFInfo
- Publication number
- CN112817599B CN112817599B CN202110114974.2A CN202110114974A CN112817599B CN 112817599 B CN112817599 B CN 112817599B CN 202110114974 A CN202110114974 A CN 202110114974A CN 112817599 B CN112817599 B CN 112817599B
- Authority
- CN
- China
- Prior art keywords
- state
- instruction
- execution
- expression
- assembly
- 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
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/51—Source to source
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种软件函数形式语义及形式化证明脚本自动生成方法,包括:对汇编指令执行后的新系统状态进行构建,使经过指令执行后的新系统状态的每个状态分量均由初始系统状态的状态分量表示;构建所有汇编指令的形式语义函数库;记录在构建被改变状态分量值的表达式树用到的指令语义函数和子路径语义函数,以及表达式化简中用到的化简规则和子路径语义证明定理,自动生成指令执行后新状态的形式语义和相应的形式化证明脚本。本发明能够对输入的微内核操作系统中的一个函数生成汇编代码、生成该汇编代码对应的若干条执行路径信息、对每条执行路径生成相应的形式语义和形式化证明脚本,最终生成自动生成函数的形式语义和形式化证明脚本。
Description
技术领域
本发明涉及软件的形式化证明自动化技术领域,具体而言涉及一种软件函数形式语义及形式化证明脚本自动生成方法。
背景技术
软件开发的快速发展形成了对于软件的功能设计越来越复杂化的局面,而隐藏在复杂问题背后的正确性问题、可行性问题、安全性问题也越来越引起人们的关注。实际上仍然及大地困扰着软件工作者。形式化方法以基于数理逻辑的推理证明系统,采用了严格的数学证明,对计算机程序的行为进行了建模,规约,分析,推理和验证,从而严格保证了计算机系统的正确性和安全性,使得形式化方法在各行各业涉及高度安全保障的行业得到了广泛的应用。
软件的形式化工作最大的问题之一就是人工耗费极大,极大地影响了形式化方法的应用。形式化的工作量往往是通常软件开发的十倍、百倍甚至更多。正因为如此,极大地影响了形式化方法在产业界的应用,因此也影响了在学术界的研究热情。
目前亟需一种方法,能够对诸如微内核操作系统的形式化证明过程部分或全部进行自动化处理的方法。利用这个方法,开发一个软件,对于一个软件代码中的一个函数,利用软件自动生成函数的形式语义和相应的证明脚本。减少前述形式化工作的繁琐程度和工作量,使得形式化方法可以在工业界得到更加广泛的应用。但是,为此需要解决以下的技术难题:
第一,软件程序有顺序、循环、分支三种基本结构,它们之间可以相互嵌套,目前的基本都是人工直接进行形式化的分析处理和建立证明过程。如果能将一般的程序转化成“规范的执行路径”,对这样的执行路径可以自动生成形式语义和证明脚本,就可以解决这样的问题。
第二,要表示软件的形式语义,就要要表示一个系统的状态。核心的问题是表示软件所有的在内存中的数据对象的当前的数值。简单的办是用内存地址到该地址空间上的值的映射表示。但是当前所有的软件中都包含8位、16位、32位、64位占用不同空间大小数据类型。如果把状态表示成每个字节映射到这个字节的数值的映射,理论是对的,在实际操作上非常困难,要处理很多复杂的类型转换,处理很多不同类型的地址,用此方法表示的数据对象值的表达式人也很难读懂,难以自动计算状态的转换,因此意义不大。因此合理的选择状态表示方法是很重要的。
第三,执行路径的形式语义建立和证明脚本生成涉及到软件运行时刻的环境,涉及到状态转换,涉及到推理的规则和定理等,只要把这些因素分类标准化处理,才能实现形式化方法的自动化。
发明内容
本发明针对现有技术中的不足,提供一种软件函数形式语义及形式化证明脚本自动生成方法,能够对输入的微内核操作系统中的一个函数生成汇编代码、生成该汇编代码对应的若干条执行路径信息、对每条执行路径生成相应的形式语义和形式化证明脚本,最终生成自动生成函数的形式语义和形式化证明脚本。
为实现上述目的,本发明采用以下技术方案:
一种软件函数形式语义及形式化证明脚本自动生成方法,所述自动生成方法包括以下步骤:
S1,编译软件函数的源代码生成汇编代码,将汇编代码分解成若干条没有分支结构和循环结构的执行路径,这些执行路径的语义的综合就是软件函数的语义;
S2,构建执行平台的指令系统中所有汇编指令的形式语义函数库,顺序分析处理每条执行路径上的所有汇编指令,依次建立由从执行路径第一条执行指令到当前执行指令的路径前段构成的子路径的语义函数;
其中,在每个执行路径对应的初始系统状态确定后,通过标准化系统新状态的构建过程,对汇编指令执行后的新状态进行自动构建,将指令执行后的新系统状态的每个状态分量均表示为初始系统状态的状态分量的表达式,再对系统新状态的表达式树进行化简处理;
S3,在分析处理当前执行指令时,记录在构建被改变状态分量值的表达式树用到的指令语义函数和子路径语义函数,以及表达式化简中用到的化简规则和子路径语义证明定理,利用这些元素自动生成指令执行后新状态的形式语义和相应的形式化证明脚本。
为优化上述技术方案,采取的具体措施还包括:
进一步地,步骤S1中,所述编译软件函数的源代码生成汇编代码,将汇编代码分解成若干条没有分支结构和循环结构的执行路径的过程包括以下步骤:
S11,将输入的软件函数通过编译生成与该软件函数代码块对应的汇编指令序列;
S12,针对步骤S11生成的汇编指令序列,识别出所有独立的或者嵌套的循环结构;
S13,针对步骤S12得到的去除循环结构的汇编指令序列,识别出所有独立的分支结构或者嵌套的分支结构,生成若干条没有分支结构和循环结构的汇编指令执行路径。
进一步地,所述汇编指令执行后系统新状态的系统状态表示方法和内存访问表示方法为:
将系统状态划分成寄存器、栈、非栈内存的状态:寄存器组,在状态中表示成一个机器字类型的整数数组;栈空间,在状态中表示成栈空间字对齐地址到机器字型的整数类型的映射;非栈内存定义成机器字对齐的内存地址到机器字型的整数类型的映射;所有的内存访问指令都统一地表示成字对齐地址的内存访问和字节类型整数的列表操作;
用前缀表达式存储系统状态分量的值,简化利用当前状态分量值的表达式自动构建汇编指令的目标操作数新值的表达式的方法,简化目标操作数新值的表达式的化简方法。
进一步地,步骤S2中,所述对汇编指令执行后的新状态进行自动构建的过程包括以下步骤:
S21,针对指令系统所有的指令建立指令的形式语义,它的形式是状态中目标操作数和指令指针寄存器等值的分量改变,其余分量不变;被改变的状态分量值的表达式由原状态分量构成的表达式树表示,其中原状态分量在表示式树中作为单一节点出现,与其具体的数值无关,与指令出现的位置无关;
S22,将步骤S21中被改变的状态分量值表达式中原状态分量单一节点替换成该原状态分量值表达式,使经过指令执行后的新状态的每个状态分量都采用初始状态的状态分量表示。
进一步地,步骤S22中,以子孙节点优先替换为约束进行替换。
进一步地,步骤S2中,所述对系统新状态的表达式树进行化简处理的过程包括以下步骤:
对表达式子树进行数值计算以使其化简为单一的数值节点,使表达式化简成内存字读取和选择字节读取或选择字节改写一次操作的简单表达式。
进一步地,步骤S21中,所述被改变的状态分量值的表达式由原状态分量构成的表达式树表示的过程包括以下步骤:
S211,设执行路径为i1,i2,…,in-1,in,初始状态为S0,操作数的格式是:v(rb,ir,scl)或r或c,其中v是直接寻址地址,rb是基址寄存器,ir是索引寄存器,scl是索引对象长度;
S212,设当前执行的指令是ik,状态是Sk-1,ik执行时,两个操作数中的元素v、scl和c是地址常数或数值常数跟状态无关,rb、ir和r是Sk-1状态下的一个寄存器的值,分别表示成Sk-1(rb)、Sk-1(ir)和Sk-1(r);
S213,指令ik执行后,系统状态Sk-1中的目标操作数分量被改变,目标操作x表示为:
x=f(v0,Sk-1(rb0),Sk-1(ib0),r0,c0,v1,Sk-1(rb1),Sk-1(ib1),r1,c1)
其中下标0表示源操作数的元素,下标1表示目标操作数的元素,f(·)的值是有它的参数构成的表达式;
S214,用表达式树记录目标操作x,用状态Sk-1下的相应的表达式树替换目标操作x对应的表达式树中的相应的节点,使指令ik执行前的状态Sk-1的每个分量都是S0状态下的分量构成的表达式树。
本发明的有益效果是:
(1)能够对输入的微内核操作系统对应的汇编代码进行去循环结构和去分支结构处理,结合处理结果自动生成对应的形式语义及形式化证明脚本。
(2)采用表达式树替换法,避免不同状态下的分量变多带来的表达式的难理解和难执行性。
(3)基于子孙节点优先的替换规则的替换算法对表达式树中的表达式子树进行化简处理,提高表达式的可读性。
附图说明
图1是本发明的汇编代码形式语义及形式化证明脚本自动生成方法流程图。
图2是本发明的汇编代码包含的循环结构的示例图。
图3是本发明的其中一种表达式树的结构示意图。
图4是本发明的经化简处理前的表达式树的结构示意图。
图5是本发明的经化简处理后的表达式树的结构示意图。
图6是Minix 3.0进程调度函数sched(rp,queue,front)一条路径中一条指令(31.0x9f6_0x9f8:movzbl dl,0x71(EAX))的处理后输出的指令语义函数、路径语义函数、指令执行后系统的新状态和证明过程示意图。
具体实施方式
现在结合附图对本发明作进一步详细的说明。
需要注意的是,发明中所引用的如“上”、“下”、“左”、“右”、“前”、“后”等的用语,亦仅为便于叙述的明了,而非用以限定本发明可实施的范围,其相对关系的改变或调整,在无实质变更技术内容下,当亦视为本发明可实施的范畴。
首先对本发明涉及到的术语进行汇总解释:
条件表达式判断块:分支结构中都会或者简单或者复杂一些的条件表达式用于决定分支走向。这个条件表达式判断块具有“依次数据提取、数据比较和条件跳转指令”指令块特征,可以用来区别跳转语句是条件表达式内部的跳转指令还是分支结构块的内部分界的跳转语句。
条件表达式计算指令块:若干顺序执行的指令,或者由若干组顺序执行的指令块组成,每个顺序执行的指令块的最后一条指令时向高地址方向并且这个高地址是这组顺序执行的指令块的某一块的第一条指令的地址跳转;
顺序执行块:由顺序执行的汇编指令序列。
简单执行路径:由顺序执行块、顺序执行块的有限次重复的指令序列、条件表达式计算指令块等组成的汇编指令序列。
系统状态空间:软件系统的工作集构成的向量空间。
系统状态:软件系统工作集中所有的对象的当前值构成的向量
系统状态分量:系统状态中某个指定的对象的值。
前缀表达式:将运算符写在前面,操作数依次写在后面没有括号的序列。
指令形式语义函数:将一条汇编指令执行后的每一个系统状态分量都用指令执行前的系统状态分量的表达式表示的状态间的映射。
路径形式语义函数:将一条汇编指令执行路径上所有指令依次执行后的每一个系统状态分量都用指令执行前的系统状态分量的表达式表示的状态间的映射。
结合图1,本发明提及一种软件函数形式语义及形式化证明脚本自动生成方法,所述自动生成方法包括以下步骤:
S1,编译软件函数的源代码生成汇编代码,将汇编代码分解成若干条没有分支结构和循环结构的执行路径,这些执行路径的语义的综合就是软件函数的语义。
S2,构建执行平台的指令系统中所有汇编指令的形式语义函数库,顺序分析处理每条执行路径上的所有汇编指令,依次建立由从执行路径第一条执行指令到当前执行指令的路径前段构成的子路径的语义函数。
其中,在每个执行路径对应的初始系统状态确定后,通过标准化系统新状态的构建过程,对汇编指令执行后的新状态进行自动构建,将指令执行后的新系统状态的每个状态分量均表示为初始系统状态的状态分量的表达式,再对系统新状态的表达式树进行化简处理。
S3,在分析处理当前执行指令时,记录在构建被改变状态分量值的表达式树用到的指令语义函数和子路径语义函数,以及表达式化简中用到的化简规则和子路径语义证明定理,利用这些元素自动生成指令执行后新状态的形式语义和相应的形式化证明脚本。
下面结合具体例子对本发明所提及的自动生成方法做详细阐述。
以下述的汇编代码minix3.0 pick_proc()代码为例。
minix3.0 pick_proc()代码
第一步,识别出循环结构。编写程序递归地识别出代码中所有独立的循环结构或者嵌套的循环结构。对每一个循环结构识别出循环变量初始化块与跳转指令,循环体,循环终止条件计算与跳转块。
对于上述的汇编代码minix3.0 pick_proc()代码进行分析,由指令6的前向跳转到21-22,22反向跳转到7,得到一个循环结构:6:是循环变量初始化和跳转至条件计算块,此例变量初始化为空;7-20是循环体;21-22是条件计算与条件跳转块。
继续对循环体7-20递归分析循环结构,没有再发现循环结构。
结合图2,假设循环结构包括do-while、while、for循环三种。通过递归的方法可以识别出所有的嵌套的循环结构。循环体的执行顺序可以表示成:{循环变量赋初值}k{条件计算;}n{循环体;条件计算;}m,n=0|1,k=0|1,n+k≤1,n+m>0,其中{指令序列}i表示指令序列的i次执行,m的值取决于循环体的循环终止条件,对于在线性表或者数组上遍历的循环m小于等于线性表的长度,也取决于前置条件。
第二步,识别出分支结构。对经过循环结构识别处理过的汇编指令序列,编写程序自动分析识别出所有独立的或者嵌套的分支结构,将汇编代码分解成如干条执行路径,内核的函数在被调用时的执行路径必然是这些路径中的一条。经过循环结构识别处理后生成的若干条执行路径具有以下的特征:路径中还有循环结构,循环结构也可能会嵌套,但是每个循环结构为:已经标记出了0条或者多条循环变量初始化指令和跳转到循环条件块的指令;循环体;循环条件计算块和条件跳转语句构成汇编指令块。
对于上述的汇编代码minix3.0 pick_proc()代码进行分析,得到以下特征:
指令10条件跳转到20,由此追溯到指令19的test指令依赖操作数ebx;
指令20的前一条指令19不是跳转语句;
分析以上特征后可以确定7-20是一个“if(b)B;”形式的分支结构,其中9-10是分支条件计算块b,11-19是分支执行块B。
递归地分析我们又可以看到11-19是一个被嵌套的“if(b)B;”类型的分支结构,其中11—17是条件计算块,18-19是分支执行块。
第三步,定义系统状态。
本发明的自动生成一条汇编指令执行后系统新状态的系统状态表示和内存访问表示方法包括以下要点:
(1)将一个软件的函数运行时的数据对象分成:寄存器组,在状态中表示成一个字类型整数数组;栈空间,在状态中表示成栈空间地址到整数类型的映射;非栈的内存变量,在状态中表示成内存地址空间到整数集的映射。
(2)为了表示字节对象和双字节对象的读写,将4个字节的字映射到一个4个元素的列表,一个4个字节的字W对应的列表表示成:W8L W,最高位到最低位分别指定为列表的第0、1、2、3个元素,它们分别表示成W8L W!0、W8L W!1、W8L W!2、W8L W!3。一个字W的第i个元素被修改成a,表示成(W8L W)[i:=a];紧接着读取这个字的第j个字节表示成((W8L W)[i:=a])!j。
其中一种系统状态的例子如下:
record REG=
EAX::word32
EBX::word32
....................
第四步,定义指令形式语义函数自动生成指令路径形式语义函数计算汇编执行路径的状态更新定理。
自动生成汇编指令形式语义和自动构建指令执行后系统新状态的方法包括以下步骤:
S31,为了便于自动化构建汇编指令执行后新状态的构建,将新状态的构建分解成可标准化的两个步骤:
S311,对指令系统所有的指令,建立指令的形式语义,它的形式是状态中目标操作数和指令指针寄存器等值的分量改变,其余分量不变。被改变的状态分量值的表达式由原状态分量构成的表达式树表示,其中原状态分量在表示式树中作为单一节点出现,与其具体的数值无关,因而与指令出现的位置无关,便于在自动化的语义构建过程中被引用。
S312,将S311中被改变的状态分量值表达式中原状态分量单一节点替换成该原状态分量值表达式,通过这样的方法,只要指令执行前的状态分量都是有初始状态的状态分量的表达式表示的,这经过指令执行后的新状态的每个状态分量也都是有初始状态的状态分量表示了。
S32,在S312步骤中对对S311构建的被改变的状态分量还值表达式树中原状态分量单一节点替换过程中,实施子孙节点优先替换的原则,否则构建的新表达式树可能会是错误的。
S33,对经过S32的替换后得到的被改变分量的新表达式树进行化简,化简包括数值计算表达式子树化简为单一的数值节点;由于经过内存字读取+改写字中字节+再次读取内存字+选择读取字中字节等系列操作后,被改变的状态分量值的表达式会非常复杂,即使输出后人也难以读懂,针对这种情况给出将这种情况的表达式化简成内存字读取和选择字节读取或选择字节改写一次操作的简单表达式,解决输出结果的人可读性问题和状态转换的可持续性问题。
例如,为了便于自动化构建汇编指令执行后新状态的构建,将新状态的构建分解成可标准化的两个步骤:
S311,对指令系统所有的指令,建立指令的形式语义。
假定状态空间S由分量{x_1,x_2,…,x_n}组成,表示为(x_1,x_2,…,x_n),假定指令inst改变了状态分量x_k1,x_k2:
x_k1=f_k1(x_1,…,x_n),x_k2=f_k2(x_1,…,x_n)
其中f_k1(x_1,…,x_n)和f_k2(x_1,…,x_n)是由x_1,x_2,…,x_n由组成的表达式,指令inst的形式语义函数表示成:
inst S=S(k1:=f_k1(x_1,…,x_n),k2:=f_k2(x_1,…,x_n))。
S312,自动计算执行路径的形式语义。
假定有汇编指令序列:i_1,i_2,…,i_k,...,i_n,
初始状态为S_0=(xe_0_1,…,xe_0_n),
执行了指令i_1,i_2,…,i_k-1后状态变成S_k-1=(xe_k-1_1,…,xe_k-1_n),
其中xe_k-1_j是由xe_0_1,…,xe_0_n构成的表达式,j=1,2,…,n,
再假定指令i_k改变了状态分量x_k1,x_k2,形式语义函数为:
i_k S=S(x_k1:=f_k_k1(x_1,…,x_n),x_k2:=f_k2(x_1,…,x_n))
将上式中其中f_k_k1(x_1,…,x_n),由x_1,x_2,…,x_n构成的表达式,
指令i_k的语义函数表示成:
i_k S=S(k1:=f_k_k1(x_1,…,x_n),k2:=f_k2(x_1,…,x_n))
路径i_1,i_2,…,i_k(该路径记为L_k)的指令函数为:
L_k S=S(x_1:=xe_k-1_1,
x_2:=xe_k-1_2,
…
x_k1-1:=xe_k-1_k1-1,
x_k1:=f_k_k1(xe_k-1_1,…,xe_k-1_n),
x_k1+1:=xe_k-1_k1+1,
…
x_k2-1:=xe_k-1_k2-1,
x_k1:=f_k_k1(xe_k-1_1,…,xe_k-1_n),
…
x_n:=xe_k-1_1
)
S32,在S312步骤中对对S311构建的被改变的状态分量还值表达式树中原状态分量单一节点替换过程中,实施子孙节点优先替换的原则。
在S312中所述的路径L_k的形式语义构造中,主要的一步是将指令i_k的形式语义函数i_k S=S(x_k1:=f_k_k1(x_1,…,x_n),x_k2:=f_k2(x_1,…,x_n))中的的变量x_1,…,x_n分别替换为表达式xe_k-1_1,…,xe_k-1_n。替换过程是逐步替换,替换的次序以子孙节点优先替换的次序。
S33,对经过S32的替换后得到的被改变分量的新表达式树进行化简,化简包括数值计算表达式子树化简为单一的数值节点;由于经过内存字读取+改写字中字节+再次读取内存字+选择读取字中字节等系列操作后,被改变的状态分量值的表达式会非常复杂,即使输出后人也难以读懂,针对这种情况给出将这种情况的表达式化简成内存字读取和选择字节读取或选择字节改写一次操作的简单表达式,解决输出结果的人可读性问题和状态转换的可持续性问题。
具体的,设有执行路径i1,i2,…,in-1,in,初始状态为S0。
(一)状态更新
一条汇编指令包括指令助记符,源操作数和目标操作数。一个操作数的格式是:
v(rb,ib,scl)或r或c
其中v是直接寻址地址,rb是基址寄存器,ib是索引寄存器,scl是索引对象长度。
假定当前执行的指令是ik,状态是Sk-1,ik执行时,两个操作数中的元素v、scl和c是地址常数或数值常数跟状态无关,rb、ib和r是Sk-1状态下的一个寄存器的值,分别表示成Sk-1(rb)、Sk-1(ib)和Sk-1(r)。
指令ik执行后,系统状态Sk-1中的目标操作数分量被改变,目标操作(记为x)可以表示为:
x=f(v0,Sk-1(rb0),Sk-1(ib0),r0,c0,v1,Sk-1(rb1),Sk-1(ib1),r1,c1) (3-1)
其中下标0表示源操作数的元素,下标1表示目标操作数的元素,f(·)的值是有它的参数构成的表达式。
如果我们不做任何处理,状态Sk的分量可能会有多个状态S0,…,Sk-1的分量的值表示,k越大,这些不同状态下的分量表示会越多,这样的表达式是无法理解的。
为此,我们将(3-1)式用表达式树记录,其中的Sk-1(rb0)等节点用状态Sk-1下的相应的表达式树替换(3-1)式的表达式树中的相应的节点。如果处理每一条指令时都做这样的处理,那么指令ik执行前的状态Sk-1的每个分量都是S0状态下的分量构成的表达式树了,处理指令ik时,替换(3-1)中的Sk-1(rb0)等节点就可以了,因为Sk-1(rb0)等节点的表达式树中只有S0状态下的分量没有其它状态下的分量了。
(二)子孙节点优先的替换规则
假定ii为”mov var(ebx),edx”,指令执行路径执行前的状态是S0,执行路径i1,i2,…,ii-1执行后的状态是Si-1,指令ii执行后的状态是Si,指令形式语义表示为:
Si(edx)=M_Si-1(var+Si-1(ebx)),
Si(eip)=Si-1(eip)+ii_len, (3-2)
Si(x)=Si-1(x),x≠edx,x≠eip
其中Si(x)表示状态Si中分量x的值,M_Si(x)表示在状态Si时,内存地址为x的字的值,ii_len是指令ii的长度。等式右端的表达式树如图3所示,它的前缀表达式数组元素序列是:[M_Si-1,+,var,Si-1(ebx)]。
在上述表达式中,Si状态下的分量的表达式除了常量之外都是Si-1状态下的分量:M_Si-1,Si-1(ebx),这两个分量都应该替换成状态S0的分量的表达式。按照子孙节点优先的规则,首先将Si-1(ebx)替换成S0的分量的表达式(假设是y),然后再将M_Si-1(var+y)替换成S0的分量的表达式。
(三)表达式化简规则
假定ii为“movzbl var(ebx),edx”。该指令的形式语义表示为:
Si(edx)=W32(W8L(M_Si-1(var+Si-1(ebx)))!3) (3-3)
其中W8L(W)表示32位的字按照高位字节在前的次序排列的一个线性表[W3,w2,W1,W0],其中W0是W的低位字节,W3是W的高位字节;W8L W!i的意义为线性表从左到右第i个元素(从0开始编号);W32(b)的意义是以b作为字的最低位字节,其它3个字节填充为0所构成的32位字。为了简化表示起见,这里省去了eip的变化和其它分量不变的表示。
(3-3)式右端的表达式树如图4所示,WS!3的表达式树如图5所示。
图6所示的是Minix 3.0进程调度函数sched(rp,queue,front)一条路径中一条指令(31.0x9f6_0x9f8:movzbl dl,0x71(EAX))的处理后输出的指令语义函数、路径语义函数、指令执行后系统的新状态和证明过程。
该函数有52条指令,图6展示的是路径{1-19,21-35,39-52}上第31条指令的处理结果。
第2行:输出的是便于读者阅读的注释,说明下面的脚本处理的一条汇编指令,包括指令的开始地址和结束地址,指令助记符,源操作数和目标操作数。
第5-15行:根据第2行指令的4项数据,自动生成的语义函数,它表示指令函数g9f6_9f8作用在状态s上,该状态有两个分量发生了变化,一个是地址为0x71(EAX)(形式化地表示为EAX(sR s)+0x70,地址为状态s时EAX寄存器变量的值加上0x70)的变量最低位字节修改为EDX(sR s)(状态s时寄存器EDX的最低位字节)的最低位字节的值。
第16-17行:路径{1-19,21-35,39-52}的前部路径{119,21-30}地址跨越0x999到0x9f5,这个子路径的语义函数被自动定义为F999_9f5,31号指令地址从0x9f5到0x9f8,自动生成的指令形式语义函数名是g9f6_9f8,程序又自动将在路径{1-19,21-30}上加上了指令31后的路径{1-19,21-31}的指令函数名自动定义成F999_9f8。
第19-47行:其中第25-46行表示的是路径函数F999_9f8的语义,就是依次执行了路径{1-19,21-31}上的指令后,系统的状态,其中的s是路径指令开始时系统的状态。第19行是标记的定理名称lemma L999_9f8以备后继引用,第20-24行表示的是系统选择执行路径{1-19,21-31}的条件。第25-46行,表示的是执行指令31后系统的新状态。第47行:是证明脚本,其中L999_9f5是路径{119,21-30}的证明路径语义函数的定理,也就是{1-19,21-31}路径语义函数的语义的证明依据路径{119,21-30}的语义函数的证明定理,以及W8L_W32_8L_MM W8L_W32_8L等化简定理等来证明。这个定理在Isabelle中通过验证,说明自动生成的语义函数、路径函数、推导出来的系统新状态、证明脚本都是正确的。
而自动生成形式语义证明脚本的方法包括以下步骤:
S41,构建所有汇编指令的形式语义函数库。以下是若干指令的形式语义函数的例子。
指令mov ESP,EBP的形式语义函数
指令movzb 0x74(EAX),EDX的形式语义函数的例子:
S42,在分析处理执行路径的汇编指令时,同时建立从路径第1条指令到当前执行指令的路径前段的子路径的语义函数。
从5-15行的指令“movzbl dl,0x71(EAX)”的形式语义函数,指令你修改了地址EAX(sR s)+0x70处内存中一个字的值和寄存器EIP的值。依次用路径{119,21-30}形式语义函数的状态分量EAX(sR s)),sDM s(EAX(sR s)+0x70)的表达式替换“movzbl dl,0x71(EAX)”的形式语义函数中EAX(sR s)),sDM s(EAX(sR s)+0x70)的表达式,用这两个表达式替换路径{119,21-30}形式语义函数的状态分量EAX(sR s)),sDM s(EAX(sR s)+0x70)后构成的状态就是路径{119,21-31}执行后的状态。
S43,在分析处理当前执行指令时,记录在构建被改变状态分量值的表达式树用到指令语义函数、子路径语义函数、表达式化简中用到的化简规则、子路径语义证明定理等,利用这些元素自动生成指令执行后新状态的形式语义和相应的形式化证明脚本。
路径{119,21-30}形式语义函数的证明的定理是L999_9f5,证明路径{119,21-31}形式语义函数的证明依据是在定理是L999_9f5所表示的路径{119,21-30}形式语义函数正确(依据L999_9f5 assms)的基础上,如果20-24行描述的前置条件满足(依据:assms)的情况下,25-46行描述的路径{119,21-31}形式语义函数是通过替换5-15行定义的形式语义函数(依据:by(auto simp:my_def))中当前状态分量后经过化简规则(依据:W8L_W32_8L_MMW8L_W32_8L)后推导出来为25-46行所述。这些依据的搜索都是有程序自动完成的。证明脚本是:
using L999_9f5 assms W8L_W32_8L_MM W8L_W32_8L by(auto simp:my_def)。
以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
Claims (4)
1.一种软件函数形式语义及形式化证明脚本自动生成方法,其特征在于,所述自动生成方法包括以下步骤:
S1,编译软件函数的源代码生成汇编代码,将汇编代码分解成若干条没有分支结构和循环结构的执行路径,这些执行路径的语义的综合就是软件函数的语义;
S2,构建执行平台的指令系统中所有汇编指令的形式语义函数库,顺序分析处理每条执行路径上的所有汇编指令,依次建立由从执行路径第一条执行指令到当前执行指令的路径前段构成的子路径的语义函数;
其中,在每个执行路径对应的初始系统状态确定后,通过标准化系统新状态的构建过程,对汇编指令执行后的新状态进行自动构建,将指令执行后的新系统状态的每个状态分量均表示为初始系统状态的状态分量的表达式,再对系统新状态的表达式树进行化简处理;
S3,在分析处理当前执行指令时,记录在构建被改变状态分量值的表达式树用到的指令语义函数和子路径语义函数,以及表达式化简中用到的化简规则和子路径语义证明定理,利用这些元素自动生成指令执行后新状态的形式语义和相应的形式化证明脚本;
所述对汇编指令执行后的新状态进行自动构建的过程包括以下步骤:
S21,针对指令系统所有的指令建立指令的形式语义,它的形式是状态中目标操作数和指令指针寄存器等值的分量改变,其余分量不变;被改变的状态分量值的表达式由原状态分量构成的表达式树表示,其中原状态分量在表示式树中作为单一节点出现,与其具体的数值无关,与指令出现的位置无关;
S22,将步骤S21中被改变的状态分量值表达式中原状态分量单一节点替换成该原状态分量值表达式,使经过指令执行后的新状态的每个状态分量都采用初始状态的状态分量表示;以子孙节点优先替换为约束进行替换;
所述对系统新状态的表达式树进行化简处理的过程包括以下步骤:
对表达式子树进行数值计算以使其化简为单一的数值节点,使表达式化简成内存字读取和选择字节读取或选择字节改写一次操作的简单表达式。
2.根据权利要求1所述的软件函数形式语义及形式化证明脚本自动生成方法,其特征在于,步骤S1中,所述编译软件函数的源代码生成汇编代码,将汇编代码分解成若干条没有分支结构和循环结构的执行路径的过程包括以下步骤:
S11,将输入的软件函数通过编译生成与该软件函数代码块对应的汇编指令序列;
S12,针对步骤S11生成的汇编指令序列,识别出所有独立的或者嵌套的循环结构;
S13,针对步骤S12得到的去除循环结构的汇编指令序列,识别出所有独立的分支结构或者嵌套的分支结构,生成若干条没有分支结构和循环结构的汇编指令执行路径。
3.根据权利要求1所述的软件函数形式语义及形式化证明脚本自动生成方法,其特征在于,所述汇编指令执行后系统新状态的系统状态表示方法和内存访问表示方法为:
将系统状态划分成寄存器、栈、非栈内存的状态:寄存器组,在状态中表示成一个机器字类型的整数数组;栈空间,在状态中表示成栈空间字对齐地址到机器字型的整数类型的映射;非栈内存定义成机器字对齐的内存地址到机器字型的整数类型的映射;所有的内存访问指令都统一地表示成字对齐地址的内存访问和字节类型整数的列表操作;
用前缀表达式存储系统状态分量的值,简化利用当前状态分量值的表达式自动构建汇编指令的目标操作数新值的表达式的方法,简化目标操作数新值的表达式的化简方法。
4.根据权利要求1所述的软件函数形式语义及形式化证明脚本自动生成方法,其特征在于,步骤S21中,所述被改变的状态分量值的表达式由原状态分量构成的表达式树表示的过程包括以下步骤:
S211,设执行路径为i1,i2,…,in-1,in,初始状态为S0,操作数的格式是:v(rb,ir,scl)或r或c,其中v是直接寻址地址,rb是基址寄存器,ir是索引寄存器,scl是索引对象长度;
S212,设当前执行的指令是ik,状态是Sk-1,ik执行时,两个操作数中的元素v、scl和c是地址常数或数值常数跟状态无关,rb、ir和r是Sk-1状态下的一个寄存器的值,分别表示成Sk-1(rb)、Sk-1(ir)和Sk-1(r);
S213,指令ik执行后,系统状态Sk-1中的目标操作数分量被改变,目标操作x表示为:
x=f(v0,Sk-1(rb0),Sk-1(ib0),r0,c0,v1,Sk-1(rb1),Sk-1(ib1),r1,c1)
其中下标0表示源操作数的元素,下标1表示目标操作数的元素,f(·)的值是由它的参数构成的表达式;
S214,用表达式树记录目标操作x,用状态Sk-1下的相应的表达式树替换目标操作x对应的表达式树中的相应的节点,使指令ik执行前的状态Sk-1的每个分量都是S0状态下的分量构成的表达式树。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110114974.2A CN112817599B (zh) | 2021-01-27 | 2021-01-27 | 软件函数形式语义及形式化证明脚本自动生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110114974.2A CN112817599B (zh) | 2021-01-27 | 2021-01-27 | 软件函数形式语义及形式化证明脚本自动生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112817599A CN112817599A (zh) | 2021-05-18 |
CN112817599B true CN112817599B (zh) | 2023-06-23 |
Family
ID=75860064
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110114974.2A Active CN112817599B (zh) | 2021-01-27 | 2021-01-27 | 软件函数形式语义及形式化证明脚本自动生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112817599B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101315599A (zh) * | 2007-05-29 | 2008-12-03 | 北京航空航天大学 | 源程序相似度检测方法及装置 |
CN109145167A (zh) * | 2018-06-29 | 2019-01-04 | 国网四川省电力公司雅安供电公司 | Icd文件与scd中对应ied的内容差异比较方法 |
CN109766268A (zh) * | 2018-12-17 | 2019-05-17 | 南瑞集团有限公司 | 一种顺序汇编指令程序验证方法与系统 |
CN112119423A (zh) * | 2017-11-28 | 2020-12-22 | 耶鲁大学 | 形式化验证的系统和方法 |
-
2021
- 2021-01-27 CN CN202110114974.2A patent/CN112817599B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101315599A (zh) * | 2007-05-29 | 2008-12-03 | 北京航空航天大学 | 源程序相似度检测方法及装置 |
CN112119423A (zh) * | 2017-11-28 | 2020-12-22 | 耶鲁大学 | 形式化验证的系统和方法 |
CN109145167A (zh) * | 2018-06-29 | 2019-01-04 | 国网四川省电力公司雅安供电公司 | Icd文件与scd中对应ied的内容差异比较方法 |
CN109766268A (zh) * | 2018-12-17 | 2019-05-17 | 南瑞集团有限公司 | 一种顺序汇编指令程序验证方法与系统 |
Non-Patent Citations (3)
Title |
---|
"Formal verification of function blocks applied to IEC 61131-3";Linna Pang 等;《Science of Computer Programming》;第113卷;第149-190页 * |
"在可信编译器设计中实践CompCert编译器的语法分析器形式化验证过程";李凌 等;《计算机科学》;第8-15页 * |
"汇编级顺序语句块的自动形式化规约及其验证";祁龙云 等;《计算机工程》;第64-69,77页 * |
Also Published As
Publication number | Publication date |
---|---|
CN112817599A (zh) | 2021-05-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Burch et al. | Symbolic model checking: 1020 states and beyond | |
US9043774B2 (en) | Systems and methods for information flow analysis | |
Troya Castilla et al. | A rewriting logic semantics for ATL | |
EP0533813B1 (en) | Method for representing scalar data dependencies for an optimizing compiler | |
EP0760129B1 (en) | Instruction creation device | |
US20110145799A1 (en) | Path-sensitive dataflow analysis including path refinement | |
Dams et al. | Shape analysis through predicate abstraction and model checking | |
US10915302B2 (en) | Identification and visualization of associations among code generated from a model and sources that affect code generation | |
Xu et al. | Dsmith: Compiler fuzzing through generative deep learning model with attention | |
WO2020170091A1 (en) | Method and system for using subroutine graphs for formal language processing | |
Holík et al. | Low-level bi-abduction | |
CN112817599B (zh) | 软件函数形式语义及形式化证明脚本自动生成方法 | |
Kähkönen et al. | Testing multithreaded programs with contextual unfoldings and dynamic symbolic execution | |
Blech et al. | A formal correctness proof for code generation from SSA form in Isabelle/HOL | |
JP2008059515A (ja) | プログラム実行過程の表示方法及びシステム並びにプログラム | |
Dixon et al. | Verifying higher-order concurrency with data automata | |
Arndt et al. | Graph-based shape analysis beyond context-freeness | |
Caltais et al. | On the verification of SCOOP programs | |
Ding et al. | Enhanced enumeration techniques for syntax-guided synthesis of bit-vector manipulations | |
Taghdiri | Automating modular program verification by refining specifications | |
CN115879868B (zh) | 一种专家系统与深度学习相融合的智能合约安全审计方法 | |
Fesefeldt et al. | Automated checking and completion of backward confluence for hyperedge replacement grammars | |
CN115185526B (zh) | 一种能够逆向推理的编程语言的编译系统及方法 | |
Marx et al. | The path-wise approach to data flow testing with pointer variables | |
JPH0540780A (ja) | ベクトル化処理方式 |
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 |