[发明专利]一种基于LLVM的内存泄露的静态检测方法及系统有效
申请号: | 201910993650.3 | 申请日: | 2019-10-18 |
公开(公告)号: | CN110865899B | 公开(公告)日: | 2023-09-05 |
发明(设计)人: | 陶琦;李骊 | 申请(专利权)人: | 北京华捷艾米科技有限公司 |
主分类号: | G06F11/07 | 分类号: | G06F11/07;G06F9/50 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 100193 北京市海淀区*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 llvm 内存 泄露 静态 检测 方法 系统 | ||
本发明公开了一种基于LLVM的内存泄露的静态检测方法及系统,利用C++堆分配指令信息,并在程序退出的时候,通过变量的活跃信息来判断可能的内存溢出的情况,能够在运行程序前发现那些浅显的表层的内存泄露的地方,减少以后程序修改迭代的次数;利用LLVM的框架模块化的特性,使用它成熟稳定的代码接口,技术方案简洁直接,不仅在静态编译的过程中能更早的发现内存泄露的地方,并且保证了代码实现的简单性,同时也使得结果更容易被测试。
技术领域
本发明涉及信息处理,尤其是一种基于LLVM的内存泄露的静态检测方法及系统。
背景技术
在C++语法中,内存分配只会在栈(stack)中或者在堆(heap)中。栈中的变量的分配和释放是由系统管理的,无需人工管理;但是堆中分配的变量,是由程序员自己维护的,需要程序员自己释放,如果忘了释放在堆中分配的空间,系统新的变量就会一直申请不到这个空间,就会造成内存泄露了。内存泄露包括在函数中跨函数的变量内存泄露等比较复杂的情况,也包括一部分内存泄露情况较为简单的情况。
现有的静态内存泄露的检测方法,其过程都非常复杂,而且中间代码生成都需要自己实现,整个过程调试也更加繁琐。解决内存泄露问题的方法有两种,一种是通过人工反复通读代码,检查是否有遗忘的未释放的变量;另一种是程序运行的时候查看内存是否一直在增加来判断是否有内存泄露,即使判断存在内存泄露,也无法快速确定内存泄露的地点,最终还是要回到第一种方法。但在代码量较大的情况下,人工查找非常不便、费时费力。
发明内容
发明目的:针对上述现有技术存在的缺陷,本发明旨在提供一种基于LLVM的内存泄露的静态检测方法及系统。
技术方案:一种基于LLVM的内存泄露的静态检测方法,包括:
在LLVM编译器中初始化3个空的局部数组:第一数组、第二数组、第三数组;
遍历所有块,将所有运行路径存储到第一数组中;
遍历第一数组中的所有路径,经历每条路径时:
将所有动态内存分配首次分配的变量添加到第二数组中,并将堆中活跃变量信息的开始信息部分存储在该活跃变量的记录信息中;
若存在指向堆的变量释放函数,则从第二数组中删除该变量的记录信息;
当第二数组中的变量被重新赋值或赋值给其他变量时,更新第二数组中的记录信息;若发生内存泄露,将内存泄露变量的信息存储到第三数组中;
在每条路径经历结束时,遍历第二数组和第三数组,输出内存泄露变量的活跃信息,清空第二数组和第三数组。
进一步的,所述初始化3个空的局部数组具体是在LLVM编译器的第一预设函数中初始化。
进一步的,所述遍历所有块,将所有运行路径存储到第一数组,包括:
从第一预设函数的入口开始经历不同的块,经历到含有退出函数指令的块时,产生一条路径;
继续经历其他块,将产生的每条路径上的块的信息作为一个记录存储到第一数组。
进一步的,在所述初始化3个空的局部数组之前,还包括:
创建指令文件,在指令文件中创建并注册指令类,所述指令类继承自LLVM编译器框架中的第一预设类;
在所述遍历第一数组中的所有路径结束后,还包括:
将指令文件添加到编译文件中编译,生成库,加载该库,运行在相应中间文件中,得到输出信息。
进一步的,所述当第二数组中的变量被重新赋值或赋值给其他变量时更新第二数组中的记录信息,其中第二数组中的变量包含关联变量。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京华捷艾米科技有限公司,未经北京华捷艾米科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201910993650.3/2.html,转载请声明来源钻瓜专利网。