一种基于符号执行的内存泄漏检测方法与流程

文档序号:13289147阅读:172来源:国知局
技术领域本发明属于软件工程和软件测试领域,尤其涉及一种软件内存泄漏检测方法,主要利用符号执行技术来解决静态内存泄漏分析的误报问题和动态测试的漏报问题。

背景技术:
在C/C++程序中,内存泄漏是指程序中动态分配的内存由于某种原因没有释放,导致系统无法再次分配该内存。内存泄漏分为两种情况:引用丢失和忘记释放。引用丢失是指失去了所有指向动态分配内存对象的指针或引用,使得该内存对象不可达。忘记释放是指动态分配的内存虽然有指针或引用可达,但在程序运行余下部分没有访问和释放。静态分析内存泄漏不用实际运行程序,而是分析源代码的结构来检测内存泄漏。静态分析一般是先为代码建立模型,定义内存泄漏缺陷的模式,然后在代码中查询匹配预定义的错误模式,得到错误报告。动态分析方法通过实时监控内存的分配和访问状态来实现对内存泄漏缺陷的检测。一般采用插桩的方式在测试程序中插入监视代码,检查内存的分配,使用和释放情况。符号执行指的是使用符号变量代替具体变量,不执行程序的前提下模拟程序执行来进行相关分析的技术。相对于给程序一个普通的输入,符号执行提供符号来表示任意的输入值。程序执行时把具体的操作替换为相应的符号操作。当程序运行到基于符号化变量的分支时,系统同时沿着两条路径运行,并在每条路径上维护一个称为路径条件的约束集合。路径条件表示程序沿着这条路径执行应满足的约束。当一条路径终止或遇到错误,把路径条件解析成具体值,能得到一个测试用例。如果把这个测试用例输入到原始的测试代码,它能沿着相同的路径执行并触发同样的错误。LLVM是一个模块化和可重用的编译器的工具集合。它包含大量对C/C++源代码,中间代码的编译和优化处理工具。LLVMPass是一个用来实现程序的转换和优化的框架。Pass以LLVM中间代码作为输入,提供了大量API让程序员能够在中间代码级别上查找,插入和删除指令。静态内存泄漏分析是按照代码的结构模型和规则来查找内存泄漏,由于模型的不完备性,只能尽可能多找到疑似内存泄漏的情况,因此会有很多误报。大量的静态分析的疑似内存泄漏警报,需要逐条人工验证,这个过程费时费力。而动态测试内存泄漏的方法,需要测试用例驱动测试,没有测试用例经过的代码就检查不出是否泄漏。而且由于没有目标,动态测试需要对整个被测代码插桩,运行效率不高。

技术实现要素:
针对现有技术中存在的内存泄漏缺陷,本发明利用静态分析指导动态测试的混合方法,提出一种基于符号执行的内存泄漏检测方法,解决静态内存泄漏分析的误报问题和动态测试的漏报问题。为了实现本发明的发明目的,本发明的技术方案为,一种基于符号执行的内存泄漏检测方法:首先对于被测试的源代码,使用静态分析工具处理,得到内存泄漏警报;然后把源代码和内存泄漏警报,同时输入插桩器,得到插桩后的代码;接着,把插桩后的代码输入测试用例生成模块,生成大量测试用例并执行所有测试用例。每个测试用例运行结束后都有对目标内存泄漏情况汇报,最后综合所有测试执行的输出,对内存泄漏测试结果进行判定。判定结果是在静态分析报告的基础上,进一步把内存泄漏分为MUST-LEAK,LIKELY-NOT-LEAK,BLOAT和MAY-LEAK四类。其中,MUST-LEAK类型表示该内存一定泄漏;LIKELY-NOT-LEAK表示该泄漏很可能是错的;BLOAT表示虽然该内存不太可能泄漏,但在疑似泄漏点之后没有访问,应该提前释放;最后没有测试用例覆盖到其路径的泄漏归为MAY-LEAK;最后只有MAY-LEAK类别需要人工验证。本发明所述的基于符号执行的内存泄漏检测方法步骤如下:1)对于被测试的源代码,使用静态分析工具处理,得到内存泄漏警报;11)对静态分析工具输出的内存泄漏警报信息进行预处理,得到内存泄漏的位置信息和程序路径,整理成能识别的格式并保存在文件中;12)一个静态分析内存泄漏警报记为p=(a,lb11,lb22,…,e),包括内存分配点a,分支点lb和泄漏点e。分支点lb的上标b∈{T,F
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1