分段符号执行装置及其工作方法

文档序号:6431615阅读:130来源:国知局
专利名称:分段符号执行装置及其工作方法
技术领域
本发明涉及一种结构新颖的分段符号执行装置及其工作方法,用于解决程序测试时的路径爆炸问题,属于计算机中的符号执行设备的自动测试技术领域。
背景技术
符号执行(symbolic execution)技术是一种目前被研究领域广泛认可的、形式化的软件和程序的自动化测试技术,符号执行技术诞生于上世纪70年代,近几年来,该技术成为了软件工程理论和方法研究中的热点,有可能成为解决软件的自动测试问题的核心方法。1976年JC. King提出的符号执行技术,为自动测试理论做出了开创性的贡献,成为了最受关注的形式化(formal)软件自动测试方法,现在已经成为了一种重要的程序分析理论。符号执行技术的核心思想是用符号表示程序的输入数据,并将程序的运算过程逐指令或逐语句地转换为数学表示式,再在程序控制流图CFG(Contrc)I Flower Graph)的基础上生成符号执行树,并为每一条路径建立一系列的、以输入数据为变量的表达式。符号执行的定义是假设对程序输入数据X(该X为未知数向量)的可执行路径 P进行解析,依次分析程序中的每个语句和指令,将路径P中的每一次判断与跳转对输入数据的要求都用X的数学表达式,即P的路径条件PC(path condition)来表示。然后,再对该路径表达式求解,得到的输入数据、即未知数向量X的解,再将该X放入程序,就能够执行路径P,进而实现遍历路径的目的。这样,符号执行的过程可概括为“假设变量,建立数学表达式,求解数学表达式”。因此,符号执行是一种路径敏感性(path-sensitive)的程序分析方法,也是程序静态分析和程序自动化测试的重要理论基础。符号执行的最主要贡献是将程序测试问题转换成为求解数据表达式的数学问题。符号执行的过程是从CFG的入口点开始,先将所涉及到的变量符号化,即用符号表示变量值;再依次解析程序中的语句和指令,将其翻译为符号表达式。每个变量的值都采用符号化的变量和常数所构造的数学表达式来表示,并在每一个节点记录变量的符号运算表达式PF(path function)。符号执行过程中遇到流程控制语言时,就将条件判断语句对变量值的要求附加到路径条件中;再以此循环执行。参见

