【技术实现步骤摘要】
面向内存错误检测的源代码语句插桩方法
[0001]本专利技术涉及计算机软件领域
。
技术介绍
[0002]C
语言是实现系统软件和嵌入式软件的主要编程语言,但是并不提供内存安全性检测机制,使用指针可能导致内存错误,造成系统崩溃或内部数据破坏等
。
常见的内存错误包括空间错误
(
例如缓冲区溢出和越界读取
)、
时间错误
(
例如释放后使用和重复释放
)、
段混淆错误
(
例如使用函数指针作为数据指针,反之亦然,显式地释放非堆对象
)、
以及内存泄漏
。
[0003]有很多方法能够检测内存错误,比如静态分析
、
模型检测和动态分析
。
[0004](1)
静态分析是在不实际执行程序的情况下,对源代码或中间代码的语义和行为进行分析,由此找出可能导致错误的语义或未定义行为的一种软件分析技术
。
它能在软件开发流程的前期就发现代码中的各种漏洞和缺陷,从而提高软件的质量
。
但由于静态分析不运行程序,无法营造程序真实的运行环境,可能会产生漏报和误报
。
[0005](2)
模型检测是一种自动验证的形式化方法,用来检验软件的设计模型是否满足规范
。
主要通过显式状态搜索或隐式不动点计算来验证有穷状态并发系统的模态
、
命题性质
。
但是对于复杂的 ...
【技术保护点】
【技术特征摘要】
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
为被解引用的指针
...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。