当前位置: 首页 > 专利查询>清华大学专利>正文

字节码中间表示程序的分模块形式化验证方法技术

技术编号:4037026 阅读:233 留言:0更新日期:2012-04-11 18:40
一种字节码格式中间表示程序的分模块形式化验证方法涉及程序安全技术领域,所述方法运行于双栈结构的虚拟机,包括以函数为单位形式化重写待验证字节码程序并给出其形式化规格说明;将函数划分为指令序列并给出其规格说明;形式化证明每一个指令序列符合对应的规格说明;函数中所有指令序列的证明连接后形成函数的证明,所有函数的证明连接起来得到整个程序的证明;满足规格说明中所描述的存储特性和部分正确性特性,达到增强字节码程序可信程度的目的。本发明专利技术可与常规的测试、静态和动态检查等方法结合,应用于航空、核工业控制等领域安全关键程序的检查,具有可信度高、可自动化检查等特点。

【技术实现步骤摘要】

本专利技术涉及程序可信领域,特别涉及一种针对字节码中间表示程序的分模块形式 化验证方法。
技术介绍
字节码中间表示既能运行于虚拟机,也能作为编译过程中定义良好的程序表示形 式,是当今网络软件和计算设备中广泛使用的重要技术。字节码中间表示程序验证能够提 高相关软件的可信程度,同时为构造证明保持编译器提供中间表示支持,具有重要的实用 价值和理论价值。传统的字节码中间表示程序验证的主要研究工作集中于JVM内部检查器,目标是 类型正确性,从而保证存储安全性。随着研究工作的深入,人们逐步认识到仅有类型安全 性检查远远不够,还需要进一步研究其它更多程序性质。近年人们提出一些用于字节码程 序验证的逻辑系统,代表性研究工作包括=Quigley设计了一个用于字节码程序的类霍尔 (Hoare)逻辑系统,证明了含有循环的程序片段。Benton提出一种组合逻辑系统,用于一 种.NET公共中间语言(CIL)的命令式语言子集,并给出纯手工证明。Barmwart和Muller 提出一种支持对象、引用、方法和继承等面向对象特征的逻辑系统,用来证明类JAVA字节 码。MRG项目主要着眼于程序资源,提出一种针对字节码的具有资源感知特征的操作语义, 以及相应的逻辑系统。字节码建模语言BML(BytecodeModeling Language)作为一种可理 解的字节码程序规范,应用开发人员可用它在字节码层面书写程序标注,以规范字节码程 序的行为功能,与之对应的JML语言提供JAVA源语言层面的规范描述。该研究同时包含一 个并不完整的JML到BML编译器,其局限性在于证明检查仍然需要借助一个复杂的验证器。本专利技术针对的目标运行环境为双栈式虚拟机,一为计算栈,所有数据存取和算术 运算均在此栈完成;二为函数调用栈,专门处理函数调用和返回的栈操作。由于字节码中间表示程序抽象控制栈复杂、而控制流结构信息不足,以前方法无 法有效解决这类程序的分块验证,而现实中有大量的需求,因此设计有效、可自动检查的形 式化验证方案,具有重要的实际意义和应用价值。
技术实现思路
本专利技术利用程序证明技术,设计出一种提高程序可行程度的字节码分块形式化验 证方法,该程序的分块验证方法方法通过将一个程序以函数为单位划分得到指令序列,为 函数和相应的指令序列添加规格说明,并经过基于逻辑系统的形式化证明,再将证明结果 按照指令序列、函数和程序的顺序逐步组合形成整个程序的证明,从而建立程序的全局良 型性,确保程序满足其规格说明中规定的存储安全性和部分正确性。该方法具有易实施、易 检查、难伪造等特点。本专利技术针对双栈结构的虚拟机,采用独立的函数调用栈处理函数调用/返回过程 中的控制结构,利用指令序列划分的方式提取字节码中间表示程序的控制流结构信息,给出了一种字节码中间表示程序的分模块验证方法。所述方法是在具有计算栈和函数调用栈 的双栈式虚拟机中实现的。所述计算栈处理所有数据的存取和算术运算。所述函数调用栈 处理函数的调用和返回。所述方法以一下步骤进行步骤(1),所述双栈式虚拟机的初始化,设立一个以上的函数模块,其中包括用于计算数值的阶乘的字节码中间表示程序 的函数模块,还设立函数形式化规格说明模块、指令序列划分模块和形式化验证模块,其中函数模块,由字节码指令组成,所述的指令包括pushc w、pushv f\、popf2, binop bop、unop uop> brtrue f3> call f4> ret 以及 goto f5,其中pushc w 将整数w放入当前计算栈顶,该栈的指针减1,执行本条指令的当前指令 地址Pcw加1 ;pushv 将内存地址处的值放入当前计算栈顶,该计算栈指针减1,执行本条 指令的当前指令地址PCfl加1 ;pop f2 将当前计算栈顶的值存入内存地址f2处,该计算栈指针加1,执行本条指 令的当前指令地址PCf2加1 ;binop bop 执行包括加、减、乘、除双目运算bop,执行本条指令的当前指令地址 PCbop 力口 1 ;unop uop 执行取负单目运算uop,执行本条指令的当前指令地址pc_加1 ;brtrue f3 如果所述计算栈的栈顶单元为1表示真,跳转到指令地址f3处执行,令 执行本条指令的当前指令地址PCf3的值改为f3 ;否则执行下一条指令,执行本条指令的当 前指令地址pcf3加1 ;call f4 函数调用,将下一条指令地址pcf4+l放入当前函数调用栈顶,该函数调用 栈的栈指针减1,跳转到f4处继续执行,令执行本条指令的当前指令地址Pcf4的值改为f4 ;ret 函数返回,从当前函数调用栈的栈顶取出返回地址ra,该函数调用栈的栈指 针加1,跳转到返回地址处继续执行,令执行本条指令的当前指令地址pcMt的值改为ra ;goto f5 跳转到作为目的地址的f5处继续执行,令执行本条指令的当前指令地址 PCf5的值改为f5 ;步骤(2),所述函数形式化规格说明模块,把待验证的字节码中间程序以函数为单 位划分并存入各函数模块,同时为每一个函数写出具有存储安全和部分正确性特征的形式 化规格说明,格式为<P,g>,其中ρ表示在执行一段代码之前所述双栈式虚拟机的状态S必须满足的条件,包含所 述内存、计算栈和函数调用栈中变量的取值范围,所述一段代码是指函数、指令序列或单独 指令;g表示这段代码执行前后的所述双栈式虚拟机两个状态之间必须满足的条件,包 括所述两个状态之间变量必须满足的数学和逻辑关系,从而给定了整个函数的功能说明;步骤(3)所属指令序列划分模块将步骤(2)得到的所有函数逐个地划分为指令 序列,并按所述〈P,g>格式给出规格说明,一个指令序列以函数入口处、或无条件跳转指令 goto f5的目标地址&处、或无条件跳转指令goto &相邻后续地址处的指令开始;一个指 令序列以无条件跳转指令goto f5或者函数返回指令ret结束;步骤(4)所述形式化验证模块区别不同情况地证明步骤(3)所述的所有指令序 列内的指令符合对应的规格说明设某指令序列内的任意一条指令i,该指令i的地址为pc,当前规格说明为〈P, g>,分情况证明如下情况1 如果该指令不是跳转指令、函数调用和返回指令,则给出其后续指令pc+1 处的规格说明〈P',g' >,判断后续指令序列满足规格说明〈P',g' >:如果当前状态S满足p,当前指令i能安全执行;如果当前状态S满足P,执行指令 i后到达状态S',则状态S'满足P';如果当前状态S和函数返回前状态Sr满足g,则执 行指令i后到达状态S',状态S'和函数返回前状态Si^iSg';情况2 如果是函数调用指令call f4,则表示程序控制流从当前函数foo进入被 调用函数bar的入口点f4,返回点为pc+1,需要给出该入口点f4以及指令地址pc+1处的规 格说明〈P',g' ><P",g" >,判断如下条件得以满足:如果当前状态S满足p,则call指令执行后的状态S'满足ρ';如果当前状态S 满足P,则bar函数返回状态S"满足P";如果当前状态S和foo函数返回前的状态Sr满 足条件g,执行函数bar后到达状态S",则状态S"和函数返本文档来自技高网
...

