面向内存错误检测的源代码语句插桩方法技术

技术编号:39408694 阅读:12 留言:0更新日期:2023-11-19 16:00
本发明专利技术公开了一种面向内存错误检测的源代码语句插桩方法,具体为:步骤1:生成源代码的符号表和抽象语法树;遍历抽象语法树中的所有节点,根据节点类型进行插桩;步骤2:编译插桩后的源代码,生成目标系统上的执行文件;步骤3:当执行文件运行到已替换或插入的代码段时,会对相应的程序进行内存错误检测,并在发现错误的时候报告出错误对应的源代码的位置

【技术实现步骤摘要】
面向内存错误检测的源代码语句插桩方法


[0001]本专利技术涉及计算机软件领域


技术介绍

[0002]C
语言是实现系统软件和嵌入式软件的主要编程语言,但是并不提供内存安全性检测机制,使用指针可能导致内存错误,造成系统崩溃或内部数据破坏等

常见的内存错误包括空间错误
(
例如缓冲区溢出和越界读取
)、
时间错误
(
例如释放后使用和重复释放
)、
段混淆错误
(
例如使用函数指针作为数据指针,反之亦然,显式地释放非堆对象
)、
以及内存泄漏

[0003]有很多方法能够检测内存错误,比如静态分析

模型检测和动态分析

[0004](1)
静态分析是在不实际执行程序的情况下,对源代码或中间代码的语义和行为进行分析,由此找出可能导致错误的语义或未定义行为的一种软件分析技术

它能在软件开发流程的前期就发现代码中的各种漏洞和缺陷,从而提高软件的质量

但由于静态分析不运行程序,无法营造程序真实的运行环境,可能会产生漏报和误报

[0005](2)
模型检测是一种自动验证的形式化方法,用来检验软件的设计模型是否满足规范

主要通过显式状态搜索或隐式不动点计算来验证有穷状态并发系统的模态

命题性质

但是对于复杂的大型软件系统,使用模型检测技术可能会导致状态空间爆炸

[0006](3)
动态分析是一种在运行时对程序相关性质进行验证的轻量化技术

在运行程序的基础上,通过监测程序的执行情况来收集程序运行时行为,然后分析收集到的行为和状态,检查程序是否存在安全性问题,可以有效地保障软件的可靠性

[0007]目前已有很多
C
程序内存安全性动态分析工具,主要采用的方法包括基于对象技术

扩展指针技术和基于指针技术

[0008](1)
基于对象技术通过记录内存对象的地址范围,在通过指针访问内存时,检测所访问的内存区域是否在记录的地址范围内

这种技术能够检测出大部分的内存错误,但是也存在检测范围不够全面

插桩后的程序执行效率低的问题,例如无法检测子对象越界错误

[0009](2)
扩展指针技术通过扩展指针类型,使指针不仅记录一个内存地址,还能够记录该指针所指向内存块的基地址和大小

指针在源代码中的行列号等信息,在通过指针访问内存时,检测该内存访问是否在其所指向内存块的有效区间内

但是这种技术改变了原有的指针类型和内存布局,导致插桩后的程序存在兼容性问题,这种技术还需要对每个指针进行指针类型转换,导致插桩后的程序执行效率低

[0010](3)
基于指针技术是扩展指针技术的一个改进,该技术是将指针所指对象的边界信息记录在一个独立的数据结构中,称为指针元数据

当一个指针被创建时,将它的指针元数据初始化为其所指对象的上下界地址;当指针被赋值为另一个指针的值时,新指针的元数据从原指针中继承,但是程序运行时具有时间消耗过大的问题

[0011]智能指针技术是对基于指针技术的改进

通过为每个指针变量分配一个指针元数
据,记录该指针可以安全访问内存空间的上下界和存储状态,并对指向同一对象的指针进行计数

在指针赋值运算

函数传递指针参数

返回指针值时,更新指针元数据;在使用指针访问内存时,通过检查访问的地址是否在上下界范围内来检测空间内存错误,通过检查指针元数据中记录的存储状态信息来检测时间内存错误;在释放指针变量时,调整指针元数据的状态节点,且检测是否出现多次释放错误

[0012]基于智能指针技术的动态分析工具需要对程序的抽象语法树进行遍历和插桩,在源代码中的对象创建

对象释放

赋值

函数调用

内存读写等语句处插入代码片段,用于更新指针元数据和检测内存错误

最后通过编译运行插桩后的程序,在运行时检测和定位源代码中的内存错误

但是由于
C
程序语言结构的复杂性和多样性,在对一些大型项目进行插桩时,经常遇到对一些特定语句插桩失败或者插桩后的程序无法正确编译的问题


技术实现思路

