CN111736846A - 一种面向动态分析的源代码插桩改进方法 - Google Patents
一种面向动态分析的源代码插桩改进方法 Download PDFInfo
- Publication number
- CN111736846A CN111736846A CN202010539967.2A CN202010539967A CN111736846A CN 111736846 A CN111736846 A CN 111736846A CN 202010539967 A CN202010539967 A CN 202010539967A CN 111736846 A CN111736846 A CN 111736846A
- Authority
- CN
- China
- Prior art keywords
- arr
- array
- instrumentation
- struct
- memory
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种面向动态分析的源代码插桩改进方法,包括对多文件项目、无长度数组和匿名结构体的源代码插桩方法,并通过编译、执行插桩后的程序实现对程序执行过程的动态分析。相比于现有技术,本发明能够克服常规源代码插桩方法在对多文件项目和复杂语法结构进行插桩时存在的问题,从而实现对源代码的正确插桩,并通过编译、执行插桩后的程序实现对程序执行过程的动态分析,提高软件的可靠性和安全性。
Description
技术领域
本发明属于计算机软件领域,特别涉及了一种源代码插桩改进方法。
背景技术
随着信息科技的发展,计算机软件逐渐渗透到人类生活的方方面面,如交通出行、教育、医疗、航空、航天、国防等领域,而软件故障所造成的后果也越来越不容忽视。尤其对于安全关键软件,一个小的软件错误就可能带来不可估量的损失,甚至导致致命的后果。例如:Mydoom病毒的传播导致了大量个人数据的泄露,并造成了380亿美元的损失,而该病毒的传播仅仅是利用系统bug在操作系统中开了一个后门实现的,即让未经授权的用户可以访问别人的个人数据;阿丽亚娜5号的发射失败造成了近85亿美元的损失,而导致失败的原因仅仅是系统软件试图将一个64位的数字塞入16位的空间而产生的溢出。因此,人们越来越多地关注和重视软件的可靠性和安全性。
由于C语言接近底层硬件、运行速度快、执行效率高、可移植性强,一些对性能要求较高的软件系统,如底层的操作系统、嵌入式软件以及复杂的计算软件等,都采用C语言编写。但是,由于C语言本身可以直接对内存操作,且没有对访问内存等操作进行安全检查,导致使用C语言编写的程序可能出现较为严重的内存安全错误。常见的内存安全错误有空间内存错误如缓冲区溢出、越界访问等,以及时间内存错误如空指针解引用等。这些错误容易导致程序失效或崩溃,或者被人利用进行网络攻击。对于一些安全性极高的医疗、航空、航天、国防等系统,一个小的软件错误可能会给人的生命和财产安全带来严重的危害,因此对于C程序内存安全性的检测是非常重要的。
动态分析是对C程序内存安全性进行检测的主流方法之一。基于指针的动态分析方法的主要思想是:为指针变量创建一个指针元数据,用来记录该指针变量所指向内存块的下界、上界和有效状态等信息;当指针变量赋值或者作为函数参数传递时,更新这个指针变量的指针元数据;在指针变量解引用时,根据指针元数据记录的信息来检测是否存在内存错误,例如被访问的内存块是否在下界和上界之间、是否处于有效状态等。
为了在运行时实现对C程序内存安全性的动态分析,要求首先在编译时对C程序的代码进行插桩,即插入用于运行时检测的代码段。常见的插桩方法包括对程序的中间代码或二进制代码进行插桩。但是这些插桩方法会导致插桩后的代码无法被优化,程序的运行效率较低。这些插桩方法还会导致优化敏感,也就是说,当编译优化等级过高时,可能无法正确检测到程序中的内存错误。
源代码插桩可以很好地解决以上中间代码插桩和二进制代码插桩中存在的问题。但是,由于C程序项目通常由多个源文件组成,且每个源文件使用不同的编译选项、具有不同的依赖关系,经常导致插桩后的源代码无法被正确编译或者无法被正确运行。此外,C语言中一些复杂的语法结构也经常被不正确地处理,导致插桩错误。因此,需要对常规的源代码插桩方法进行改进。
发明内容
为了解决上述背景技术提到的技术问题,本发明提出了一种面向动态分析的源代码插桩改进方法。
为了实现上述技术目的,本发明的技术方案为:
一种面向动态分析的源代码插桩改进方法,包括对多文件项目、无长度数组和匿名结构体的源代码插桩方法,并通过编译、执行插桩后的程序实现对程序执行过程的动态分析;对多文件项目的源代码插桩方法包括如下步骤:
(1)构造编译数据库,编译数据库为文件或数据库记录的形式,记录了编译器对每个源文件进行编译所使用的编译命令,其中包含了编译所需的全部要素,包括每个源文件对应的执行编译命令的工作目录路径、源文件的相对路径和编译选项;
(2)解析编译数据库,为自动插桩工具构造每个源文件所对应的编译选项,从而保证插桩工具对源文件的正确解析;
(3)对于编译数据库中的所有源文件,根据对应的编译选项对源文件进行解析和插桩。
进一步地,对无长度数组的源代码插桩方法包括如下步骤:
(a)通过分析数组声明或定义,获取该数组的长度;
(b)对于每个数组下标表达式,如果该数组的长度为未定义,则根据如下规则构造数组内存的上界,并进行插桩:
(b1)对于无长度数组定义“int arr[]”,对数组下标表达式“arr[n]”进行插桩后的结果如下:
arr[PRFcheck_dpc_ss(arr,arr+1,arr,n,sizeof(int))]
其中,实参arr表示数组内存的下界,实参arr+1表示数组内存的上界,实参n表示被访问的数组元素的下标,实参sizeof(int)表示被访问的数组元素的大小,函数PRFcheck_dpc_ss用于检测数组下标表达式是否存在越界访问错误;
(b2)对于外部数组声明“extern int arr[]”,为该数组内存定义一个足够大的上界(unsigned)-1,对数组下标表达式“arr[n]”进行插桩后的结果如下:
arr[PRFcheck_dpc_ss(arr,(char*)arr+((unsigned)-1),arr,n,sizeof(int))]
其中,(char*)arr表示将数组内存的下界转化为字符指针类型的值;
(b3)对于伸缩数组,如果所在结构体的内存空间是通过malloc在堆中分配的空间,那么该数组内存的上界为结构体的上界,对数组下标表达式“ptr->arr[n]”进行插桩后的结果如下:
ptr->arr[PRFcheck_dpc_ss(ptr->arr,get_bound(&ptr),ptr->arr,n,sizeof(int))]
其中,ptr是一个指向结构体的指针变量,ptr->arr表示该结构体中的伸缩数组内存的下界,&ptr表示指针变量ptr的地址值,函数get_bound用于在运行时通过指针变量地址获取该指针变量所指向内存块的上界;
如果所在结构体的内存空间是通过定义结构体变量而分配的空间,那么该数组内存的上界和下界相同,对数组下标表达式“s.arr[n]”进行插桩后的结果如下:
s.arr[PRFcheck_dpc_ss(s.arr,s.arr,s.arr,n,sizeof(int))]
其中,s是一个结构体变量,s.arr表示该结构体中的伸缩数组内存的下界。
进一步地,对匿名结构体的源代码插桩方法包括如下步骤:
(A)对于每个匿名结构体类型定义,为该定义生成一个唯一标识符ID,并使用ID构造该结构体类型的新标识符struct_ID,并将该新标识符插入该匿名结构体类型定义,作为该结构体类型的名字;
(B)对于每个解引用表达式“*p”,如果被解引用的指针是一个匿名结构体类型的指针或者数组,则构造该匿名结构体类型的唯一标识符ID,并使用ID构造该结构体类型的新标识符struct_ID;
(C)使用标识符struct_ID作为匿名结构体类型的名字,对解引用表达式“*p”进行插桩后的结果如下:
*(struct struct_ID*)PRFcheck_dpv(PRFpmd_tbl_lookup(&p),p,sizeof(struct struct_ID))
其中,&p表示指针变量p的地址值,函数PRFpmd_tbl_lookup用于在运行时通过指针变量地址获取该指针变量所对应的指针元数据,包括该指针变量所指向内存块的下界、上界和有效状态信息,实参p表示解引用表达式所访问内存块的起始地址,实参sizeof(struct struct_ID)表示解引用表达式所访问内存块的大小,函数PRFcheck_dpv用于检测解引用表达式是否存在内存访问错误。
采用上述技术方案带来的有益效果:
本发明在常规源代码插桩方法处理单文件和常见语法结构的基础上,通过提供对多文件项目、无长度数组和匿名结构体的正确插桩方法,实现对程序有效的动态分析,从而提高软件的可靠性和安全性。
附图说明
图1是本发明中对多文件项目进行源代码插桩的工作流程图;
图2是本发明中对无长度数组进行源代码插桩的工作流程图;
图3是本发明中对匿名结构体进行源代码插桩的工作流程图。
具体实施方式
以下将结合附图,对本发明的技术方案进行详细说明。
本发明在常规源代码插桩方法的基础上,提供对多文件项目、无长度数组和匿名结构体的源代码插桩方法,通过这些改进实现对C程序源代码的插桩和内存安全性动态分析。本发明的目的是通过下述技术方案实现的。
1、多文件项目的源代码插桩
如图1所示,对一个多文件项目进行源代码插桩的具体步骤如下:
第1步:构造编译数据库。编译数据库可以是文件或数据库记录的形式,记录了编译器对每个源文件进行编译所使用的编译命令,其中包含了每个源文件对应的执行编译命令的工作目录路径、源文件的相对路径、编译选项等编译所需的全部要素。
在本实施例中,使用Bear或者CMake自动构造多文件项目的编译数据库。如果项目编译生成多个可执行文件,那么对每个可执行文件构造一个编译数据库,包含生成该可执行文件依赖的所有源文件所对应的编译命令。例如,编译数据库记录了编译源文件hello.c所使用的编译命令“gcc-c hello.c–I/include–D macro”,工作目录路径为“/home/”,源文件的相对路径为“hello.c”。
第2步:解析编译数据库,为自动插桩工具构造每个源文件所对应的编译选项,从而保证插桩工具对源文件的正确解析。
在本实施例中,使用解析器自动获取编译数据库中每个源文件所对应的编译选项。例如,对于源文件hello.c得到如下编译选项:“–I/include–D macro”。
第3步:对于编译数据库中的所有源文件,根据对应的编译选项对源文件进行解析和插桩。最后通过编译、执行插桩后的程序,实现对程序执行过程的动态分析。
在本实施例中,使用编译选项“–I/include–D macro”对源文件hello.c进行解析和插桩。最后通过编译、执行插桩后的hello.c,实现对程序执行过程的动态分析。
2、对无长度数组的源代码插桩
为了实现对内存安全性的动态分析,对于有长度数组定义“int arr[10]”,对所有的数组下标表达式“arr[n]”进行插桩后的结果为:
arr[PRFcheck_dpc_ss(arr,(char*)arr+sizeof(arr),arr,n,sizeof(int))]
其中,实参arr表示数组内存的下界,实参(char*)arr+sizeof(arr)表示数组内存的上界,实参n表示被访问的数组元素的下标,实参sizeof(int)表示被访问的数组元素的大小,函数PRFcheck_dpc_ss用于检测数组下标表达式是否存在越界访问错误,即被访问的数组元素是否在数组内存的下界和上界之间。但是,对于无长度数组定义“int arr[]”,使用sizeof(arr)无法获取数组内存的正确大小,导致在插桩结果中使用(char*)arr+sizeof(arr)来表示数组内存的上界是错误的。因此需要采用本发明的源代码插桩方法。
如图2所示,采用本发明方法对三种不同类型的无长度数组进行源代码插桩的具体步骤如下:
第1步:通过分析数组声明或定义,获取该数组的长度。
在本实施例中,通过分析无长度数组定义“int arr[]”和外部数组声明“externint arr[]”,获取该数组的长度为未定义。通过分析如下包含伸缩数组成员的结构体类型定义,获取该数组成员的长度为未定义:
第2步:对于每个数组下标表达式,如果该数组的长度为未定义,则根据如下规则构造数组内存的上界,并进行插桩:
(1)对于无长度数组定义“int arr[]”,其实际长度为1,所以该数组内存的上界为arr+1。因此对数组下标表达式“arr[n]”进行插桩后的结果为:
arr[PRFcheck_dpc_ss(arr,arr+1,arr,n,sizeof(int))]
在本实施例中,对数组下标表达式“arr[1]”进行插桩后的结果为:
arr[PRFcheck_dpc_ss(arr,arr+1,arr,1,sizeof(int))]
(2)对于外部数组声明“extern int arr[]”,数组的定义在其他源文件,所以在当前源文件中无法获取到它的长度。为此,为该数组内存定义一个足够大的上界(unsigned)-1。因此对数组下标表达式“arr[n]”进行插桩后的结果为:
arr[PRFcheck_dpc_ss(arr,(char*)arr+((unsigned)-1),arr,n,sizeof(int))]
在本实施例中,对数组下标表达式“arr[1]”进行插桩后的结果为:
arr[PRFcheck_dpc_ss(arr,(char*)arr+((unsigned)-1),arr,1,sizeof(int))]
(3)对于伸缩数组,由于伸缩数组只能作为结构体类型的最后一个成员,所以它的实际长度取决于所在结构体的大小。如果所在结构体的内存空间是通过malloc在堆中分配的空间,那么该数组内存的上界为结构体的上界。因此对数组下标表达式“ptr->arr[n]”进行插桩后的结果为:
ptr->arr[PRFcheck_dpc_ss(ptr->arr,get_bound(&ptr),ptr->arr,n,sizeof(int))]
其中,ptr是一个指向结构体的指针变量,函数get_bound用于在运行时通过指针变量地址获取该指针变量所指向内存块的上界。如果所在结构体的内存空间是通过定义结构体变量而分配的空间,那么该数组内存的上界和下界相同。因此对数组下标表达式“s.arr[n]”进行插桩后的结果为:
s.arr[PRFcheck_dpc_ss(s.arr,s.arr,s.arr,n,sizeof(int))]
其中s是一个结构体变量,s.arr表示该结构体中的伸缩数组内存的下界。
在本实施例中,对于指针变量定义“struct flex*ptr=malloc(100)”,由于指针变量所指向的结构体是通过malloc在堆中分配的空间,所以该伸缩数组内存的上界为该指针变量所指向的结构体的上界。因此对数组下标表达式“ptr->arr[1]”进行插桩后的结果为:
ptr->arr[PRFcheck_dpc_ss(ptr->arr,get_bound(&ptr),ptr->arr,1,sizeof(int))]
在本实施例中,对于结构体变量定义“struct flex s”,由于结构体的内存空间是通过定义结构体变量而分配的空间,所以该伸缩数组内存的上界和下界相同。因此对数组下标表达式“s.arr[1]”进行插桩后的结果为:
s.arr[PRFcheck_dpc_ss(s.arr,s.arr,s.arr,1,sizeof(int))]
3、对匿名结构体的源代码插桩
为了实现对内存安全性的动态分析,对于结构体指针变量定义“struct st{inta;}*p”,对所有的解引用表达式“*p”进行插桩后的结果为:
*(struct st*)PRFcheck_dpv(PRFpmd_tbl_lookup(&p),p,sizeof(struct st))
其中,函数PRFpmd_tbl_lookup用于在运行时通过指针变量地址获取该指针变量所对应的指针元数据(包括该指针变量所指向内存块的下界、上界和有效状态等信息),实参p表示解引用表达式所访问内存块的起始地址,实参sizeof(struct st)表示解引用表达式所访问内存块的大小,函数PRFcheck_dpv用于检测解引用表达式是否存在内存访问错误,即解引用表达式所访问的内存块是否在指针变量所指向内存块的下界和上界之间、内存状态是否有效。但是,对于匿名结构体类型,插桩工具无法获取到该结构体类型的名字,导致无法在插桩结果中使用struct st来表示结构体类型。因此需要采用本发明的源代码插桩方法。
如图3所示,采用本发明方法对匿名结构体进行源代码插桩的具体步骤如下:
第1步:对于每个匿名结构体类型定义,为该定义生成一个唯一标识符ID,并使用ID构造该结构体类型的新标识符struct_ID,并将该标识符插入该匿名结构体类型定义,作为该结构体类型的名字。
在本实施例中,对于匿名结构体类型定义“struct{int a;}*p”,使用源代码语法树中该匿名结构体类型定义所在节点的地址作为唯一标识符ID(假设为1),并构造该结构体类型的新标识符struct_1,并将该标识符插入该匿名结构体类型定义,作为该结构体类型的名字。插桩后的结果为:“struct struct_1{int a;}*p”。
第2步:对于每个解引用表达式“*p”,如果被解引用的指针是一个匿名结构体类型的指针或者数组,则构造该匿名结构体类型的唯一标识符ID,并使用ID构造该结构体类型的新标识符struct_ID。
在本实施例中,对于解引用表达式“*p”,被解引用的指针p是一个匿名结构体类型的指针,所以使用源代码语法树中该匿名结构体类型定义所在节点的地址作为唯一标识符ID(值为1),并构造该结构体类型的新标识符struct_1。
第3步:使用标识符struct_ID作为匿名结构体类型的名字,对解引用表达式“*p”进行插桩后的结果为:
*(struct struct_ID*)PRFcheck_dpv(PRFpmd_tbl_lookup(&p),p,sizeof(struct struct_ID))
在本实施例中,使用标识符struct_1作为匿名结构体类型的名字,对解引用表达式“*p”进行插桩后的结果为:
*(struct struct_1*)PRFcheck_dpv(PRFpmd_tbl_lookup(&p),p,sizeof(structstruct_1))
经过上述步骤的操作,即可实现对多文件项目、无长度数组和匿名结构体的有效源代码插桩。最后通过编译、执行插桩后的程序,实现对程序执行过程的动态分析。
综上所述,本发明设计了一种面向动态分析的源代码插桩方法。本发明在常规源代码插桩方法处理单文件和常见语法结构的基础上,通过提供对多文件项目、无长度数组和匿名结构体的正确插桩方法,实现对程序有效的动态分析,从而提高软件的可靠性和安全性。
实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。
Claims (3)
1.一种面向动态分析的源代码插桩改进方法,其特征在于:包括对多文件项目、无长度数组和匿名结构体的源代码插桩方法,并通过编译、执行插桩后的程序实现对程序执行过程的动态分析;对多文件项目的源代码插桩方法包括如下步骤:
(1)构造编译数据库,编译数据库为文件或数据库记录的形式,记录了编译器对每个源文件进行编译所使用的编译命令,其中包含了编译所需的全部要素,包括每个源文件对应的执行编译命令的工作目录路径、源文件的相对路径和编译选项;
(2)解析编译数据库,为自动插桩工具构造每个源文件所对应的编译选项,从而保证插桩工具对源文件的正确解析;
(3)对于编译数据库中的所有源文件,根据对应的编译选项对源文件进行解析和插桩。
2.根据权利要求1所述面向动态分析的源代码插桩改进方法,其特征在于:对无长度数组的源代码插桩方法包括如下步骤:
(a)通过分析数组声明或定义,获取该数组的长度;
(b)对于每个数组下标表达式,如果该数组的长度为未定义,则根据如下规则构造数组内存的上界,并进行插桩:
(b1)对于无长度数组定义“int arr[]”,对数组下标表达式“arr[n]”进行插桩后的结果如下:
arr[PRFcheck_dpc_ss(arr,arr+1,arr,n,sizeof(int))]
其中,实参arr表示数组内存的下界,实参arr+1表示数组内存的上界,实参n表示被访问的数组元素的下标,实参sizeof(int)表示被访问的数组元素的大小,函数PRFcheck_dpc_ss用于检测数组下标表达式是否存在越界访问错误;
(b2)对于外部数组声明“extern int arr[]”,为该数组内存定义一个足够大的上界(unsigned)-1,对数组下标表达式“arr[n]”进行插桩后的结果如下:
arr[PRFcheck_dpc_ss(arr,(char*)arr+((unsigned)-1),arr,n,sizeof(int))]
其中,(char*)arr表示将数组内存的下界转化为字符指针类型的值;
(b3)对于伸缩数组,如果所在结构体的内存空间是通过malloc在堆中分配的空间,那么该数组内存的上界为结构体的上界,对数组下标表达式“ptr->arr[n]”进行插桩后的结果如下:
ptr->arr[PRFcheck_dpc_ss(ptr->arr,get_bound(&ptr),ptr->arr,n,sizeof(int))]
其中,ptr是一个指向结构体的指针变量,ptr->arr表示该结构体中的伸缩数组内存的下界,&ptr表示指针变量ptr的地址值,函数get_bound用于在运行时通过指针变量地址获取该指针变量所指向内存块的上界;
如果所在结构体的内存空间是通过定义结构体变量而分配的空间,那么该数组内存的上界和下界相同,对数组下标表达式“s.arr[n]”进行插桩后的结果如下:
s.arr[PRFcheck_dpc_ss(s.arr,s.arr,s.arr,n,sizeof(int))]
其中,s是一个结构体变量,s.arr表示该结构体中的伸缩数组内存的下界。
3.根据权利要求1或2所述面向动态分析的源代码插桩改进方法,其特征在于:对匿名结构体的源代码插桩方法包括如下步骤:
(A)对于每个匿名结构体类型定义,为该定义生成一个唯一标识符ID,并使用ID构造该结构体类型的新标识符struct_ID,并将该新标识符插入该匿名结构体类型定义,作为该结构体类型的名字;
(B)对于每个解引用表达式“*p”,如果被解引用的指针是一个匿名结构体类型的指针或者数组,则构造该匿名结构体类型的唯一标识符ID,并使用ID构造该结构体类型的新标识符struct_ID;
(C)使用标识符struct_ID作为匿名结构体类型的名字,对解引用表达式“*p”进行插桩后的结果如下:
*(struct struct_ID*)PRFcheck_dpv(PRFpmd_tbl_lookup(&p),p,sizeof(structstruct_ID))其中,&p表示指针变量p的地址值,函数PRFpmd_tbl_lookup用于在运行时通过指针变量地址获取该指针变量所对应的指针元数据,包括该指针变量所指向内存块的下界、上界和有效状态信息,实参p表示解引用表达式所访问内存块的起始地址,实参sizeof(struct struct_ID)表示解引用表达式所访问内存块的大小,函数PRFcheck_dpv用于检测解引用表达式是否存在内存访问错误。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010539967.2A CN111736846B (zh) | 2020-06-15 | 2020-06-15 | 一种面向动态分析的源代码插桩改进方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010539967.2A CN111736846B (zh) | 2020-06-15 | 2020-06-15 | 一种面向动态分析的源代码插桩改进方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111736846A true CN111736846A (zh) | 2020-10-02 |
CN111736846B CN111736846B (zh) | 2021-06-22 |
Family
ID=72649126
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010539967.2A Active CN111736846B (zh) | 2020-06-15 | 2020-06-15 | 一种面向动态分析的源代码插桩改进方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111736846B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112306470A (zh) * | 2020-10-19 | 2021-02-02 | 南京航空航天大学 | 一种复杂同步语言程序的化简转化和自动验证方法 |
CN113641389A (zh) * | 2021-08-31 | 2021-11-12 | 广东九联科技股份有限公司 | 基于OpenCPU的软件升级方法、装置及设备 |
CN114527986A (zh) * | 2021-12-31 | 2022-05-24 | 北京邮电大学 | 面向c++语言的源代码去匿名化方法以及相关设备 |
US12038825B2 (en) | 2022-06-16 | 2024-07-16 | International Business Machines Corporation | Partial program execution with attribute-based data conversion for dynamic program analysis |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020184615A1 (en) * | 2001-04-25 | 2002-12-05 | Sumner William Earl | System and method for selectively and automatically modifying the source code of a computer program |
CN102141958A (zh) * | 2011-03-09 | 2011-08-03 | 中国矿业大学 | 面向缺陷的路径覆盖测试数据进化生成方法 |
CN102214142A (zh) * | 2011-07-15 | 2011-10-12 | 南京大学 | 无痕可管理的源代码手动定义标志插桩方法 |
CN102222041A (zh) * | 2011-06-15 | 2011-10-19 | 深圳市运通信息技术有限公司 | 一种基于嵌入式软件的测试分析系统及方法 |
US20130167129A1 (en) * | 2011-12-27 | 2013-06-27 | Infosys Limited | Systems and methods for demarcating information related to one or more blocks in an application |
CN104636257A (zh) * | 2015-03-13 | 2015-05-20 | 胡兢玉 | 基于sql覆盖的数据库应用软件自动化测试方法 |
CN106940654A (zh) * | 2017-02-15 | 2017-07-11 | 南京航空航天大学 | 源代码中内存错误的自动检测和定位方法 |
-
2020
- 2020-06-15 CN CN202010539967.2A patent/CN111736846B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020184615A1 (en) * | 2001-04-25 | 2002-12-05 | Sumner William Earl | System and method for selectively and automatically modifying the source code of a computer program |
CN102141958A (zh) * | 2011-03-09 | 2011-08-03 | 中国矿业大学 | 面向缺陷的路径覆盖测试数据进化生成方法 |
CN102222041A (zh) * | 2011-06-15 | 2011-10-19 | 深圳市运通信息技术有限公司 | 一种基于嵌入式软件的测试分析系统及方法 |
CN102214142A (zh) * | 2011-07-15 | 2011-10-12 | 南京大学 | 无痕可管理的源代码手动定义标志插桩方法 |
US20130167129A1 (en) * | 2011-12-27 | 2013-06-27 | Infosys Limited | Systems and methods for demarcating information related to one or more blocks in an application |
CN104636257A (zh) * | 2015-03-13 | 2015-05-20 | 胡兢玉 | 基于sql覆盖的数据库应用软件自动化测试方法 |
CN106940654A (zh) * | 2017-02-15 | 2017-07-11 | 南京航空航天大学 | 源代码中内存错误的自动检测和定位方法 |
Non-Patent Citations (2)
Title |
---|
DÁVID TENGERI 等: "Negative Effects of Bytecode Instrumentation on Java Source Code Coverage", 《2016 IEEE 23RD INTERNATIONAL CONFERENCE ON SOFTWARE ANALYSIS, EVOLUTION, AND REENGINEERING (SANER)》 * |
周晓宇等: "基于源代码插桩的C程序内存使用错误动态检测", 《舰船电子工程》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112306470A (zh) * | 2020-10-19 | 2021-02-02 | 南京航空航天大学 | 一种复杂同步语言程序的化简转化和自动验证方法 |
CN113641389A (zh) * | 2021-08-31 | 2021-11-12 | 广东九联科技股份有限公司 | 基于OpenCPU的软件升级方法、装置及设备 |
CN113641389B (zh) * | 2021-08-31 | 2024-02-09 | 广东九联科技股份有限公司 | 基于OpenCPU的软件升级方法、装置及设备 |
CN114527986A (zh) * | 2021-12-31 | 2022-05-24 | 北京邮电大学 | 面向c++语言的源代码去匿名化方法以及相关设备 |
CN114527986B (zh) * | 2021-12-31 | 2023-12-26 | 北京邮电大学 | 面向c++语言的源代码去匿名化方法以及相关设备 |
US12038825B2 (en) | 2022-06-16 | 2024-07-16 | International Business Machines Corporation | Partial program execution with attribute-based data conversion for dynamic program analysis |
Also Published As
Publication number | Publication date |
---|---|
CN111736846B (zh) | 2021-06-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Feist et al. | Slither: a static analysis framework for smart contracts | |
CN111736846B (zh) | 一种面向动态分析的源代码插桩改进方法 | |
US7484205B2 (en) | Preprocessor-based source code instrumentation | |
Maffeis et al. | An operational semantics for JavaScript | |
Necula et al. | CIL: Intermediate language and tools for analysis and transformation of C programs | |
Ellison et al. | An executable formal semantics of C with applications | |
Ali et al. | Application-only call graph construction | |
Groß | Fuzzil: Coverage guided fuzzing for javascript engines | |
US7584458B2 (en) | Source code annotation language | |
Rountev | Precise identification of side-effect-free methods in Java | |
Kosmatov et al. | An optimized memory monitoring for runtime assertion checking of C programs | |
US9183114B2 (en) | Error detection on the stack | |
Castanos et al. | On the benefits and pitfalls of extending a statically typed language JIT compiler for dynamic scripting languages | |
Annamaa et al. | An interactive tool for analyzing embedded SQL queries | |
Suwimonteerabuth et al. | jMoped: A Java bytecode checker based on Moped | |
St-Amour et al. | Feature-specific profiling | |
Priya et al. | Verifying verified code | |
Kloibhofer et al. | SymJEx: symbolic execution on the GraalVM | |
Chen et al. | A source-level instrumentation framework for the dynamic analysis of memory safety | |
Bolotnikov et al. | Interprocedural static analysis for finding bugs in go programs | |
Lencevicius | On-the-fly query-based debugging with examples | |
Guo | A scalable mixed-level approach to dynamic analysis of C and C++ programs | |
Reich et al. | Lazy generation of canonical test programs | |
Bari et al. | OpenSHMEM Checker-A Clang based static checker for OpenSHMEM | |
Mühlberg et al. | Symbolic object code analysis |
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 |