[发明专利]一种基于LLVM的内存泄露的静态检测方法及系统有效
申请号: | 201910993650.3 | 申请日: | 2019-10-18 |
公开(公告)号: | CN110865899B | 公开(公告)日: | 2023-09-05 |
发明(设计)人: | 陶琦;李骊 | 申请(专利权)人: | 北京华捷艾米科技有限公司 |
主分类号: | G06F11/07 | 分类号: | G06F11/07;G06F9/50 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 100193 北京市海淀区*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 llvm 内存 泄露 静态 检测 方法 系统 | ||
1.一种基于LLVM的内存泄露的静态检测方法,其特征在于,包括:
在LLVM编译器中初始化3个空的局部数组:第一数组、第二数组、第三数组;
遍历所有块,将所有运行路径存储到第一数组中;
遍历第一数组中的所有路径,经历每条路径时:
将所有动态内存分配首次分配的变量添加到第二数组中,并将堆中活跃变量信息的开始信息部分存储在该活跃变量的记录信息中;
若存在指向堆的变量释放函数,则从第二数组中删除该变量的记录信息;
当第二数组中的变量被重新赋值或赋值给其他变量时,更新第二数组中的记录信息;若发生内存泄露,将内存泄露变量的信息存储到第三数组中;
在每条路径经历结束时,遍历第二数组和第三数组,输出内存泄露变量的活跃信息,清空第二数组和第三数组。
2.根据权利要求1所述的一种基于LLVM的内存泄露的静态检测方法,其特征在于,所述初始化3个空的局部数组具体是在LLVM编译器的第一预设函数中初始化。
3.根据权利要求2所述的一种基于LLVM的内存泄露的静态检测方法,其特征在于,所述遍历所有块,将所有运行路径存储到第一数组,包括:
从第一预设函数的入口开始经历不同的块,经历到含有退出函数指令的块时,产生一条路径;
继续经历其他块,将产生的每条路径上的块的信息作为一个记录存储到第一数组。
4.根据权利要求1所述的一种基于LLVM的内存泄露的静态检测方法,其特征在于,在所述初始化3个空的局部数组之前,还包括:
创建指令文件,在指令文件中创建并注册指令类,所述指令类继承自LLVM编译器框架中的第一预设类;
在所述遍历第一数组中的所有路径结束后,还包括:
将指令文件添加到编译文件中编译,生成库,加载该库,运行在相应中间文件中,得到输出信息。
5.根据权利要求1所述的一种基于LLVM的内存泄露的静态检测方法,其特征在于,所述当第二数组中的变量被重新赋值或赋值给其他变量时更新第二数组中的记录信息,其中第二数组中的变量包含关联变量。
6.根据权利要求5所述的一种基于LLVM的内存泄露的静态检测方法,其特征在于,所述当第二数组中的变量被重新赋值时,更新第二数组中的记录信息,包括以下三种情况:
1)如果这个变量没有关联变量,则在第二数组中添加这个变量的活跃信息的结束信息;将这个变量的记录信息拷贝到第三数组中;
如果变量是通过动态内存分配重新赋值的,修改第二数组这个变量的初始活跃信息为被现在赋值的信息,并清空变量的结束活跃信息;
如果变量不是通过动态内存分配重新赋值的,则从第二数组中删除这个变量的记录;
2)如果这个变量有关联变量,则将其中一个关联变量覆盖该变量在第二数组中的记录,并删除该关联变量的记录;
如果这个变量是通过动态内存分配重新赋值的,就再在第二数组中生成一条该变量活跃信息的新记录;
3)如果这个变量本身就是一个关联变量,则在第二数组中删除这个变量的信息;
如果变量是通过动态内存分配重新赋值的,就再在第二数组中生成一条该变量活跃信息的新记录。
7.根据权利要求1所述的一种基于LLVM的内存泄露的静态检测方法,其特征在于,所述将所有动态内存分配首次分配的变量添加到第二数组中,包括:将所有使用LLVM中第二预设函数和第一运算符首次分配的变量添加到第二数组中;其中,第二预设函数为用于动态内存分配的函数,第一运算符为用于动态分配和撤销内存的运算符。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京华捷艾米科技有限公司,未经北京华捷艾米科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201910993650.3/1.html,转载请声明来源钻瓜专利网。