[0013]专利技术目的:为了解决上述现有技术存在的问题,本专利技术提供了一种面向内存错误检测的源代码语句插桩方法

[0014]技术方案:本专利技术提供了一种面向内存错误检测的源代码语句插桩方法,具体包括如下步骤:
[0015]步骤1:利用编译器生成源代码的符号表和抽象语法树;遍历抽象语法树中的所有节点,根据节点类型进行插桩,具体为:对指针变量

含有指针成员的结构体变量

指针数组或含有指针成员的结构体数组的定义和初始化语句进行插桩,从而在运行时创建指针元数据;对指针变量

含有指针成员的结构体变量

指针数组或含有指针成员的结构体数组的赋值语句进行插桩,从而在运行时更新指针元数据;对函数定义和调用语句进行插桩,从而在运行时传递参数和返回值的指针元数据;对指针解引用

数组下标访问

结构体成员访问语句进行插桩,从而利用指针元数据检查对内存的访问是否存在内存错误;
[0016]步骤2:利用编译器编译插桩后的源代码,生成目标系统上的可执行文件;
[0017]步骤3:将生成的可执行文件部署到目标系统并运行,当可执行文件运行到已替换或插入的代码段时,会对相应的程序进行内存错误检测,并在发现错误的时候准确报告出错误对应的源代码的位置

[0018]进一步的,针对步骤1中的指针数组,若该指针数组存储的是程序标签地址,则在源代码中插入函数调用
PRFpmd_set(&pmd,snda,stat,base,bound)
,更新数组元素的指针元数据,其中
PRFpmd_set
为函数名,
pmd
为数组元素的指针元数据结构体变量,
snda
是程序标签的状态节点,
stat
是程序标签的内存状态,
base

bound
是程序标签的内存地址的下界和上界

[0019]进一步的,针对步骤1中的含有指针成员的结构体变量或者含有指针成员的结构体数组,若该结构体变本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.
面向内存错误检测的源代码语句插桩方法,其特征在于:具体包括如下步骤:步骤1:利用编译器生成源代码的符号表和抽象语法树;遍历抽象语法树中的所有节点,根据节点类型进行插桩,具体为:对指针变量

含有指针成员的结构体变量

指针数组或含有指针成员的结构体数组的定义和初始化语句进行插桩,从而在运行时创建指针元数据;对指针变量

含有指针成员的结构体变量

指针数组或含有指针成员的结构体数组的赋值语句进行插桩,从而在运行时更新指针元数据;对函数定义和调用语句进行插桩,从而在运行时传递参数和返回值的指针元数据;对指针解引用

数组下标访问

结构体成员访问语句进行插桩,从而利用指针元数据检查对内存的访问是否存在内存错误;步骤2:利用编译器编译插桩后的源代码,生成目标系统上的执行文件;步骤3:将生成的执行文件部署到目标系统并运行,当执行文件运行到已替换或插入的代码段时,会对相应的程序进行内存错误检测,并在发现错误的时候准确报告出错误对应的源代码的位置
。2.
根据权利要求1所述的面向内存错误检测的源代码语句插桩方法,其特征在于:针对步骤1中的指针数组,若该指针数组存储的是程序标签地址,则在源代码中插入函数调用
PRFpmd_set(&pmd,snda,stat,base,bound)
,更新数组元素的指针元数据,其中
PRFpmd_set
为函数名,
pmd
为数组元素的指针元数据结构体变量,
snda
是程序标签的状态节点,
stat
是程序标签的内存状态,
base

bound
是程序标签的内存地址的下界和上界
。3.
根据权利要求1所述的面向内存错误检测的源代码语句插桩方法,其特征在于:针对步骤1中的含有指针成员的结构体变量或者含有指针成员的结构体数组,若该结构体变量或者结构体数组中的结构体类型定义中嵌套包含结构体

联合体或枚举类型的成员,并且该内嵌的结构体

联合体或枚举类型的定义是匿名类型,则在该匿名类型定义中插入一个唯一的标识符,作为新的类型名,并在插桩需要用到该匿名类型时使用这个新的类型名
。4.
根据权利要求1所述的面向内存错误检测的源代码语句插桩方法,其特征在于:针对步骤1中的指针解引用,若被解引用的指针
ptr
的类型是使用
typedef
关键字定义的结构体指针
SP
,则将该结构体指针解引用
*ptr
改写为:
*(SP)PRFcheck_dpv(&pmd13,ptr,size13,file_name13,func_name13,line13,column13,ptr_name13)
,其中,函数
PRFcheck_dpv()
通过检查指针元数据来判断指针解引用是否导致内存错误,
pmd13
为被解引用的指针
...

【专利技术属性】
技术研发人员:陈哲刘一辰
申请(专利权)人:南京航空航天大学
类型:发明
国别省市:

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

1