CN107180193B - 一种将程序代码转换成数据约束的方法和装置 - Google Patents

一种将程序代码转换成数据约束的方法和装置 Download PDF

Info

Publication number
CN107180193B
CN107180193B CN201710480725.9A CN201710480725A CN107180193B CN 107180193 B CN107180193 B CN 107180193B CN 201710480725 A CN201710480725 A CN 201710480725A CN 107180193 B CN107180193 B CN 107180193B
Authority
CN
China
Prior art keywords
variables
instruction
instruction set
constraint
simple type
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
Application number
CN201710480725.9A
Other languages
English (en)
Other versions
CN107180193A (zh
Inventor
卜磊
李一超
陶昱天
闾乐成
梁东隽
沈大川
赵建华
李宣东
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN201710480725.9A priority Critical patent/CN107180193B/zh
Publication of CN107180193A publication Critical patent/CN107180193A/zh
Application granted granted Critical
Publication of CN107180193B publication Critical patent/CN107180193B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • General Health & Medical Sciences (AREA)
  • Virology (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种将程序代码转换成数据约束的方法和装置。该方法首先将程序代码转换成中间指令集,然后将中间指令集进行细化拆分,细化拆分时将原变量定义指令中涉及的复杂类型的变量细化拆分成多个简单类型的变量,然后将简单类型的变量再进一步细化成简单类型的地址指针变量和简单类型的指针指向变量,最后再将相应的变量定义指令细化拆分成针对简单类型的地址指针变量和简单类型的指针指向变量的内存分配指令和初始化数据存储指令,然后提取细化拆分后的中间指令集中的存取指令、算术指令和比较指令作为数据约束。

Description

一种将程序代码转换成数据约束的方法和装置
技术领域
本发明涉及程序代码的分析验证技术,特别涉及将程序代码转换成数据约束后,通过数据约束分析程序代码是否存在错误的问题。
背景技术
在应用软件飞速发展的今天,软件的安全性和可靠性已经成为了一个至关重要的问题,代码的分析验证测试是在相关领域的常用手段。代码分析、测试、验证等均经常需要为程序抽取出对应约束,并在约束集合上判断软件代码的安全性。在这个过程中,约束抽取扮演了非常重要的角色。
现有方法之一是通过编译器先将代码转化成中间代码,然以此为基础对原代码进行约束的抽取。例如,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 [2 x double] [double 2.3 double 4.3]中,涉及了分配内存、内存赋值以及将所分配的内存地址赋值给@a等三个步骤,该中间指令还涉及两个变量,内存中第一个double的变量和第二个double的变量。而数据约束则是二维约束关系,这种多个步骤和多个变量的中间指令很难用数据约束表示。
本实施例对中间指令集进行处理抽取数据约束的步骤采用如下步骤:
S2:对中间指令集中的中间指令进行细化拆分,拆分后得到细化的中间指令集;
S3:从细化的中间指令集中提取简单类型的指针指向变量和数值的对应关系作为第一约束;
S4:从细化的中间指令集中提取算术和比较指令作为第二约束;
S5:合并第一约束和第二约束组成最终的数据约束。
步骤S3、S4、S5得到的第一约束、第二约束以及最终的数据约束都是针对某条路径的数据约束。因此在实际过程中,有两种处理方式:
第一种处理方式是:在步骤S2之前提取路径上的中间指令集,然后将该路径上的中间指令集作为步骤S2的输入,后续的步骤S3、S4、S5得到的第一约束、第二约束以及最终的数据约束显而易见地是该路径上的数据约束。该处理方式也就是:从中间指令集中找出一条路径;然后选取该路径上的指令构成路径指令集,然后将该路径指令集作为中间指令集执行所述的步骤S2,S3,S4,S5。
第二种处理方式是:在步骤S2之后提取路径上的中间指令集,此时,由于步骤S2的细化拆分使得提取得到的该路径上的中间指令集为细化后的中间指令集。该处理方式也就是:先从S2中细化的指令集中找出一条路径;之后对该路径上的细化的指令集执行所述步骤的S3,S4,S5。
显而易见地,与上述两种处理方式相对应的,假如需要提取程序代码所有路径上的数据约束时,遍历路径的过程可以在步骤S2之前执行,也可以在步骤S2之后执行。通常考虑到处理性能的问题,优选采用在步骤S2之后遍历路径,然后对每个路径执行步骤S3、S4、S5。
步骤S2是对中间指令集中的中间指令进行细化拆分的步骤。其输入是步骤S1得到的中间指令集,输出是细化的中间指令集。步骤S2包括了对变量定义指令的细化拆分步骤和对地址移位存取指令的细化拆分步骤。其中前者也就是前述步骤S21,将原变量定义指令中涉及的复杂类型的变量细化拆分成多个简单类型的变量,然后将简单类型的变量再进一步细化成简单类型的地址指针变量和简单类型的指针指向变量,最后再将相应的变量定义指令细化拆分成针对简单类型的地址指针变量和简单类型的指针指向变量的内存分配指令和初始化数据存储指令。后者也就是前述步骤S22,创建地址指针寄存器,然后将原地址移位存取指令细化拆分成将地址移位赋值给该地址指针寄存器的指令和针对该地址指针寄存器的数据存取指令。
步骤S21包括了四个步骤:S211,复杂类型的变量简化步骤;S212:引入地址指针变量和指针指向变量;S213:将变量定义替换成针对地址指针变量和指针指向变量的内存分配指令;S214:添加初始化数据存储指令。
步骤S211中,首先,对所定义变量的类型进行分析。如果该变量的类型为复杂类型,则根据该变量中所涉及的简单类型的变量的个数,创建对应数量的简单类型的变量。以图2的中间指令集为例,变量定义指令@a=global [2 x double] [double 2.3 double4.3]定义了一个数组。该数组中包含两个简单类型的变量,则分别为之定义两个简单类型的变量:@a.0和@a.1。再比如变量定义指令@z=alloca %struct pair定义了一个结构。该结构中包含两个简单类型的变量,则分别为之定义两个简单类型的变量:@z.x和@z.y。对于简单类型的变量定义,如@cond=global i32 0中的@cond已经是简单类型的变量,无需再定义简单类型的变量。
步骤S212中,对得到的简单类型的变量再进一步细化成简单类型的地址指针变量和简单类型的指针指向变量。以上述例子为例,简单类型的变量@a.0细化后的地址指针变量和指针指向变量为:@a.0和@a.0.v;简单类型的变量@a.1细化后的地址指针变量和指针指向变量为:@a.1和@a.1.v;简单类型的变量@z.x细化后的地址指针变量和指针指向变量为:@z.x和@z.x.v;简单类型的变量@z.y细化后的地址指针变量和指针指向变量为:@z.y和@z.y.v;简单类型的变量@cond细化后的地址指针变量和指针指向变量为:@cond和@cond.v。
步骤S213中,将变量定义指令细化拆分成针对简单类型的地址指针变量和简单类型的指针指向变量的单步操作指令。具体来说,变量定义指令@a=global [2 x double][double 2.3 double 4.3]拆分成以下三个针对@a.0和@a.0.v、@a.1和@a.1.v的指令:
@a = alloc @a.0 @a.1 ---为@a.0 @a.1分配连续的内存后将地址赋值给@a
@a.0 = alloc @a.0.v ---为@a.0.v分配的内存后将地址赋值给@a.0
@a.1 = alloc @a.1.v ---为@a.1.v分配的内存后将地址赋值给@a.1
变量定义指令@z=alloca %struct pair拆分成以下三个针对@z.x和@z.x.v、@a.1和@a.1.v的指令:
@z = alloc @z.x @z.y ---为@z.x @z.y分配连续的内存后将地址赋值给@z
@z.x = alloc @z.x.v ---为@z.x.v分配内存后将地址赋值给@z.x
@z.y = alloc @z.y.v ---为@z.y.v分配内存后将地址赋值给@z.y
变量定义指令@cond=global i32 0拆分成以下针对指针指向变量@cond.v的指令:
@cond = alloc @cond.v ---为@cond.v分配内存后将地址赋值给@cond
最后步骤S214中,对带有初始化的变量定义指令加上初始化的数值存储指令。比如,对于带有初始化的变量定义指令@a=global [2 x double] [double 2.3 double4.3],则所增加的数据存储指令为:
@a.0 = store double 2.3 ---将数值2.3存入@a.0所指向的内存中
@a.1 = store double 4.3 ---将数值4.3存入@a.1所指向的内存中
对于带有初始化的变量定义指令@cond=global i32 0,则所增加的数据存储指令为:
@cond = store i32 0 ---将数值0存入@cond所指向的内存中
显而易见地,假如原变量定义指令不带有初始化的,则无需执行步骤S214。经过上述四个步骤处理后,如图3所示,变量定义指令@a=global [2 x double] [double 2.3double 4.3]最终细化拆分成:
@a = alloc @a.0 @a.1 ---为@a.0 @a.1分配连续的内存后将地址赋值给@a
@a.0 = alloc @a.0.v ---为@a.0.v分配的内存后将地址赋值给@a.0
@a.1 = alloc @a.1.v ---为@a.1.v分配的内存后将地址赋值给@a.1
@a.0 = store double 2.3 ---将数值2.3存入@a.0所指向的内存中
@a.1 = store double 4.3 ---将数值4.3存入@a.1所指向的内存中
变量定义指令@cond=global i32 0最终细化拆分成:
@cond = alloc @cond.v ---为@cond.v分配内存后将地址赋值给@cond
@cond = store i32 0 ---将数值0存入@cond所指向的内存中
变量定义指令@z=alloca %struct pair最终细化拆分成:
@z = alloc @z.x @z.y ---为@z.x @z.y分配连续的内存后将地址赋值给@z
@z.x = alloc @z.x.v ---为@z.x.v分配内存后将地址赋值给@z.x
@z.y = alloc @z.y.v ---为@z.y.v分配内存后将地址赋值给@z.y
步骤S22,对地址移位存取指令的细化拆分步骤,包含了两个步骤:首先是步骤S221,引入或创建虚拟的地址指针寄存器,然后步骤S222,将原地址移位存取指令细化拆分成将地址移位赋值给该地址指针寄存器的指令和针对该地址指针寄存器的数据存取指令。如图2所示,以下为地址移位存取指令:
store double 4.0 double * getelementptr inbounds ([2 x double]* @a,i32 0,i64 1)
%1 = load double * getelementptr inbounds ([2 x double]* @a,i32 0,i64 0)
%2 = load double * getelementptr inbounds([2 x double]* @a,i32 0, i641)
上述三个地址移位存取指令包含了地址移位指令getelmentptr 和存取指令loadstore。对于第一个和第二个地址移位存取指令引入虚拟的地址指针寄存器%1.ptr,对于第三个地址移位存取指令引入虚拟的地址指针寄存器%2.ptr。然后将地址移位指令getelmentptr 和存取指令load store两种指令分开,最终将上述三个地址移位存取指令替换成三个地址移位指令和三个存取指令,如图3所示:
%1.ptr = getelementptr inbounds ([2 x double]* @a,i32 0,i64 1)
%1.ptr = store double 4.0
%1.ptr = getelementptr inbounds ([2 x double]* @a,i32 0,i64 0)
%1 = load double* %1.ptr
%2.ptr = getelementptr inbounds([2 x double]* @a,i32 0, i64 1)
%2 = load double * %2.ptr
步骤S3,从细化的中间指令集中提取简单类型的指针指向变量和数值的对应关系作为第一约束。首先,将地址移位指令getelmentptr具体到相应的简单类型的地址指针变量上。将相应的寄存器替换成相应的简单类型的地址指针变量。如图3所示,两个指令:
%1.ptr = getelementptr inbounds ([2 x double]* @a,i32 0,i64 1)
%1.ptr = store double 4.0
最终替换成:
@a.1 = store double 4.0
两个指令:
%1.ptr = getelementptr inbounds ([2 x double]* @a,i32 0,i64 0)
%1 = load double* %1.ptr
最终替换成:
%1 = load double * @a.0
两个指令:
%y = getelementptr inbounds %struct pair * @z,i32 0,i32 1
%y = store double %add
替换成:
%z.y = store double %add
两个指令:
%2.ptr = getelementptr inbounds([2 x double]* @a,i32 0, i64 1)
%2 = load double * %2.ptr
替换成:
%2 = load double %a.1
两个指令:
%y1= getelementptr inbounds %struct pair * @z,i32 0,i32 1
%3 = load double * %y1
替换成:
%3 = load double* %z.y
然后提取代码中的存取指令。经上述处理后,图3中的路径s1->s3->s4->s-error能够提取出以下存取指令:
@a.0 = store double 2.3
@a.1 = store double 4.3
@cond = store i32 0
%0 = load i32* @cond
%1 = load double * @a.0
%z.y = store double %add
%2 = load double %a.1
%3 = load double* %z.y
然后将上述存取指令中的地址指针变量对应至指针指向变量上。于是得到以下的第一约束:
@a.0.v = 2.3
@a.1.v = 4.3
@cond.v=0
%0 = @cond.v
%1 = @a.0.v
%z.y.v = %add
%2 = @a.1.v
%3 = @z.y.v
也就是步骤S3是提取存取指令作为数据约束的步骤。
步骤S4,中从细化的中间指令集中提取算术和比较指令作为第二约束。如算术:%add = fadd double %1, 2.0表示成算术约束后为:%add = %1+2.0。对于比较指令需要根据路径的条件进行提取。如路径s1至s3中,比较指令%0!=0需满足为false,因此将该比较指令取反后得到%0==0作为约束,路径s4至s-error中,%2==%3需满足为false,因此将该比较指令取反后得到%2!=%3
步骤S3中得到第一约束和步骤S4得到的第二约束合并为最终数据约束:
@a.0.v = 2.3
@a.1.v = 4.3
@cond.v=0
%0 = @cond.v
%0==0
%1 = @a.0.v
%add = %1+2.0
%z.y.v = %add
%2 = @a.1.v
%3 = @z.y.v
%2!=%3
上述步骤S3、S4、S5更为简化的表述为:提取细化后中间指令集中的存取指令、算术指令以及比较指令作为数据约束。至此,指定路径上的程序代码表达为数据约束形式,由此,可以根据该数据约束通过约束求解器求解,当约束求解器求解后能够得到解,那么可以认为该路径可达,否则不可达。通过程序路径的可达分析为程序代码分析、测试、验证等多项任务服务。

Claims (4)

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

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710480725.9A CN107180193B (zh) 2017-06-22 2017-06-22 一种将程序代码转换成数据约束的方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710480725.9A CN107180193B (zh) 2017-06-22 2017-06-22 一种将程序代码转换成数据约束的方法和装置

Publications (2)

Publication Number Publication Date
CN107180193A CN107180193A (zh) 2017-09-19
CN107180193B true CN107180193B (zh) 2020-03-27

Family

ID=59844392

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710480725.9A Active CN107180193B (zh) 2017-06-22 2017-06-22 一种将程序代码转换成数据约束的方法和装置

Country Status (1)

Country Link
CN (1) CN107180193B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111444112B (zh) * 2020-04-27 2023-12-12 南京大学 一种基于共享不可行路径池的代码并行验证方法和装置
CN112416365B (zh) * 2020-11-18 2024-05-24 中信银行股份有限公司 文件转换方法、装置及存储介质

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2012059026A (ja) * 2010-09-09 2012-03-22 Hitachi Ltd ソースコード変換方法およびソースコード変換プログラム
CN102799529B (zh) * 2012-07-13 2015-11-25 北京航空航天大学 一种动态的二进制代码测试用例生成方法

Also Published As

Publication number Publication date
CN107180193A (zh) 2017-09-19

Similar Documents

Publication Publication Date Title
US9081586B2 (en) Systems and methods for customizing optimization/transformation/ processing strategies
WO2019226384A1 (en) Semantic comparison of computer compiler traces
CN110187988B (zh) 适用于虚函数和函数指针的静态函数调用图构建方法
US9081626B2 (en) Method and apparatus for converting software
JPH08202545A (ja) ターゲット言語コードを生成するためのオブジェクト指向システム及びその方法
US20060195828A1 (en) Instruction generator, method for generating instructions and computer program product that executes an application for an instruction generator
JPH05342298A (ja) シミュレーション装置
CN108197027B (zh) 软件性能优化方法、可存储介质、计算机、计算机程序
CN103294598A (zh) 一种源代码检查方法及装置
EP3940482A1 (en) Analysis device, analysis method, and analysis program
US5712791A (en) Method and apparatus for designing a circuit by analyzing selected artificial hardware dependencies inserted into a dynamic dependency graph
CN107180193B (zh) 一种将程序代码转换成数据约束的方法和装置
JP2018073054A (ja) オブジェクト分析装置、オブジェクト分析方法、及びプログラム
US20150020051A1 (en) Method and apparatus for automated conversion of software applications
EP3570173B1 (en) Equivalence verification apparatus and equivalence verification program
EP2972880B1 (en) Kernel functionality checker
CN104461569B (zh) 一种基于matlab的c/c++程序生成辅助方法
CN108132799B (zh) 过程间静态程序分析信息提取方法、装置及设备
US9361119B1 (en) Active code component identification and manipulation for preprocessor variants
Wang et al. Extracting requirements models from natural-language document for embedded systems
JP5163172B2 (ja) ソフトウェアテスト項目編集支援装置およびソフトウェアテスト項目編集支援方法
EP3940483A1 (en) Graph display device, graph display method, and graph display program
US9606779B2 (en) Data processing system and data simulation method in the system
JP2011154568A (ja) 情報処理装置、プログラム検証方法およびプログラム
Jacob et al. Domain-specific languages for developing and deploying signature discovery workflows

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