[发明专利]一种内存访问异常的检测方法及装置有效
申请号: | 201510086609.X | 申请日: | 2015-02-17 |
公开(公告)号: | CN104636256B | 公开(公告)日: | 2017-10-24 |
发明(设计)人: | 朱浩;王淑静;刘国兴;曹新平 | 申请(专利权)人: | 中国农业银行股份有限公司 |
主分类号: | G06F11/36 | 分类号: | G06F11/36;G06F21/52 |
代理公司: | 北京集佳知识产权代理有限公司11227 | 代理人: | 王宝筠 |
地址: | 100005 北*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 内存 访问 异常 检测 方法 装置 | ||
技术领域
本申请涉及编译技术领域,特别是涉及一种内存访问异常的检测方法及装置。
背景技术
内存访问异常通常表现为动态内存分配造成的内存泄露,以及程序运行时的内存访问越界。具体的,内存泄漏是指程序利用malloc等函数在运行时向操作系统动态的申请内存空间,由于程序临时退出或程序员并未在源代码内调用free函数进行释放,导致所在进程长期占用内存资源的问题;内存访问越界则是由于程序计算异常、代码书写不规范等导致的越界访问、或对内存的非法篡改的问题。这些问题可能导致程序在运行期出现很难预测的结果,因此,如何尽可能的检测、判断可能存在漏洞,并尽可能的减少误判率是目前的研究热点。
在现有技术中,针对内存访问异常中的动态内存分配造成的内存泄漏问题的检测,通常是在程序运行时,统计全部被分配的内存地址,然后在程序结束时,再次统计其中未被释放的内存块来进行的。然而,由于只能在程序结束时才进行统计与判断,一方面,由于程序中分支结构的存在,程序的一次运行不能覆盖所有的程序分支,有些错误不能通过程序的运行暴露出来,从而在一定程度上降低了检错效率;另一方面,由于它只能反馈未被释放的内存块的首地址,且由于这些首地址一般是指虚拟地址,而程序每次运行时的虚拟地址均是动态处理,也就说这些虚地址除了虚拟页号是相同的,其余的地址是变化的,这不便于程序员查找到内存泄漏的具体位置。
在现有技术中,针对内存访问异常中的程序运行时的内存访问越界问题的检测,通常是对每块独立内存区域进行首尾标记,且在程序运行时反复的进行首尾标记查找以及比较,来实现对于内存访问越界的判断。然而,由于程序在运行时,每次进行内存访问时均需要进行首尾标志符号查找,并判断是否越界,将严重影响程序的执行性能,除此之外,现有技术也无法处理栈溢出的场景。
可见,现有技术无法对内存访问异常的问题进行准确、高效地检测。
发明内容
有鉴于此,本申请实施例提供一种内存访问异常的检测方法及装置,以实现对内存访问异常问题的准确、高效检测。
为了实现上述目的,本申请实施例提供的技术方案如下:
一种内存访问异常的检测方法,包括:
对源代码进行排查和词法分析、语法分析以及语义分析,生成控制流图、数据依赖图、第一列表文件和第二列表文件;所述第一列表文件中包括所述源代码内的静态数组占用的内存的静态内存信息,或所述源代码内的动态分配的内存的动态内存信息;所述第二列表文件中包括所述源代码内的动态内存分配库函数的函数信息;
根据所述控制流图构建所述源代码的全局函数调用图,根据所述全局函数调用图、所述第二列表文件和所述数据依赖图,对所述源代码进行动态内存分配的匹配性检测;
构建虚拟执行平台,根据所述第一列表文件、所述控制流图和所述数据依赖图提取虚拟执行路径,实现对动态内存分配造成的内存泄露以及程序运行时的内存访问越界的检测操作。
优选地,所述对源代码进行排查和词法分析、语法分析以及语义分析,生成控制流图、数据依赖图、第一列表文件和第二列表文件,包括:
调用轻量级静态检测工具对源代码进行初步排查;
对所述源代码进行词法、语法分析,对所述源代码内的静态数组占用、动态申请的内存所占用的字节数、名称进行标记,生成第一列表文件,并对动态内存分配库函数所在的源文件及函数名称、调用参数进行标记,生成第二列表文件;
根据所述源代码的分支跳转和函数调用关系,将所述源代码切分为多个基本块,并分析每个基本块之间的跳转关系,根据所述跳转关系生成控制流图,并根据所述源代码的变量之间的数据依赖关系,生成数据依赖图。
优选地,所述根据所述控制流图构建所述源代码的全局函数调用图,包括:
提取所述控制流图内的函数的内入口基本块、出口基本块,统计所述入口基本块的入度和所述出口基本块的出度,并合并所述入口基本块和所述出口基本块对应的节点,构建节点之间的连接关系,为每一个独立源程序生成一个函数调用图;
遍历第一函数调用图内存在出度且在所述第一函数调用图无后继节点的节点,判断与第二函数调用图内的全局函数节点是否存在调用关系,如果存在,则添加从第一函数调用图到第二函数调用图的有向边;遍历第二函数调用图内存在出度且在所述第二函数调用图无后继节点的节点,判断与第一函数调用图内的全局函数节点是否存在调用关系,如果存在,则添加从第二函数调用图到第一函数调用图的有向边;依次处理每个函数调用图,查找到所有节点的后续节点,并删除标准库函数的后续节点,生成全局函数调用图。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国农业银行股份有限公司,未经中国农业银行股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201510086609.X/2.html,转载请声明来源钻瓜专利网。
- 上一篇:一种送料盘
- 下一篇:基于改进网络协议的移动数据同步中间件的实现方法