CN109766268B - 一种顺序汇编指令程序验证方法与*** - Google Patents
一种顺序汇编指令程序验证方法与*** Download PDFInfo
- Publication number
- CN109766268B CN109766268B CN201811543051.3A CN201811543051A CN109766268B CN 109766268 B CN109766268 B CN 109766268B CN 201811543051 A CN201811543051 A CN 201811543051A CN 109766268 B CN109766268 B CN 109766268B
- Authority
- CN
- China
- Prior art keywords
- instruction
- program
- state vector
- operand
- semantic
- 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
- 238000000034 method Methods 0.000 title claims abstract description 53
- 239000013598 vector Substances 0.000 claims description 101
- 230000001343 mnemonic effect Effects 0.000 claims description 15
- 238000004590 computer program Methods 0.000 claims description 9
- 230000006698 induction Effects 0.000 abstract description 3
- 238000012795 verification Methods 0.000 abstract description 3
- 238000010586 diagram Methods 0.000 description 10
- 230000006870 function Effects 0.000 description 5
- 238000012545 processing Methods 0.000 description 5
- 102100037060 Forkhead box protein D3 Human genes 0.000 description 2
- 101001029308 Homo sapiens Forkhead box protein D3 Proteins 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种顺序汇编指令程序的验证方法与***,其中方法包括:对每一条汇编指令建立一个语义规则;依次读取每一条汇编指令,获取每一条指令的所有的操作数,并记录每个操作数的地址、操作数的初始数值和长度;对程序的所有指令依次将所有操作数‑的数值规约为它们的初始值的表达式;对于每一条指令按照顺序依次根据相应的指令语义规则,生成相应的证明脚本。本发明方法从比较简单的汇编指令的语义规则、简单的单条汇编指令的语义证明脚本的生成方法出发,利用归纳技术方法得到整个顺序汇编指令程序语义的规约和验证脚本生成的方法,可以大大减少形式化工作的工作量。
Description
技术领域
本发明涉及的是一种顺序汇编指令程序验证方法与***,属于软件工程、形式化方法技术领域。
背景技术
计算机软件由于设计、编码等原因,常常出现错误。通过测试可以发现部分的软件错误,也可以通过采用先进的软件工程技术减少错误的产生。但是,迄今为止,这些方法都不能彻底根除软件错误。利用形式化方法验证软件设计与软件编码之间的一致性,是目前业界公认有可能彻底根除软件错误的一种方法。但是形式化方法非常耗费时间,因此有必要提出一种使形式化工作的工作量大大减少的方法来验证软件设计与编码之间的一致性。
发明内容
本发明所要解决的技术问题是克服形式化证明与验证过程需要耗费大量人力的问题,提供一种顺序汇编指令程序验证方法。
本发明为了达到以上的技术目的,所采用的技术方案如下:
在一个方面,本发明提供了一种顺序汇编指令程序验证方法,包括如下步骤:
建立指令语义规则:对指令***中用汇编语句表示的每一条指令建立一个语义规则;
建立顺序汇编指令程序状态空间:依次获取顺序汇编指令程序中操作数的地址a1,a2,...,aM、长度l1,l2,...,lM和初始数值x1,x2,...,xM;获取的所有操作数的集合作为程序的工作集,程序的工作集中每个操作数都获得一个数值后作为程序的一个状态向量,程序的工作集中所有操作数的初始数值是程序的初始状态向量,所有状态向量构成程序的状态向量空间;
顺序汇编指令程序语义规约:对于程序的每一条指令依次进行语义规约;对于第j条指令,根据指令的指令助记符、源操作数和目标操作数将程序的工作集中所有操作数的值都规约成由程序的初始状态向量表示的新的状态向量,并将新的状态向量记为ej,1,ej,2,……,ej,M,其中j表示指令序号,j取值从1到N,N为指令总数,M表示所有操作数的总数;
语义证明脚本生成:依次对顺序汇编指令程序中的指令根据指令的语义规则、指令执行前的程序的状态向量,生成指令执行后新的状态向量为规约出来的状态向量ej,1,ej,2,……,ej,M的证明脚本。
在以上技术方案中进一步地,建立指令语义规则方法如下:
指令I表达式如下:
指令助记符源操作数,目标操作数
指令执行前的状态向量s0表示为:s0.aj=x0,j,j=1,2,…,M;
指令执行后的状态向量s1表示为:s1·aj=x1,j,j=1,2,…,M;
其中aj程序的工作集中第j个操作数的地址,x0,j表示指令执行前地址为aj的操作数的值,x1,j表示指令执行后地址为aj的操作数的值,M是操作数的总数;
则指令I的语义规则为:
I∧s1→(s1·aj=s0·aj=x0,j,j=1,2,…,M,j≠v)∧s1·av=exp(x0,u,x0,v),其中u和v分别是指令的源操作数与目标操作数的下标;exp(x0,u,x0,v)表示由指令I执行前s0的状态分量x0,u,x0,v构成的表达式,表达式exp是根据指令I的指令助记符确定。
在以上技术方案中进一步地顺序汇编指令程序语义规约的方法如下:
假定程序的第j-1条指令后所有操作数的值已经规约为x1,x2,...,xM的表达式ej-1,1,ej-1,2,……,ej-1,M,第j条指令Ij的语义为:
s1(e+i)=expi(s0(b),...,s0(b+u-1),s0(e),...,s0(e+u-1)),i=0,...,u-1,(1-1)
s1(d)=s0(d),d≠dst,...,d≠dst+u-1, (1-2)
其中b是源操作数地址,e是目标操作数地址;根据操作数的地址和长度,为s0(b),…,s0(b+u-1),s0(e),…,s0(e+u-1)在ej-1,1,ej-12,……,ej-1M找到对应的表达式,用它们取代Ij语义规则中的对应的式子,得到指令Ij执行后s1表示的所有的操作数的值,它们都是初始值x1,x2,...,xM的表达式ej,1,ej,2,…,ej,M。
在以上技术方案中进一步地,语义证明脚本生成方法是:
为程序执行前初始状态向量s0=(x1,x2,...,xM)建立一个表示其特征的谓词公式:Q0(s0)=“a1=x1,...,aM=xM,”;
在第j条指令执行前,程序的状态向量与操作数的初始值的之间的关系用一个逻辑公式Qj-1(s0,sj-1)表示,表达式如下:
sj-1·a1=expj-1,1(x1,x2,...,xM)∧…∧sj-1·aM=expj-1,M(x1,x2,…,xM);
其中expj-1,k(x1,x2,...,xM),k=1,...,M是由x1,x2,...,xM构成的表示式;
指令执行后所有操作数的值用一个逻辑公式Qj(s0,sj)表示,表达式如下:sj·ak=expj,k(x1,x2,...,xM),k=1,2,...,M;
第j条指令执行语义规约要证明的是:
Qj-1(s0,sj-1)∧(sj=Ijsj-1)→Qj(s0,sj);
找到指令的源操作数au和目标操作数av,确定公式(sj=Ijsj-1)中的sj·av=exp(expj-1,u(x1,x2,...,xM),expj-1,v(x1,x2,...,xM)),根据指令Ij的语句规则直接给出命题Qj-1(s0,sj-1)∧(sj=Ijsj-1)→Qj(s0,sj)的证明脚本;
以此类推,证明QN-l(s0,sj-1)∧(sN=INsN-1)→QN(s0,sj);
根据前面证明的命题,给出最终命题Q0(s0)∧(sN=ININ-1…I1s0)→QN(s0,sj)的证明脚本。
进一步地,所述语义规则用于描述将指令执行后***的状态向量s1中指令的目标操作数分量表示成由指令执行前***的状态向量s0中源操作数分量构成的表达式的公式;
在另一个方面,本发明提供了一种顺序汇编指令程序验证***,包括:
指令语义规则建立模块、顺序汇编指令程序状态空间建立模块、汇编指令语义规约模块和语义证明脚本生成模块;
所述指令语义规则建立模块,用于对指令***中用汇编语句表示的每一条指令建立一个语义规则;
顺序汇编指令程序状态空间建立模块,用于建立顺序汇编指令程序状态空间、依次获取顺序汇编指令程序中操作数的地址a1,a2,...,aM、长度l1,l2,...,lM和初始数值x1,x2,...,xM;,获取的所有操作数的集合作为程序的工作集,程序的工作集中每个操作数都获得一个数值后作为程序的一个状态向量,程序的工作集中所有操作数的初始数值是程序的初始状态向量,所有状态向量构成程序的状态向量空间;
所述汇编指令语义规约模块,用于对于程序的每一条指令依次进行语义规约;对于第j条指令,根据指令的指令助记符、源操作数和目标操作数将程序的工作集中所有操作数的值都规约成由程序的初始状态向量表示的新的状态向量,并将新的状态向量记为ej,1,ej,2,……,ej,M,其中j表示指令序号,j取值从1到N,N为指令总数,M表示所有操作数的总数;
所述语义证明脚本生成模块,用于依次对顺序汇编指令程序中的指令根据指令的语义规则、指令执行前的程序的状态向量,生成指令执行后新的状态向量为规约出来的状态向量ej,1,ej,2,……,ej,M的证明脚本。
本发明所达到的有益技术效果:
本发明从比较简单的汇编指令的语义规则、简单的单条汇编指令的语义证明脚本的生成方法出发,利用归纳技术方法得到整个顺序汇编指令程序语义的规约和验证脚本生成的方法;
本发明提出了形式化验证中部分工作的自动化的方法,可以大大减少形式化工作的工作量。
附图说明
图1是本发明具体实施例顺序汇编指令程序验证方法流程图;
图2是本发明具体实施例顺序汇编指令程序验证***结构示意图;
图3是本发明具体实施例顺序汇编指令程序验证***结构示意图。
具体实施方式
下面对本发明作进一步描述。以下实施方式仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
图1是本发明具体实施例顺序汇编指令程序验证方法流程图;图1示出了一种顺序汇编指令程序验方法,包括:
(1)建立指令语义规则:
建立指令语义规则:对指令***中用汇编语句表示的每一条指令建立一个语义规则;
在优选地实施例中建立指令语义规则方法如下:
指令I表达式如下:指令助记符源操作数,目标操作数
指令执行前的状态向量s0表示为:s0·aj=x0,j,j=1,2,…,M;
指令执行后的状态向量s1表示为:s1·aj=xl,j,j=1,2,…,M;
其中aj程序的工作集中第j个操作数的地址,x0,j表示指令执行前地址为aj的操作数的值,x1,j表示指令执行后地址为aj的操作数的值,M是操作数的总数。
指令I的语义规则为:
I∧s1→(s1·aj=s0·aj=x0,j,j=1,2,…,M,j≠v)∧s1·av=exp(x0,u,x0,v)
其中u和v分别是指令的源操作数与目标操作数的下标;exp(x0,u,x0,v)表示由指令I执行前s0的状态分量x0,u,x0,v构成的表达式,表达式exp是根据指令I的指令助记符确定。
这里是针对CPU的指令***中的每条指令设计语义规则,这些规则可以应用于所有的程序。
在本实施中,进一步阐述建立语义规则中涉及到的不同类型的数据对象的地址表示、数据的表示、语义表示中一些函数的表示细节问题,便于实施。
***中的数据对象包括寄存器和存储器,定义***的数据对象集合:CPU寄存器集合r1,r2,...,rp;设备寄存器集合:rp+1,rp+2,...,rp+q;内存地址集合:m1,m2,...,mn。
约定
xb、xs、xl、xq分别表示从地址为x开始的一个字节、二个字节、四个字节、八个字节。(x+i)b、(x+i)s、(x+i)l、(x+i)q分别表示从地址为x+i开始的一个字节、二个字节、四个字节、八个字节。处理器是μ*8位的。
定义
寄存器地址集合:R={rk+i|k=1,2,...,p+d,i=1,...,w,w=cpu字长}
内存单元地址集合:M={m1,m2,...,mn}
存储单元地址集合:D=R∪M
存储单元数值集合:V={0,1,2,...,28-1}
***的一个状态s:D到V的一个函数,即s∈(D→V)
***的状态空间S=(D→V)
约定
sVal、lVal、qVal分别表示{0,...,216-1}、{0,...,232-1}、{0,...,264-1}。s(xb)、s(xs)、s(xl)、s(xq)分别表示:s(x+t-1)·2t-1+…+s(x),t=1,2,4,8。
给定一条汇编指令I:指令助记符源操作数,目标操作数指令I的语义规则定义为状态空间S到状态空间S的一个映射,I∈(S→S),I的定义如下:
假定指令I的操作数为u字节长的,源操作数的地址为b,目标操作数的地址为e,s1=I(s0),s0为指令执行前的状态,s1为指令执行后的状态,
s1(e+i)=expi(s0(b),…,s0(b+u-1),s0(e),…,s0(e+u-1)),
i=0,…,u-1
对于满足t≠e,…,t≠e+u-1的t,s1(t)=s0(t),
其中表达式expi,i=0,…,u-1可以从指令I的指令助记符直接得到的表达式。
(2)确定顺序汇编指令程序状态空间:
依次获取顺序汇编指令程序中操作数的地址a1,a2,…,aM,长度l1,l2,…,lM,初始数值x1,x2,…,xM;同时用操作数地址标识符作为操作数的名字;获取的所有操作数的集合作为程序的工作集,程序的工作集中每个操作数都获得一个数值后作为程序的一个状态向量,程序的工作集中所有操作数的初始数值是程序的初始状态向量,所有状态向量构成程序的状态向量空间。
需要说明的是,状态向量每一个分量由一个操作数决定,在这里一个向量有M的分量,因为有M个操作数。状态向量中的每一个分量,就是一个操作数的取值,所有的操作数在一个时间点(指令执行前、执行后)的取值,就构成状态向量。
在本实施例中,利用程序自动地建立顺序汇编指令程序状态空间时将程序的所有操作数的信息存储形成一个链表,首先扫描顺序汇编指令程序,依次获取顺序汇编指令程序中所有操作数的地址、长度和操作数的初始数值,分别表示为:指令i1,i2,.,iN(假设顺序汇编指令程序有N条指令);操作数地址:a1,a2,…,aM;操作数长度:l1,l2,…,lM;操作数初始数值:x1,x2,…,xM。
将操作数地址、操作数长度和操作数初始数值记录在类型为struct{unsignedlong a;unsigned long l;void*next}操作数描述对象中,其中a是操作数的地址,1是操作数的长度,next指向指令的下一个操作数描述对象。如果是最后一个操作数则next=NULL。next字段、和整个链表都是临时的。
程序的所有操作数的信息存储形成一个链表。扫描结束后,根据这个链表,建立2个数组:操作数地址数组a[M],操作数长度数组l[M];扫描的时候用链表,最后用数组存储便于使用同时便于在指令的语义规约过程中确定相应的源操作数和目标操作数及其类型。
(3)汇编指令语义规约:
顺序汇编指令程序语义规约:对于程序的每一条指令依次进行语义规约;对于第j条指令,根据指令的指令助记符、源操作数和目标操作数将程序的工作集中所有操作数的值都规约成由程序的初始状态向量表示的新的状态向量,并将新的状态向量记为(ej,1,ej,2,......,ej,M),其中j表示指令序号,j取值从1到N,N为指令总数,M表示所有操作数的总数。
在本实施中,根据步骤(2)获得了顺序汇编指令程序的所有的操作数的地址为a1,a2,...,aM,为了减少符号,下面也用操作数的地址作为操作数的名字来引用。假定所有操作数的初始值为x1,x2,...,xM。
因为a1,a2,...,aM是程序的所有的操作数,所以,它们的值是决定状态变化的唯一因素。假定***状态在程序执行过程中从状态s0逐步转变成sN,其中sj将操作数地址a1,a2,...,aM映射为指令Ij执行后这些操作数的值;其它存储地址所映射的对程序语义没有影响,在此省略,j=0,...,N。
顺序汇编指令程序的目的是程序执行完成后所有操作数的值都用x1,x2,...,xM的表达式来表示。假定程序的第j-1条指令后所有操作数的值已经规约为x1,x2,...,xM的表达式ej-1,1,ej-1,2,……,ej-1,M,第j条指令Ij的语义为
s1(e+i)=expi(s0(b),...,s0(b+u-1),s0(e),...,s0(e+u-1)),i=0,...,u-1,(1-1)
s1(d)=s0(d),d≠dst,...,d≠dst+u-1, (1-2)
其中b是源操作数地址,e是目标操作数地址。根据操作数的地址和长度,可以为s0(b),…,s0(b+u-1),s0(e),…,s0(e+u-1)在ej-1,1,ej-1,2,……,ej-1,M找到对应的表达式,用它们取代Ij语义规则中的对应的式子,就可以得到指令Ij执行后,s1表示的所有的操作数的值,它们都是初始值x1,x2,...,xM的表达式ej,1,ej,2,…,ej,M,并用逻辑公式Rj(s0,sj)表示ej,1,ej,2,……,ej,M与初始值x1,x2,...,xM的关系,从它可以直接导出表示状态sj与s0的关系逻辑公式Qj(s0,sj),程序执行结束后我们得到Rj(s0,sj)和Qj(s0,sj)。
(4)生成顺序汇编指令程序语义的证明脚本:
为程序执行前初始状态向量s0=(x1,x2,...,xM)建立一个表示其特征的谓词公式:Q0(s0)=“a1=x1,...,aM=xM,”;
在第j条指令执行前,程序的状态向量与操作数的初始值的之间的关系用一个逻辑公式Qj-1(s0,sj-1)表示,表达式如下:
sj-1·a1=expj-1,1(x1,x2,...,xM)∧…∧sj-1·aM=expj-1,M(x1,x2,...,xM);
其中expj-1,k(x1,x2,...,xM),k=1,...,M是由x1,x2,...,xM构成的表示式。指令执行后所有操作数的值用一个逻辑公式Qj(s0,sj)表示,表达式如下:sj·ak=expj,k(x1,x2,...,xM),k=1,2,...,M;
第j条指令执行语义规约要证明的是:
Qj-1(s0,sj-1)∧(sj=Ijsj-1)→Qj(s0,sj);
找到指令的源操作数au和目标操作数av,确定公式(sj=Ijsj-1)中的sj·av=exp(expj-1,u(x1,x2,...,xM),expj-1,v(x1,x2,...,xM)),根据指令Ij的语句规则直接给出命题Qj-1(s0,sj-1)∧(sj=Ijsj-1)→Qj(s0,sj)的证明脚本;
以此类推,证明QN-1(s0,sj-1)∧(sN=INsN-1)→QN(s0,sj);
根据前面证明的命题,给出最终命题Q0(s0)∧(sN=ININ-1…I1s0)→QN(s0,sj)的证明脚本。
在本实施中,进一步阐述语义证明中的命题的建立、证明脚本生成方法和脚本中推理所依赖的规则,更加明确了证明脚本生成的细节问题。
如步骤(3)中所阐述的,程序在开始执行时的状态是s0,在指令操作数字长为1时,s0满足的关系是Q0(s0):s0(ak)=xk,k=1,...,M。对于sj满足的关系Qj(s0,sj)=(sj(a1)=ej,1∧…∧sj(aM)=ej,M),其它字长的情况是类似的。生成顺序汇编指令程序语义的证明脚本的方法是
为每条指令Ij定义命题Lj:“Qj-1(s0,sj-1)∧sj=Ij(sj-1+)→Qj(s0,sj-1)”,j=1,...,M;
为命题Lj生成相应的证明脚本,j=1,...,M。证明脚本按如下方式生成:
1emma Lj:
assume 1:Qj-1(s0,sj-1)
and 2:sj=Ij(sj-1)
show Qj(s0,sj-1)
proof-
from 2 have 3:sj=sj-1(|ae=exp,ae+1=…|)by simp
from 1 3 show Qj(s0,sj-1)by auto
其中sj=sj-1(|ae=exp,ae+1=…|)的意义是sj将的地址ae,ae+1等映射到值exp等值,在其它存储地址上映射的值与sj-1相同;exp是与步骤三中指令Ij的语义表达式(即表达式(1-1)和表达式(1-2))相对应的表达式。
图2是本发明具体实施例顺序汇编指令程序验证***结构示意图;图2示出了一种顺序汇编指令程序验***,包括:
指令语义规则建立模块、顺序汇编指令程序状态空间建立模块、汇编指令语义规约模块和语义证明脚本生成模块;
所述指令语义规则建立模块,用于对指令***中用汇编语句表示的每一条指令建立一个语义规则;
顺序汇编指令程序状态空间建立模块,用于建立顺序汇编指令程序状态空间、依次获取顺序汇编指令程序中操作数的地址a1,a2,...,aM、长度l1,l2,...,lM和初始数值x1,x2,...,xM;,获取的所有操作数的集合作为程序的工作集,程序的工作集中每个操作数都获得一个数值后作为程序的一个状态向量,程序的工作集中所有操作数的初始数值是程序的初始状态向量,所有状态向量构成程序的状态向量空间;
所述汇编指令语义规约模块,用于对于程序的每一条指令依次进行语义规约;对于第j条指令,根据指令的指令助记符、源操作数和目标操作数将程序的工作集中所有操作数的值都规约成由程序的初始状态向量表示的新的状态向量,并将新的状态向量记为ej,1,ei,2,……,ej,M,其中j表示指令序号,j取值从1到N,N为指令总数,M表示所有操作数的总数;
所述语义证明脚本生成模块,用于依次对顺序汇编指令程序中的指令根据指令的语义规则、指令执行前的程序的状态向量,生成指令执行后新的状态向量为规约出来的状态向量ej,1,ej,2,……,ej,M的证明脚本。
图3是本发明具体实施例顺序汇编指令程序验证***结构示意图;图3示出了一种顺序汇编指令程序验***,在以上技术方案的基础上,所述语义证明脚本生成模块包括证明命题生成模块,所述证明命题生成模块用于:
为程序执行前初始状态向量s0=(x1,x2,...,xM)建立一个表示其特征的谓词公式:Q0(s0)=“a1=x1,...,aM=xM,”;
在第j条指令执行前,程序的状态向量与操作数的初始值的之间的关系用一个逻辑公式Qj-1(s0,sj-1)表示,表达式如下:
sj-1·a1=expj-1,1(x1,x2,...,xM)∧…∧sj-1·aM=expj-1,M(x1,x2,...,xM);
其中expj-1,k(x1,x2,...,xM),k=1,...,M是由x1,x2,...,xM构成的表示式;
指令执行后所有操作数的值用一个逻辑公式Qj(s0,sj)表示,表达式如下:sj·ak=expj,k(x1,x2,...,xM),k=1,2,...,M;
第j条指令执行语义规约要证明的是:
Qj-1(s0,sj-1)∧(sj=Ijsj-1)→Qj(s0,sj)。
进一步地,所述语义证明脚本生成模块包括语义证明模块,所述语义证明模块用于:
找到指令的源操作数au和目标操作数av,确定公式(sj=Ijsj-1)中的sj·av=exp(expj-1,u(x1,x2,...,xM),expj-1,v(x1,x2,...,xM)),根据指令Ij的语句规则直接给出命题Qj-1(s0,sj-1)∧(sj=Ijsj-1)→Qj(s0,sj)的证明脚本;
以此类推,证明QN-1(s0,sj-1)∧(sN=IN sN-1)→QN(s0,sj);
根据前面证明的命题,给出最终命题Q0(s0)∧(sN=IN IN-1…11 s0)→QN(s0,si)的证明脚本。
本发明方法对指令***中的指令设计语义规则,从比较简单的汇编指令的语义规则、简单的单条汇编指令的语义证明脚本的生成方法出发,利用归纳技术方法得到整个顺序汇编指令程序语义的规约和验证脚本生成的方法;本发明方法可完成自动验证,使验证周期大大缩短且减小工作量以及时间和成本消耗。
本领域内的技术人员应明白,本申请的实施例可提供为方法、***、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。
Claims (10)
1.一种顺序汇编指令程序验证方法,其特征是包括如下步骤:
建立指令语义规则:对指令***中用汇编语句表示的每一条指令建立一个语义规则;
建立顺序汇编指令程序状态空间:依次获取顺序汇编指令程序中操作数的地址a1,a2,…,aM、长度l1,l2,…,lM和初始数值x1,x2,…,xM;获取的所有操作数的集合作为程序的工作集,程序的工作集中每个操作数都获得一个数值后作为程序的一个状态向量,程序的工作集中所有操作数的初始数值是程序的初始状态向量,所有状态向量构成程序的状态向量空间;
顺序汇编指令程序语义规约:对于程序的每一条指令依次进行语义规约;对于第j条指令,根据指令的指令助记符、源操作数和目标操作数将程序的工作集中所有操作数的值都规约成由程序的初始状态向量表示的新的状态向量,并将新的状态向量记为ej,1,ej,2,……,ej,M,其中j表示指令序号,j取值从1到N,N为指令总数,M表示所有操作数的总数;
语义证明脚本生成:依次对顺序汇编指令程序中的指令根据指令的语义规则、指令执行前的程序的状态向量,生成指令执行后新的状态向量为规约出来的状态向量ej,1,ej,2,……,ej,M的证明脚本。
2.根据权利要求1所述的一种顺序汇编指令程序验证方法,其特征是,建立指令语义规则方法如下:
指令I表达式如下:
指令助记符源操作数,目标操作数
指令执行前的状态向量s0表示为:s0.aj=x0,j,j=1,2,…,M;
指令执行后的状态向量s1表示为:s1.aj=x1,j,j=1,2,…,M;
其中aj程序的工作集中第j个操作数的地址,x0,j表示指令执行前地址为aj的操作数的值,x1,j表示指令执行后地址为aj的操作数的值,M是操作数的总数;
则指令I的语义规则为:
I∧s1→(s1.aj=s0.aj=x0,j,j=1,2,…,M,j≠v)∧s1.av=exp(x0,u,x0,v),其中u和v分别是指令的源操作数与目标操作数的下标;exp(x0,u,x0,v)表示由指令I执行前s0的状态分量x0,u,x0,v构成的表达式,表达式exp是根据指令I的指令助记符确定,“∧”是数理逻辑中的“合取”连接词,“→”是“隐含”连接词。
3.根据权利要求1所述的一种顺序汇编指令程序验证方法,其特征是,顺序汇编指令程序语义规约的方法如下:
假定程序的第j-1条指令后所有操作数的值已经规约为x1,x2,…,xM的表达式ej-1,1,ej-1,2,……,ej-1,M,第j条指令Ij的语义为:
s1(e+i)=expi(s0(b),…,s0(b+u-1),s0(e),…,s0(e+u-1)),i=0,…,u-1, (1-1)
s1(d)=s0(d),对所有的d≠e,…,d≠e+u-1等式成立, (1-2)
其中b是源操作数地址,e是目标操作数地址;s0是指令执行前的状态向量;s1是指令执行后的状态向量;u是机器字长;si(d)表示状态向量si在地址d一个字节上的数值,这里i=0或1;expi(…),表示的是由括号中的参数构成的表达式,其中i=0,…,u-1;根据操作数的地址和长度,为s0(b),…,s0(b+u-1),s0(e),…,s0(e+u-1)在ej-1,1, ej-1,2,……,ej-1,M找到对应的表达式,用它们取代Ij语义规则中的对应的式子,得到指令Ij执行后s1表示的所有的操作数的值,它们都是初始值x1,x2,…,xM的表达式ej,1,ej,2,…,ej,M。
4.根据权利要求1所述的一种顺序汇编指令程序验证方法,其特征是,语义证明脚本生成方法是:
为程序执行前初始状态向量s0=(x1,x2,…,xM)建立一个表示其特征的谓词公式:Q0(s0)=“a1=x1,…,aM=xM,”;
在第j条指令执行前,程序的状态向量与操作数的初始值的之间的关系用一个逻辑公式Qj-1(s0,sj-1)表示,表达式如下:
sj-1.a1=expj-1,1(x1,x2,…,xM)∧…∧sj-1.aM=expj-1,M(x1,x2,…,xM);
其中sj-1是指令Ij-1执行前的状态向量;expj-1,k(x1,x2,…,xM),k=1,…,M是由x1,x2,…,xM构成的表示式;
指令执行后所有操作数的值所满足的条件用一个逻辑公式Qj(s0,sj)表示,表达式如下:sj.ak=expj,k(x1,x2,…,xM),k=1,2,…,M;其中sj是指令Ij-1执行后的状态向量;expj-1,k()表示状态态向量sj-1的第k个分量的表达式;
第j条指令执行语义规约要证明的是:
Qj-1(s0,sj-1)∧(sj=Ij sj-1)→Qj(s0,sj);
找到指令的源操作数au和目标操作数av,确定公式(sj=Ij sj-1)中的sj.av=exp(expj-1,u(x1,x2,…,xM),expj-1,v(x1,x2,…,xM)),根据指令Ij的语句规则直接给出命题Qj-1(s0,sj-1)∧(sj=Ij sj-1)→Qj(s0,sj)的证明脚本;
以此类推,证明QN-1(s0,sj-1)∧(sN=IN sN-1)→QN(s0,sj);
其中“∧”是数理逻辑中的“合取”连接词,“→”是“隐含”连接词;
根据前面证明的命题,给出最终命题Q0(s0)∧(sN=IN IN-1…I1 s0)→QN(s0,sj)的证明脚本。
5.根据权利要求1所述的一种顺序汇编指令程序验证方法,其特征是,所述语义规则用于描述将指令执行后***的状态向量s1中指令的目标操作数分量表示成由指令执行前***的状态向量s0中源操作数分量构成的表达式的公式。
6.根据权利要求1所述的一种顺序汇编指令程序验证方法,其特征是,状态向量s1中除了将指令的目标操作数分量表示成由指令执行前***的状态向量s0中源操作数分量构成外,其它分量都与状态向量s0的中的其它分量都相同。
7.一种顺序汇编指令程序验证***,其特征在于,包括:
指令语义规则建立模块、顺序汇编指令程序状态空间建立模块、汇编指令语义规约模块和语义证明脚本生成模块;
所述指令语义规则建立模块,用于对指令***中用汇编语句表示的每一条指令建立一个语义规则;
顺序汇编指令程序状态空间建立模块,用于建立顺序汇编指令程序状态空间、依次获取顺序汇编指令程序中操作数的地址a1,a2,…,aM、长度l1,l2,…,lM和初始数值x1,x2,…,xM,获取的所有操作数的集合作为程序的工作集,程序的工作集中每个操作数都获得一个数值后作为程序的一个状态向量,程序的工作集中所有操作数的初始数值是程序的初始状态向量,所有状态向量构成程序的状态向量空间;
所述汇编指令语义规约模块,用于对于程序的每一条指令依次进行语义规约;对于第j条指令,根据指令的指令助记符、源操作数和目标操作数将程序的工作集中所有操作数的值都规约成由程序的初始状态向量表示的新的状态向量,并将新的状态向量记为ej,1,ej,2,……,ej,M,其中j表示指令序号,j取值从1到N,N为指令总数,M表示所有操作数的总数;
所述语义证明脚本生成模块,用于依次对顺序汇编指令程序中的指令根据指令的语义规则、指令执行前的程序的状态向量,生成指令执行后新的状态向量为规约出来的状态向量ej,1,ej,2,……,ej,M的证明脚本。
8.根据权利要求7所述的一种顺序汇编指令程序验证***,其特征是,
所述语义证明脚本生成模块包括证明命题生成模块,所述证明命题生成模块用于:
为程序执行前初始状态向量s0=(x1,x2,…,xM)建立一个表示其特征的谓词公式:Q0(s0)=“a1=x1,…,aM=xM,”;
在第j条指令执行前,程序的状态向量与操作数的初始值的之间的关系用一个逻辑公式Qj-1(s0,sj-1)表示,表达式如下:
sj-1.a1=expj-1,1(x1,x2,…,xM)∧…∧sj-1.aM=expj-1,M(x1,x2,…,xM);
其中expj-1,k(x1,x2,…,xM),k=1,…,M是由x1,x2,…,xM构成的表示式;
expj-1,k(…)表示的是状态向量sj-1的第k个分量的表达式;Ij-1是第j-1条指令;sj-1是第j-1条指令执行前的状态向量;“∧”是逻辑连接词“合取”的符号;
指令执行后所有操作数的值用一个逻辑公式Qj(s0,sj)表示,表达式如下:sj.ak=expj,k(x1,x2,…,xM),k=1,2,…,M;
第j条指令执行语义规约要证明的是:
Qj-1(s0,sj-1)∧(sj=Ij sj-1)→Qj(s0,sj);
其中sj是第j-1条指令执行后的状态向量;“→”是逻辑连接词“隐含”的符号。
9.根据权利要求8所述的一种顺序汇编指令程序验证***,其特征是,
所述语义证明脚本生成模块包括语义证明模块,所述语义证明模块用于:
找到指令的源操作数au和目标操作数av,确定公式(sj=Ij sj-1)中的sj.av=exp(expj-1,u(x1,x2,…,xM),expj-1,v(x1,x2,…,xM)),根据指令Ij的语句规则直接给出命题Qj-1(s0,sj-1)∧(sj=Ij sj-1)→Qj(s0,sj)的证明脚本;
以此类推,证明QN-1(s0,sj-1)∧(sN=IN sN-1)→QN(s0,sj);
其中N是整个程序的指令的数量,整个程序由指令{I0,I1,…,IN-1}N条指令组成;
根据前面证明的命题,给出最终命题Q0(s0)∧(sN=IN IN-1…I1 s0) →QN(s0,sj)的证明脚本。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
建立指令语义规则:对指令***中用汇编语句表示的每一条指令建立一个语义规则;
建立顺序汇编指令程序状态空间:依次获取顺序汇编指令程序中操作数的地址a1,a2,…,aM、长度l1,l2,…,lM和初始数值x1,x2,…,xM;获取的所有操作数的集合作为程序的工作集,程序的工作集中每个操作数都获得一个数值后作为程序的一个状态向量,程序的工作集中所有操作数的初始数值是程序的初始状态向量,所有状态向量构成程序的状态向量空间;
顺序汇编指令程序语义规约:对于程序的每一条指令依次进行语义规约;对于第j条指令,根据指令的指令助记符、源操作数和目标操作数将程序的工作集中所有操作数的值都规约成由程序的初始状态向量表示的新的状态向量,并将新的状态向量记为ej,1,ej,2,……,ej,M,其中j表示指令序号,j取值从1到N,N为指令总数,M表示所有操作数的总数;
语义证明脚本生成:依次对顺序汇编指令程序中的指令根据指令的语义规则、指令执行前的程序的状态向量,生成指令执行后新的状态向量为规约出来的状态向量ej,1,ej,2,……,ej,M的证明脚本。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811543051.3A CN109766268B (zh) | 2018-12-17 | 2018-12-17 | 一种顺序汇编指令程序验证方法与*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811543051.3A CN109766268B (zh) | 2018-12-17 | 2018-12-17 | 一种顺序汇编指令程序验证方法与*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109766268A CN109766268A (zh) | 2019-05-17 |
CN109766268B true CN109766268B (zh) | 2019-10-25 |
Family
ID=66450922
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811543051.3A Active CN109766268B (zh) | 2018-12-17 | 2018-12-17 | 一种顺序汇编指令程序验证方法与*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109766268B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112817599B (zh) * | 2021-01-27 | 2023-06-23 | 南京大学 | 软件函数形式语义及形式化证明脚本自动生成方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1684047A (zh) * | 2004-12-24 | 2005-10-19 | 清华大学 | 基于边界条件和自检查随机测试的cpu约束生成验证法 |
CN102724035A (zh) * | 2012-06-15 | 2012-10-10 | 中国电力科学研究院 | 一种加密卡的加解密方法 |
US9009666B1 (en) * | 2008-05-30 | 2015-04-14 | United Services Automobile Association (Usaa) | Systems and methods for testing software and for storing and tracking test assets with the software |
JP2016194787A (ja) * | 2015-03-31 | 2016-11-17 | エヌ・ティ・ティ・コムウェア株式会社 | ソフトウェア試験装置、ソフトウェア試験方法及びソフトウェア試験用プログラム |
CN106648681A (zh) * | 2016-12-29 | 2017-05-10 | 南京科远自动化集团股份有限公司 | 一种可编程语言编译装载***及方法 |
JP2018092361A (ja) * | 2016-12-02 | 2018-06-14 | 日本電信電話株式会社 | テストスクリプト修正装置及びテストスクリプト修正プログラム |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090077532A1 (en) * | 2007-09-13 | 2009-03-19 | Universities Space Research Association | Automated annotation inference for safety certification of automatically generated code |
JP2012103791A (ja) * | 2010-11-08 | 2012-05-31 | Mitsubishi Electric Corp | プログラム試験装置、プログラム試験方法およびプログラム試験用プログラム |
US10387687B2 (en) * | 2017-04-07 | 2019-08-20 | Nxp B.V. | Method for symbolic execution on constrained devices |
CN108446218A (zh) * | 2018-02-28 | 2018-08-24 | 华东师范大学 | 一种结构化文本程序的自动化验证装置 |
-
2018
- 2018-12-17 CN CN201811543051.3A patent/CN109766268B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1684047A (zh) * | 2004-12-24 | 2005-10-19 | 清华大学 | 基于边界条件和自检查随机测试的cpu约束生成验证法 |
US9009666B1 (en) * | 2008-05-30 | 2015-04-14 | United Services Automobile Association (Usaa) | Systems and methods for testing software and for storing and tracking test assets with the software |
CN102724035A (zh) * | 2012-06-15 | 2012-10-10 | 中国电力科学研究院 | 一种加密卡的加解密方法 |
JP2016194787A (ja) * | 2015-03-31 | 2016-11-17 | エヌ・ティ・ティ・コムウェア株式会社 | ソフトウェア試験装置、ソフトウェア試験方法及びソフトウェア試験用プログラム |
JP2018092361A (ja) * | 2016-12-02 | 2018-06-14 | 日本電信電話株式会社 | テストスクリプト修正装置及びテストスクリプト修正プログラム |
CN106648681A (zh) * | 2016-12-29 | 2017-05-10 | 南京科远自动化集团股份有限公司 | 一种可编程语言编译装载***及方法 |
Non-Patent Citations (3)
Title |
---|
Formal verification of an OS kernel;Klein G;《Proceedings of the ACM》;20091231;全文 * |
基于Hoare逻辑的密码软件形式化验证***;郝耀辉;《计算机工程》;20121231;全文 * |
基于Isabelle定理证明器算法程序的形式化验证;游珍;《计算机工程与科学》;20091231;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN109766268A (zh) | 2019-05-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109753288B (zh) | 一种适用于形式化验证的智能合约编译方法 | |
Li et al. | PASS: string solving with parameterized array and interval automaton | |
CN102799529B (zh) | 一种动态的二进制代码测试用例生成方法 | |
US20110138362A1 (en) | Software equivalence checking | |
Georgiadis et al. | Finding dominators in practice | |
Assunção et al. | Establishing integration test orders of classes with several coupling measures | |
CN109934507A (zh) | 一种业务流程调度的方法及装置 | |
US20150331787A1 (en) | Software verification | |
Liu et al. | A theorem prover for quantum hoare logic and its applications | |
CN109766268B (zh) | 一种顺序汇编指令程序验证方法与*** | |
Mayan et al. | Optimized test data generation over suspicious implementation of oracle problem | |
Chen et al. | Multi-view learning for parallelism discovery of sequential programs | |
US9158506B2 (en) | Loop abstraction for model checking | |
Jansen et al. | A local Greibach normal form for hyperedge replacement grammars | |
US20240104016A1 (en) | Intermediate Representation Method and Apparatus for Compiling Computation Graphs | |
Madhavan et al. | Purity analysis: An abstract interpretation formulation | |
Zojaji et al. | Automated program repair using genetic programming and model checking | |
CN106528179B (zh) | 一种Java类依赖关系的静态识别方法 | |
CN115170312A (zh) | 区块链上资产状态信息变更方法及装置 | |
EP3771139B1 (en) | Operational safety using a distributed ledger | |
Sumalatha et al. | An model based test case generation technique using genetic algorithms | |
Duy et al. | VulnSense: Efficient Vulnerability Detection in Ethereum Smart Contracts by Multimodal Learning with Graph Neural Network and Language Model | |
Karunakaran et al. | A petri net simulation of software development lifecycle towards green IT | |
CN112418930B (zh) | 一种测试方法、***及计算机设备 | |
Allal et al. | Towards distributed solution to the state explosion problem |
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 |