一种内存访问异常的检测方法及装置的制造方法

文档序号:8319069阅读:345来源:国知局
一种内存访问异常的检测方法及装置的制造方法
【技术领域】
[0001] 本申请涉及编译技术领域,特别是涉及一种内存访问异常的检测方法及装置。
【背景技术】
[0002] 内存访问异常通常表现为动态内存分配造成的内存泄露,以及程序运行时的内存 访问越界。具体的,内存泄漏是指程序利用malloc等函数在运行时向操作系统动态的申请 内存空间,由于程序临时退出或程序员并未在源代码内调用free函数进行释放,导致所在 进程长期占用内存资源的问题;内存访问越界则是由于程序计算异常、代码书写不规范等 导致的越界访问、或对内存的非法篡改的问题。这些问题可能导致程序在运行期出现很难 预测的结果,因此,如何尽可能的检测、判断可能存在漏洞,并尽可能的减少误判率是目前 的研宄热点。
[0003] 在现有技术中,针对内存访问异常中的动态内存分配造成的内存泄漏问题的检 测,通常是在程序运行时,统计全部被分配的内存地址,然后在程序结束时,再次统计其中 未被释放的内存块来进行的。然而,由于只能在程序结束时才进行统计与判断,一方面,由 于程序中分支结构的存在,程序的一次运行不能覆盖所有的程序分支,有些错误不能通过 程序的运行暴露出来,从而在一定程度上降低了检错效率;另一方面,由于它只能反馈未被 释放的内存块的首地址,且由于这些首地址一般是指虚拟地址,而程序每次运行时的虚拟 地址均是动态处理,也就说这些虚地址除了虚拟页号是相同的,其余的地址是变化的,这不 便于程序员查找到内存泄漏的具体位置。
[0004] 在现有技术中,针对内存访问异常中的程序运行时的内存访问越界问题的检测, 通常是对每块独立内存区域进行首尾标记,且在程序运行时反复的进行首尾标记查找以及 比较,来实现对于内存访问越界的判断。然而,由于程序在运行时,每次进行内存访问时均 需要进行首尾标志符号查找,并判断是否越界,将严重影响程序的执行性能,除此之外,现 有技术也无法处理栈溢出的场景。
[0005] 可见,现有技术无法对内存访问异常的问题进行准确、高效地检测。

【发明内容】

