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

一种将程序代码转换成数据约束的方法和装置制造方法及图纸

技术编号:16220385 阅读:41 留言:0更新日期:2017-09-19 03:24
本发明专利技术公开了一种将程序代码转换成数据约束的方法和装置。该方法首先将程序代码转换成中间指令集,然后将中间指令集进行细化拆分,细化拆分时将原变量定义指令中涉及的复杂类型的变量细化拆分成多个简单类型的变量,然后将简单类型的变量再进一步细化成简单类型的地址指针变量和简单类型的指针指向变量,最后再将相应的变量定义指令细化拆分成针对简单类型的地址指针变量和简单类型的指针指向变量的内存分配指令和初始化数据存储指令,然后提取细化拆分后的中间指令集中的存取指令、算术指令和比较指令作为数据约束。

A method and apparatus for converting program code into data constraints

The invention discloses a method and a device for converting program code into data constraint. The program code into an intermediate instruction set, and then the intermediate instruction set to refine the split, split the original refined definition of variables involved in the complex instruction type variable refinement is divided into several simple type variables, then the simple type variables further refined into a simple pointer type address pointer variable and simple type to the variable, then the corresponding variable definition instruction refinement split into simple type for pointer address pointer variables and simple type to the variable memory allocation and initialization command data storage instructions, and then extract the intermediate detailed instructions after the split of centralized access instructions, arithmetic instructions and comparison instruction as the data constraint.

【技术实现步骤摘要】

