[发明专利]基于流敏感上下文敏感指向图的内存泄漏检测方法有效
申请号: | 200910227074.8 | 申请日: | 2009-12-01 |
公开(公告)号: | CN101710303A | 公开(公告)日: | 2010-05-19 |
发明(设计)人: | 王戟;马晓东;董威;徐厚峰;刘万伟 | 申请(专利权)人: | 中国人民解放军国防科学技术大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 国防科技大学专利服务中心 43202 | 代理人: | 郭敏 |
地址: | 410073 *** | 国省代码: | 湖南;43 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 敏感 上下文 指向 内存 泄漏 检测 方法 | ||
技术领域
本发明主要涉及计算机程序中内存泄漏的静态检测方法,尤其是一种利用流敏感、上下文敏感的指向图来检测程序中内存泄漏的方法。
背景技术
C、C++等语言中都支持指针的使用,这可以使代码变得灵活、简洁,但是由此引发的内存错误也是各类错误中比较难以分析、追踪和消除的。内存泄漏就是一种典型的错误。在编写程序阶段,编程人员往往很难确定程序在运行的时候需要多少内存,因此动态内存分配是必不可少的操作。指针和动态内存分配提供了方便、灵活的内存操作机制。一块内存的分配者同时也承担着释放它的责任。如果只是不断的分配,而没有相应的释放操作,程序将占用越来越多的内存,最终会耗尽计算机系统的内存,导致计算机系统崩溃。对于大型的、需要长时间运行的程序——例如操作系统——来说,内存泄漏错误有可能是致命的。但内存泄漏的检测是一项比较困难的工作,因为与其他错误不同,内存泄漏没有明显的、易于观察的错误行为,无法回收的内存并不能立刻对程序以及系统的运行产生影响。因此,内存泄漏的检测是一项十分有意义而又面临着重大挑战的任务。
内存泄漏有多种不同的定义,这取决于如何定义一块内存单元的生命周期。若一块内存在生命周期结束时仍未被释放,则认为有内存泄漏发生。而生命周期的定义主要可以分为以下三种:基于引用、基于可达性和基于活跃性的定义等。基于引用的生命周期是指:如果一个计算机内存单元没有被任何指针所指向,则生命周期结束。
目前检测内存泄漏的方法主要有动态方法和静态方法两大类。动态方法是在程序的运行过程中收集相关信息,判断是否有内存泄漏发生,但该检测方法过于依赖程序运行所用的测试用例的质量,并且由于程序实际上的执行路径可能有无穷多条,一般情况下无法产生足够多的测试用例以检查所有可能的执行路径,也就难以检测到所有的错误。静态方法不需要动态执行程序,可以找到所有可能的内存泄漏错误。采用静态方法进行检测的工具有很多,包括PREfix,SATURN,LCLint和Metal等,但该方法的主要缺陷是误报率比较高。因此,如何在保持检测效率的同时降低误报率,是静态方法的研究热点之一。
现有的围绕内存泄漏的静态检测主要有基于形态分析的检测方法、基于指针向图的检测方法和基于特殊模型的检测方法等。
Hackett和Rugina提出了一种利用形态分析(shape analysis)来检测内存泄漏的方法。该方法可以对程序的存储形态做局部推理,而不是做全局推理。它使用了形态抽象的技术,根据变量的指向信息把所有的内存划分为若干个相互独立的区域。针对每个区域做独立的分析,而与其他区域无关,这提高了分析的效率。另外,还可以通过参数来设置分析精度,精度越高,相互独立的内存区域就越多,计算复杂性随之升高。该方法的不足在于其健壮性不够,某些表达式或者特定语句顺序会对内存区域的划分产生重大影响,从而导致算法效率或者精度的急剧降低。
Orlovich和Rugina提出了一种基于指针分析的数据流分析方法,该方法以需求驱动的方式执行。传统的穷尽式方法以整个程序作为检测对象,提供程序中所有与该内存泄漏相关的信息;而需求驱动方式则只检测所关心的特定语句,只提供与这些语句相关的信息。Orlovich等人的方法利用反证法来判断内存泄漏是否存在,它以流不敏感、上下文不敏感的指向图作为输入,甚至不需要程序的完整代码,只检测代码段的内存泄漏错误。由于流不敏感、上下文不敏感的精度较低,有可能导致该方法产生较多的误报。
Heine和Lam提出了基于ownership模型的内存泄漏检测方法。该方法为动态分配的内存指定了持有者,持有者是一个指针或者结构中的指针域。每个动态分配的而尚未被释放的内存都有唯一的持有者,它的责任是释放该内存或者把持有者的身份转移到另一个指针或者指针域中。该方法最终转化为一个线性约束方程组的求解问题,通过方程组解的存在与否来判断是否有内存泄漏发生。这种方法的不足之处在于:只有“固定位置(fixed location)”才能够充当持有者。对于一些比较复杂的表达式和操作,比如链表、树等,基于ownership模型的方法就难以处理或者产生误报。因为在这些操作中,可能要求动态分配的内存来充当持有者。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国人民解放军国防科学技术大学,未经中国人民解放军国防科学技术大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/200910227074.8/2.html,转载请声明来源钻瓜专利网。
- 上一篇:伸缩式阀门开关器
- 下一篇:一种获得冲击响应、频偏估计的方法及装置