图1,介绍一个典型的基本符号执行算法的基本过程的源程序。符号执行是在程序的控制流图上进行的,因此,该算法是先调用ParseToControlFlow构造控制流图CFG, 然后从CRi入口点开始遍历(在travsel函数实现)。再依次解析语句如果为赋值语句, 则构造PF ;如果为条件语句,则构造后续节点的PC。在构造PF时,如果源操作数在前向节点有效PF中有中间表达式,需要展开之,算法中的PF的功能是获得变量对应的表达式,还要保证PC中的变量都为输入数据的符号变量。参见图2,介绍一段程序及其CFG。该CFG是有唯一的入口点和出口点的有向图, 图中的节点为顺序执行过程,边用于表示执行流程的跳转关系。
将图1所示的算法,实施于图2所示的程序,其符号执行的具体过程如下(1)从 <start> 节点开始,执行后续节点(successor) <1,2>。(2)节点<1,2>的执行条件为TRUE,表示一定会被执行的。此时,符号变量A、B、C 的值分别为B、B、0。(3)执行节点<3>,节点<3>没有赋值语言,进行了条件判断;<3>的执行条件同为 TRUE, PF没有改变。(4) <3>的后续节点是根据遍历方法选择执行。该示例中是选择广度优先的遍历方法。(5)执行到节点<4>,PC发生了改变,从<3>到<4>的条件为B> 1,与其前驱条件 <3>的执行条件TRUE合取(即执行<3>是执行<4>的前提条件,为B > 1)。相应的执行到 <end>节点的执行条件为B < = 1。(6)以此方式执行,最终形成类似于图3所示的符号执行树。程序的符号执行过程,也是符号执行树的生成过程。图3是一个符号执行树的部分。图3所示的树没有完成遍历,表1只是其中一条完整路径的执行过程。树中的每个节点包括了其在CFG中的位置、PC和PF,且PC和PF都用符号表达式表示,每个输入数据都表示为符号。PC和PF存在于符号执行树中的每个节点,也是求解特定执行路径输入数据的基础。表1完整路径的符号执行过程
权利要求
1. 一种分段符号执行装置,用于解析中间语言程序,并在虚拟机中进行符号执行时的装置,且在执行过程中,既不执行程序运行时的编译操作,也不产生实际执行的效果,只产生符号执行的结果;其特征在于该装置采用PYTE中间语言和能够解析PYTE语言的虚拟机,支持对具有复杂数据类型和复杂调用关系的目标程序进行符号执行;且在符号执行时, 基于PYTE语言对函数参数进行输入输出IO属性的划分,对目标程序进行分段,以缓解大型程序符号执行时的路径爆炸,使得对大型程序的符号执行时间与其规模的关联程度,从呈指数相关降低为呈正比例相关;同时,通过该装置的实际执行进程控制与交互器模块与实际执行相结合,避免符号分段执行时,因数据结构复杂造成结果不精确;并对实际执行数据符号时的执行中的路径条件进行约束求解,判断是否符合执行条件,以提高路径遍历的覆盖率,以及程序分析和测试结果的准确率;该装置设有下述模块语言翻译模块,负责将C或C++源代码和x86平台汇编代码翻译为PYTE代码,并对目标程序进行数据流分析和分段处理,再给出明确标记;还使用输入IN、输出OUT、不确定输出 MAY_0UT的符号标记调用的参数属性,以使指令解析和符号执行器模块在执行PYTE文件过程中,能够识别和执行调用的操作;指令指针模块,负责接收PYTE文件中流程控制语句的控制,或者按照该PYTE文件中的指令顺序控制指令解析和符号执行器模块完成符号执行操作;该模块也能接受设定的指令指针,将装置恢复到设定状态;指令解析和符号执行器模块,作为该装置的核心模块,设置有一套解释与执行PYTE文件的处理流程和在执行过程中使用的、表示符号化对象的多种内部数据,用于接收指令指针模块中的指令指针指向的指令,再根据该指令格式解析并理解指令,进行符号的分段执行操作,生成执行结果路径条件PC和符号运算表达式PF,还改变符号化内存模块和符号化对象模块的状态;调用实际执行进程控制与交互器模块完成实际执行操作;符号化对象模块,负责将PYTE文件中操作的系统对象符号化,以便利用设置的符号变量表示该符号化对象的属性;在PYTE程序进行创建、关闭或操作符号化的对象类型时,该模块会相应地建立或消除符号化对象;对象的符号化操作过程需要在操作系统的监视器实时监控其运行;符号化内存模块,负责在指令解析和符号执行器模块执行PYTE程序时,将其中所有的内存操作都映射到该模块内完成;且为能真实模拟程序运行,该模块能够根据中间语言执行包括分配、释放、移动、拷贝和设置的多种内存操作,还能够执行与内存分配相关的系统函数,将高级语言直接转换为PYTE语言中的对应指令;该模块对调用过程中分配的内存要进行处理,且外部调用过程的内存操作是在操作系统监视器的监控中通过监控内存操作来实现的;内部状态模块,设有包括指向符号化对象列表的寄存器和符号化堆栈的多个寄存器, 用于存储该装置的内部状态,即分段符号的执行状态;约束求解器模块,用于完成对以一组等式或不等式表示的PC进行约束求解的数学运算,即处理PC等式或不等式组的解可满足性问题,实现自动生成程序中每条路径对应的一个输入数据向量的功能;实际执行进程控制与交互器模块,当执行过程中发生外部调用,指令解析和符号执行器模块需要控制实际程序的执行时,该模块负责与实际执行进行交互,读取内存或变量数值;同时,该模块还监控外部调用过程中,对系统对象的操作,并通知其他模块将系统对象符号化。
2.根据权利要求1所述的分段符号执行装置,其特征在于所述PYTE中间语言是介于机器语言和源程序语言之间的一种能处理复杂的数据结构和适用于程序分段后进行符号执行的中间语言,它基于LLVM中间语言扩展而成,用于进行程序分析、优化和测试。
3.根据权利要求2所述的分段符号执行装置,其特征在于所述PYTE中间语言的特点是在数据类型系统中增加了堆块形数据类型,将程序动态分配的内存作为一种数据类型; 在指令集上增加了直接操作堆块数据类型的指令,将高级语言的内存管理函数翻译为堆块类型数据的操作指令;区分函数参数的IO属性类型,即将该参数根据其IO特性分为三种 输入I、输出O和不确定输出MAY_0UT。
4.一种分段符号执行装置的分段符号执行方法,其特征在于将一个代码量大的程序拆分为多个小程序单元,然后,对每个小程序单元顺序进行分析;且在拆分后,将过程间的调用关系分为单元内的过程调用和单元外的过程调用,分别进行相应处理;包括下列操作步骤(1)分段符号执行装置的语言翻译模块将汇编语言或高级程序语言程序翻译为PYTE 程序,对程序进行数据流分析,根据主调函数和被调函数对参数的访问过程,判断函数的参数属性并进行标记后;将处理后的PYTE程序送到指令指针模块;(2)指令指针模块按照PYTE文件中的指令顺序,或者接收PYTE文件中流程控制语句的控制,将选取执行的指令送入指令解析和符号执行器模块;(3)指令解析和符号执行器模块解析指令指针模块送入的指令,根据该指令格式进行解析和理解,进行符号执行并生成执行结果PC、PF,同时改变符号化内存模块和符号化对象模块的状态,再将符号执行结果送入约束求解器模块,判断是否满足求解条件,即是否符合执行条件,实现遍历路径的目的;若满足,则执行步骤(4);否则,放弃执行,流程结束;与此同时,在操作系统监视器的实时监控下,符号化对象模块将PYTE文件中操作的系统对象符号化,并利用设置的符号变量表示该符号化对象的属性,再将符号化结果送入内部状态模块存储;内部状态模块利用包括指向符号化对象列表的寄存器和符号化堆栈的多个寄存器,存储指令解析和符号执行器模块传送来的分段符号执行状态和其他模块的工作状态;符号化内存模块在指令解析和符号执行器模块执行PYTE程序时,将后者各种内存操作都映射到该符号化内存模块内完成,并存储其执行结果;(4)约束求解器模块执行和完成对等式或不等式组PC进行的约束求解数学运算,自动生成程序中每条路径对应的一个输入数据向量;(5)在发生外部调用时,实际执行进程控制与交互器模块负责与实际执行进行交互,读取内存或变量数值;并在外部调用过程中,该模块监控系统对象的操作,并通知其他模块将系统对象符号化;(6)完成调用过程,将处理结果传送给硬件设备。
全文摘要
一种分段符号执行装置及其工作方法,装置设有语言翻译、指令指针,指令解析和符号执行器,符号化对象,符号化内存,内部状态,约束求解器和实际执行进程控制与交互器等模块,采用PYTE语言和能解析该语言的虚拟机,支持对数据类型和调用关系都复杂的程序进行符号执行;且在符号执行时,对函数参数划分IO属性和对程序分段,缓解路径爆炸,使得对大程序的符号执行时间与其规模的关联程度降低为正比例相关;还通过结合实际执行,避免符号分段执行的结果不精确;并对实际执行中的路径条件进行约束求解,判断是否符合执行条件,提高路径遍历的覆盖率,以及程序分析和测试结果的准确率,使得在实际系统的运行环境下,对大程序的符号执行技术达到实用化。
文档编号G06F11/36GK102289362SQ201110249700
公开日2011年12月21日 申请日期2011年8月26日 优先权日2011年8月26日
发明者安靖, 常晶, 张冬梅, 范文庆, 钟金鑫, 魏更宇 申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1