本专利技术涉及程序代码的分析验证技术,特别涉及将程序代码转换成数据约束后,通过数据约束分析程序代码是否存在错误的问题。
技术介绍
在应用软件飞速发展的今天,软件的安全性和可靠性已经成为了一个至关重要的问题,代码的分析验证测试是在相关领域的常用手段。代码分析、测试、验证等均经常需要为程序抽取出对应约束,并在约束集合上判断软件代码的安全性。在这个过程中,约束抽取扮演了非常重要的角色。现有方法之一是通过编译器先将代码转化成中间代码,然以此为基础对原代码进行约束的抽取。例如,LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合,它可以对多类代码,如C,C++,Java等进行编译分析,将其转化为统一的中间指令。但是在利用类似的中间指令来进行约束抽取的过程中,大量由代码中的指针操作转化而来的中间指令给约束的抽取带来了极大的困难。
技术实现思路
本专利技术所要解决的问题:现有技术下,中间指令的复杂程度高,导致数据约束抽取困难。为解决上述问题,本专利技术采用的方案如下:根据本专利技术的一种将程序代码转换成数据约束的方法,该方法包括以下步骤:S1:将用户输入的源代码转换成中间指令集;S2:对中间指令集中的中间指令进行细化拆分,拆分后得到细化的中间指令集;S3:从细化的中间指令集中提取简单类型的指针指向变量和数值的对应关系作为第一约束;S4:从细化的中间指令集中提取算术和比较指令作为第二约束;S5:合并第一约束和第二约束组成最终的数据约束;所述步骤S2包括以下两个步骤:S21:将原变量定义指令中涉及的复杂类型的变量细化拆分成多个简单类型的变量,然后将简单类型的变量再进一步细化成简单类型的地址指针变量和简单类型的指针指向变量,最后再将相应的变量定义指令细化拆分成针对简单类型的地址指针变量和简单类型的指针指向变量的内存分配指令和初始化数据存储指令;S22:创建地址指针寄存器,然后将原地址移位存取指令细化拆分成将地址移位赋值给该地址指针寄存器的指令和针对该地址指针寄存器的数据存取指令。进一步,根据本专利技术的一种将程序代码转换成数据约束的方法,该方法还包括从中间指令集中找出一条路径;然后选取该路径上的指令构成路径指令集,然后将该路径指令集作为中间指令集执行所述的步骤S2,S3,S4,S5。进一步,根据本专利技术的一种将程序代码转换成数据约束的方法,该方法还包括先从S2中细化的指令集中找出一条路径;之后对该路径上的细化的指令集执行所述步骤的S3,S4,S5。根据本专利技术的一种将程序代码转换成数据约束的装置,该装置包括以下模块:M1,用于:将用户输入的源代码转换成中间指令集;M2,用于:对中间指令集中的中间指令进行细化拆分,拆分后得到细化的中间指令集;M3,用于:从细化的中间指令集中提取简单类型的指针指向变量和数值的对应关系作为第一约束;M4,用于:从细化的中间指令集中提取算术和比较指令作为第二约束;M5,用于:合并第一约束和第二约束组成最终的数据约束;所述模块M2包括以下两个模块:M21,用于:将原变量定义指令中涉及的复杂类型的变量细化拆分成多个简单类型的变量,然后将简单类型的变量再进一步细化成简单类型的地址指针变量和简单类型的指针指向变量,最后再将相应的变量定义指令细化拆分成针对简单类型的地址指针变量和简单类型的指针指向变量的内存分配指令和初始化数据存储指令;M22,用于:创建地址指针寄存器,然后将原地址移位存取指令细化拆分成将地址移位赋值给该地址指针寄存器的指令和针对该地址指针寄存器的数据存取指令。本专利技术的技术效果如下:本专利技术通过对中间指令集进行细化拆分之后,使得原来复杂的中间指令细化成更为简单的原子指令,组成细化的指令集,然后对路径上细化的指令集抽取出该路径对应的数据约束。其中,原子指令是对单个变量进行单步操作,从而便于约束抽取。得到路径对应的数据约束后,通过约束求解可分析该路径的可行性。附图说明图1是本专利技术实施例中待解决的的示例代码。图2是图1示例代码转化后的中间指令集。图3是图2中的中间指令集经细化拆分后的得到的细化的中间指令集。其中,图2、图3中的中间指令集以控制流程图的格式表示。具体实施方式下面结合附图对本专利技术做进一步详细说明。本专利技术的将程序代码转换成数据约束的方法,包括两个步骤:将源代码转换成中间指令集的步骤和对中间指令集进行处理抽取数据约束的步骤。其中,前者即为前述的步骤S1,将用户输入的源代码转换成中间指令集;后者即为前述的步骤S2、S3、S4和S5。步骤S1的过程可以由通用的前端编译器实现。本领域技术人员理解,现有编译器理论的框架下,编译器一般由前端编译器、优化模块和后端编译器所组成。前端编译器用于将不同语言的源代码转换成中间指令集,然后优化模块对中间指令集进行优化处理,最后由后端编译器对优化处理后的中间指令集转换成不同平台或处理器下的机器指令集。目前,这种前端编译器是现有的,例如LLVM编译器。LLVM是构架编译器(compiler)的框架系统,能够对多种语言的源代码进行处理。图1是本专利技术实施例的示例代码,为C语言的源代码,经过LLVM编译器转换成中间指令后得到的中间指令集,如图2所示。图2中的中间指令集以控制流程图的格式表示。本领域技术人员理解,以控制流程图的方式还是以文本的方式表示中间指令集并不影响本专利技术的实际处理过程。中间指令集虽然是一种能够在假想的通用处理器上运行的机器指令集,但这种中间指令集更多地考虑了各种实际处理器能够执行的机器指令与中间指令之间的对应关系。另一方面,虽然各种处理器的型号有很多种,但目前各种处理器的能够执行的机器指令集大同小异。因此,可以认为,中间指令集中的中间指令很大程度上基于现有处理器所执行的机器指令。特别是中间指令与实际处理器所执行的机器指令存在着对应关系。而实际处理器所执行的机器指令考虑到处理性能的问题,通常会将多个参数和多个步骤进行整合到一个机器指令中,以提高处理器处理性能。因此,处理器所执行的机器指令中,每个机器指令通常能够带有多个参数或者实际包含了多个步骤。由此,中间指令集中的指令也同样如此。如图2所示中,示例代码的中间指令集中的第一个中间指令@a=global[2xdouble][double2.3double4.3]中,涉及了分配内存、内存赋值以及将所分配的内存地址赋值给@a等三个步骤,该中间指令还涉及两个变量,内存中第一个double的变量和第二个double的变量。而数据约束则是二维约束关系,这种多个步骤和多个变量的中间指令很难用数据约束表示。本实施例对中间指令集进行处理抽取数据约束的步骤采用如下步骤:S2:对中间指令集中的中间指令进行细化拆分,拆分后得到细化的中间指令集;S3:从细化的中间指令集中提取简单类型的指针指向变量和数值的对应关系作为第一约束;S4:从细化的中间指令集中提取算术和比较指令作为第二约束;S5:合并第一约束和第二约束组成最终的数据约束。步骤S3、S4、S5得到的第一约束、第二约束以及最终的数据约束都是针对某条路径的数据约束。因此在实际过程中,有两种处理方式:第一种处理方式是:在步骤S2之前提取路径上的中间指令集,然后将该路径上的中间指令集作为步骤S2的输入,后续的步骤S3、S4、S5得到的第一约束、第二约束以及最终的数据约束显而易见地是该本文档来自技高网...
一种<a href="http://www.xjishu.com/zhuanli/55/201710480725.html" title="一种将程序代码转换成数据约束的方法和装置原文来自X技术">将程序代码转换成数据约束的方法和装置</a>