[0006] 有鉴于此,本申请实施例提供一种内存访问异常的检测方法及装置,以实现对内 存访问异常问题的准确、高效检测。
[0007] 为了实现上述目的,本申请实施例提供的技术方案如下:
[0008] 一种内存访问异常的检测方法,包括:
[0009] 对源代码进行排查和词法分析、语法分析以及语义分析,生成控制流图、数据依赖 图、第一列表文件和第二列表文件;所述第一列表文件中包括所述源代码内的静态数组占 用的内存的静态内存信息,或所述源代码内的动态分配的内存的动态内存信息;所述第二 列表文件中包括所述源代码内的动态内存分配库函数的函数信息;
[0010] 根据所述控制流图构建所述源代码的全局函数调用图,根据所述全局函数调用 图、所述第二列表文件和所述数据依赖图,对所述源代码进行动态内存分配的匹配性检 测;
[0011] 构建虚拟执行平台,根据所述第一列表文件、所述控制流图和所述数据依赖图提 取虚拟执行路径,实现对动态内存分配造成的内存泄露以及程序运行时的内存访问越界的 检测操作。
[0012] 优选地,所述对源代码进行排查和词法分析、语法分析以及语义分析,生成控制流 图、数据依赖图、第一列表文件和第二列表文件,包括:
[0013] 调用轻量级静态检测工具对源代码进行初步排查;
[0014] 对所述源代码进行词法、语法分析,对所述源代码内的静态数组占用、动态申请的 内存所占用的字节数、名称进行标记,生成第一列表文件,并对动态内存分配库函数所在的 源文件及函数名称、调用参数进行标记,生成第二列表文件;
[0015] 根据所述源代码的分支跳转和函数调用关系,将所述源代码切分为多个基本块, 并分析每个基本块之间的跳转关系,根据所述跳转关系生成控制流图,并根据所述源代码 的变量之间的数据依赖关系,生成数据依赖图。
[0016] 优选地,所述根据所述控制流图构建所述源代码的全局函数调用图,包括:
[0017] 提取所述控制流图内的函数的内入口基本块、出口基本块,统计所述入口基本块 的入度和所述出口基本块的出度,并合并所述入口基本块和所述出口基本块对应的节点, 构建节点之间的连接关系,为每一个独立源程序生成一个函数调用图;
[0018] 遍历第一函数调用图内存在出度且在所述第一函数调用图无后继节点的节点,判 断与第二函数调用图内的全局函数节点是否存在调用关系,如果存在,则添加从第一函数 调用图到第二函数调用图的有向边;遍历第二函数调用图内存在出度且在所述第二函数调 用图无后继节点的节点,判断与第一函数调用图内的全局函数节点是否存在调用关系,如 果存在,则添加从第二函数调用图到第一函数调用图的有向边;依次处理每个函数调用图, 查找到所有节点的后续节点,并删除标准库函数的后续节点,生成全局函数调用图。
[0019] 优选地,所述根据所述全局函数调用图、所述第二列表文件和所述数据依赖图,对 所述源代码进行动态内存分配的匹配性检测,包括:
[0020] 根据所述第二列表文件,对所述全局函数调用图内的节点进行区分标记;
[0021] 提取所述全局函数调用图内的入口函数节点,通过分析所述数据依赖图,向前追 溯并提取与所述动态内存分配库函数存在数据依赖的前驱节点,删除其它节点;
[0022] 将每个提取的节点在所述全局函数调用图中的前驱节点与后继节点重新建立连 接关系,且保持逻辑序关系不变,生成精简函数调用图;
[0023] 如果任意一个节点内存在针对同一变量的动态内存分配库函数,则向该节点添加 自旋弧,并删除所述精简函数调用图内由于所述自旋弧出现自闭环的边,对所述源代码进 行动态内存分配的匹配性检测。
[0024] 优选地,所述构建虚拟机平台,包括:
[0025] 选择目标处理器平台,基于指令集功能特征,建立指令行为级模拟器;
[0026] 建立所述指令行为级模拟器的过程中,针对条件判断类及分支跳转类指令进行行 为级建模时,添加先进后出的堆栈结构;所述堆栈结构用于保存所述条件判断类及分支跳 转类指令的内存地址、寄存器内的数据的逆状态。
[0027] 优选地,所述根据所述第一列表文件、所述控制流图和所述数据依赖图提取虚拟 执行路径,实现对动态内存分配造成的内存泄露以及程序运行时的内存访问越界的检测操 作,包括:
[0028] 对程序进行虚拟执行,判断是否出现条件判断类及分支跳转类指令,如果出现,保 存所述条件判断类及分支跳转类指令的内存地址、寄存器内的数据的逆状态,并进行入栈; 统计当前执行路径下申请和释放的动态内存的字节数,统计对内存的写操作,并把对内存 的修改写入栈顶记录所对应的内存状态修改链表内;当程序执行到出口函数时,检查申请 和释放的动态内存的字节数是否相同,并根据内存地址,查找导致内存泄露的动态内存分 配库函数;检测完成后,从所述栈结构内读取一条记录,并对虚拟机的程序指针、内存、寄存 器进行恢复;程序运行到栈空为止,实现对动态内存分配造成的内存泄露的检测操作;
[0029] 获得所述第一列表文件内的静态数组占用以及动态申请的内存的内存记录,在链 接期对静态分配的全局数据、局部静态数组分配内存地址,在运行期通过压栈操作计算存 储于程序栈内的局部未初始化数组的栈地址的偏移量,并通过动态内存分配库函数的返回 值获取动态内存分配的内存块;每一条独立的加载、保存指令在函数内的基本块中首次被 执行时,记录访问的内存地址以及所在的内存块,当下一次访问中的目标内存地址不在所 述内存块内时,判定为内存访问越界,实现对程序运行时的内存访问越界的检测操作。
[0030] 一种内存访问异常的检测装置,包括:
[0031] 分析模块,用于对源代码进行排查和词法分析、语法分析以及语义分析,生成控制 流图、数据依赖图、第一列表文件和第二列表文件;所述第一列表文件中包括所述源代码内 的静态数组占用的内存的静态内存信息,或所述源代码内的动态分配的内存的动态内存信 息;所述第二列表文件中包括所述源代码内的动态内存分配库函数的函数信息;
[0032] 检测模块,用于根据所述控制流图构建所述源代码的全局函数调用图,根据所述 全局函数调用图、所述第二列表文件和所述数据依赖图,对所述源代码进行动态内存分配 的匹配性检测;
[0033] 构建模块,用于构建虚拟执行平台,根据所述第一列表文件、所述控制流图和所述 数据依赖图提取虚拟执行路径,实现对动态内存分配造成的内存泄露以及程序运行时的内 存访问越界的检测操作。
[0034] 优选地,所述分析模块,包括:
[0035] 排查单元,用于调用轻量级静态检测工具对源代码进行初步排查;
[0036] 分析单元,用于对所述源代码进行词法、语法分析,对所述源代码内的静态数组占 用、动态申请的内存所占用的字节数、名称进行标记,生成第一列表文件,并对动态内存分 配库函数所在的源文件及函数名称、调用参数进行标记,生成第二列表文件;
[0037] 生成单元,用于根据所述源代码的分支跳转和函数调用关系,将所述源代码切分 为多个基本块,并分析每个基本块之间的跳转关系,根据所述跳转关系生成控制流图,并根 据所述源代码的变量之间的数据依赖关系,生成数据依赖图。
[0038] 优选地,所述检测模块,包括:
[0039] 提取单元,用于提取所述控制流图内的函数的内入口基本块、出口基本块,统计所 述入口基本块的入度和所述出口基本块的出度,并合并所述入口基本块和所述出口基本块 对应的节点,构建节点之间的连接关系,为每一个独立源程序生成一个函数调用图;
[0040] 遍历单元,用于遍历第一函数调用图内存在出度且在所述第一函数调用图无后继 节点的节点,判断与第二函数调用图内的全局函数节点是否存在调用关系,如果存在,则添 加从第一函数调用图到第二函数调用图的有向边;遍历第二函数调用图内存在出度且在所 述第二函数调用图无后继节点的节点,判断与第一函数调用图内的全局函数节点是否存在 调用关系,如果存在,则添加从第二函数调用图到第一函数调用图的有向边;依次处理每个 函数调用图,查找到所有节点的后续节点,并删除标准库函数的后续节点,生成全局函数调 用图。
[0041] 优选地,所述检测模块,包括:
[0042] 标记单元,用于根据所述第二列表文件,对所述全局函数调用图内的节点进行区 分标记;
[0043] 分析单元,用于提取所述全局函数调用图内的入口函数节点,通过分析所述数据 依赖图,向前追溯并提取与所述动态内存分配库函数存在数据依赖的前驱节点,删除其它 节点;
[0044] 生成单元,用于将每个提取的节点在所述全局函数调用图中的前驱节点与后继节 点重新建立连接关系,且保持逻辑序关系不变,生成精简函数调用图;
[0045] 如果任意一个节点内存在针对同一变量的动态内存分配库函数,则向该节点添加 自旋弧,并删除所述精简函数调用图内由于所述自旋弧出现自闭环的边,对所述源代码进 行动态内存分配的匹配性检测。
[0046] 优选地,所述构建模块,包括:
[0047] 选择单元,用于选择目标处理器平台,基于指令集
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1