【技术保护点】
一种字节码格式中间表示程序的分模块形式化验证方法,其特征在于,所述方法是在具有计算栈和函数调用栈的双栈式虚拟机中实现的,所述计算栈处理所有数据的存取和算术运算,所述函数调用栈处理函数的调用和返回,所述方法以一下步骤进行:步骤(1),所述双栈式虚拟机的初始化,设立一个以上的函数模块,其中包括用于计算数值的阶乘的字节码中间表示程序的函数模块,还设立:函数形式化规格说明模块、指令序列划分模块和形式化验证模块,其中:函数模块,由字节码指令组成,所述的指令包括:pushcw、pushv列划分模块将步骤(2)得到的所有函数逐个地划分为指令序列,并按所述〈p,g〉格式给出规格说明,一个指令序列以函数入口处、或无条件跳转指令gotof↓[5]的目标地址f↓[5]处、或无条件跳转指令gotof↓[5]相邻后续地址处的指令开始;一个指令序列以无条件跳转指令gotof↓[5]或者函数返回指令ret结束;步骤(4):所述形式化验证模块区别不同情况地证明步骤(3)所述的所有指令序列内的指令符合对应的规格说明:设:某指令序列内的任意一条指令i,该指令i的地址为pc,当前规格说明为〈p,g〉,分情况证明如下:情况1:如果该指令不是跳转指令、函数调用和返回指令,则给出其后续指令pc+1处的规格说明〈p′,g′〉,判断后续指令序列满足规格说明〈p′,g′〉:如果当前状态S满足p,当前指令i能安全执行;如果当前状态S满足p,执行指令i后到达状态S′,则状态S′满足p′;如果当前状态S和函数返回前状态Sr满足g,则执行指令i后到达状态S′,状态S′和函数返回前状态Sr满足g′;情况2:如果是函数调用指令callf↓[4],则表示程序控制流从当前函数foo进入被调用函数bar的入口点f↓[4],返回点为pc+1,需要给出该入口点f↓[4]以及指令地址pc+1处的规格说明〈p′,g′〉〈p″,g″〉,判断如下条件得以满足:如果当前状态S满足p,则call指令执行后的状态S′满足p′;如果当前状态S满足p,则bar函数返回状态S″满足p″;如果当前状态S和foo函数返回前的状态Sr满足条件g,执行函数bar后到达状态S″,则状态S″和函数返回前的状态Sr满足条件g″;情况3:如果为函数返回指令ret,则要求在pc点能够完成状态转移,这样既能够满足函数返回的状态转移也能满足调用函数的g,而无关于返回地址的信息;这里需判断函数调用栈满足递归定义的良型性:如果...

【技术特征摘要】

【专利技术属性】
技术研发人员:董渊王生原张丽伟
申请(专利权)人:清华大学
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1
相关领域技术
  • 暂无相关专利