【技术保护点】
一种将程序代码转换成数据约束的方法,其特征在于,该方法包括以下步骤:S1:将用户输入的源代码转换成中间指令集;S2:对中间指令集中的中间指令进行细化拆分,拆分后得到细化的中间指令集;S3:从细化的中间指令集中提取简单类型的指针指向变量和数值的对应关系作为第一约束;S4:从细化的中间指令集中提取算术和比较指令作为第二约束;S5:合并第一约束和第二约束组成最终的数据约束;所述步骤S2包括以下两个步骤:S21:将原变量定义指令中涉及的复杂类型的变量细化拆分成多个简单类型的变量,然后将简单类型的变量再进一步细化成简单类型的地址指针变量和简单类型的指针指向变量,最后再将相应的变量定义指令细化拆分成针对简单类型的地址指针变量和简单类型的指针指向变量的内存分配指令和初始化数据存储指令;S22:创建地址指针寄存器,然后将原地址移位存取指令细化拆分成将地址移位赋值给该地址指针寄存器的指令和针对该地址指针寄存器的数据存取指令。

【技术特征摘要】
1.一种将程序代码转换成数据约束的方法,其特征在于,该方法包括以下步骤:S1:将用户输入的源代码转换成中间指令集;S2:对中间指令集中的中间指令进行细化拆分,拆分后得到细化的中间指令集;S3:从细化的中间指令集中提取简单类型的指针指向变量和数值的对应关系作为第一约束;S4:从细化的中间指令集中提取算术和比较指令作为第二约束;S5:合并第一约束和第二约束组成最终的数据约束;所述步骤S2包括以下两个步骤:S21:将原变量定义指令中涉及的复杂类型的变量细化拆分成多个简单类型的变量,然后将简单类型的变量再进一步细化成简单类型的地址指针变量和简单类型的指针指向变量,最后再将相应的变量定义指令细化拆分成针对简单类型的地址指针变量和简单类型的指针指向变量的内存分配指令和初始化数据存储指令;S22:创建地址指针寄存器,然后将原地址移位存取指令细化拆分成将地址移位赋值给该地址指针寄存器的指令和针对该地址指针寄存器的数据存取指令。2.如权利要求1所述的将程序代码转换成数据约束的方法,其特征在于,该方法还包括从中间指令集中找出一条路径;然后选取该路径上的指令构成路径指令集,然后将该路径指令集作为中间指令集执行所述的步骤S2,S3,S4,S5。3...

【专利技术属性】
技术研发人员:卜磊李一超陶昱天闾乐成梁东隽沈大川赵建华李宣东
申请(专利权)人:南京大学
类型:发明
国别省市:江苏;32

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

1