论文部分内容阅读
内存泄漏是一类显著影响软件性能、有效性和安全性的程序缺陷。面向内存泄漏的静态分析和动态测试技术得到了广泛而深入的研究。静态分析技术能够发现程序中较多的缺陷,但其并不实际执行目标程序,往往报告出的大量警报中含有误报成分。人工地确认这些警报的正确性是一项沉闷而耗时的工作,其限制了静态分析技术在软件开发中的实用性。针对内存泄漏的动态测试技术则依赖于高质量的测试用例集合,且动态检测技术具有较高的运行时开销。在本文中,我们提出了一种验证并分类内存泄漏静态警报的动态确认技术,以降低人工确认静态内存泄漏警报的时间和人力成本。本文给出了对内存泄漏静态警报进行分类的标准,从而将静态泄漏警报划分为几个类别,开发人员可以对不同类别的警报给予区分处理。在本文的方法中,静态警报包含了疑似泄漏对应的程序路径片段。我们利用测试生成方法产生的测试输入来在运行时覆盖这些路径片段,并追踪运行时内存对象的状态。在运行时收集的状态信息和对静态警报的测试覆盖情况,将被用于确认和分类内存泄漏的静态警报。具体来说,本文的主要工作如下:1.提出并形式化地描述了对内存泄漏静态警报进行分类的方法。静态内存泄漏警报被分类为四个类别:MUST-LEAK, LIKELY-NOT-LEAK, BLOAT,和MAY-LEAK。其中,MUST-LEAK类的警报揭示了没有被释放的内存对象。虽然我们无法给出理论上的保证,我们认为LIKELY-NOT-LEAK类的警报有很大可能是误报。BLOAT类别的警报虽然也不是真正的泄漏,但其揭示了一种低效率的使用情况,这类警报可以被修复以提高程序的整体性能。经过上述分类后,对静态警报的人工确认将主要集中在MAY-LEAK类别的警报上,从而降低了人工确认静态警报的成本。2.基于确认和分类静态内存泄漏警报的标准,建立了面向内存泄漏的动态确认方法的基本框架。该基本框架包含了获取内存泄漏静态警报、对静态泄漏警报和程序代码进行预处理、测试生成、运行时追踪和分类等几个方面的工作。在此基础之上,提出基于符号执行的动态确认方法SymVal和基于混合执行的动态确认方法ConcVal。同时,通过利用静态警报中疑似路径片段的信息,本文还提出了一种路径导向的混合执行算法,用于优化ConcVal方法中的测试生成工作。我们还详细描述了如何利用运行时对内存对象状态的记录和更新操作,对静态内存泄漏警报进行分类。3.基于上述工作,实现了动态确认内存泄漏警报的SymVal和ConcVal方法,并通过实验研究来评估这些工作。我们选取了来自不同程序包的十个基准程序进行实验,并从准确性、可用性和时空开销等角度论述了本文方法的有效性。另外,我们还针对具有一定规模的程序texinfo进行了实例研究,从可扩展性和实用性的角度论述并验证了本文提出的方法。