[发明专利]一种基于模式的Python代码内存泄漏检测方法有效
申请号: | 202110586274.3 | 申请日: | 2021-05-27 |
公开(公告)号: | CN113407442B | 公开(公告)日: | 2022-02-18 |
发明(设计)人: | 陈洁;姜涛;俞东进;胡海洋 | 申请(专利权)人: | 杭州电子科技大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 杭州君度专利代理事务所(特殊普通合伙) 33240 | 代理人: | 杨舟涛 |
地址: | 310018*** | 国省代码: | 浙江;33 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 模式 python 代码 内存 泄漏 检测 方法 | ||
1.一种基于模式的Python代码内存泄漏检测方法,其特征在于,包括以下步骤:
S1、输入项目的源代码,遍历项目中的所有代码文件,加载每一个Python代码文件利用Python标准库中的ast模块得到每一个Python代码文件对应的抽象语法树
S2、利用抽象解释器技术基于步骤S1获得的抽象语法树进行类型推断,得到类型树其中类型树中的节点表示抽象类型,节点之间的关系表示从属关系;
S3、遍历步骤S2获得的类型树中的每个实例类型i,获取每个实例类型i在类型树中的所有子节点,然后使用预定义的内存泄漏模式检查每个子节点b是否存在内存泄漏,如果满足其中一个内存泄漏模式,则记录引起内存泄漏的循环引用,每一个循环引用记录为一个节点序列[v0,v1,...vn],其中节点序列中的每个节点vi为类型树中的节点,相邻的节点之间存在引用关系,并且满足v0=vn;
步骤S2中通过类型推断得到类型树的具体步骤如下:
S21、根据Python定义的类型,封装若干个抽象类型;
S22、对于每个Python代码文件对应的抽象语法树使用抽象解释器进行类型推断得到类型树类型树中的每个节点表示一种抽象类型且抽象语法树对应的模块类型加入到类型树T中作为根节点,节点之间的关系表示从属关系即子节点的定义在父节点内;
S23、依次遍历类型树中的每个函数类型的节点,得到所有函数类型;针对每一个函数类型,判断该函数类型是否在类型推断中存在调用,即有没有至少一个调用类型所调用的函数类型是该函数类型;如果有,则跳过继续对下一个函数类型进行判断,如果没有,则将其视为新产生的函数类型并创建一个调用类型,以未知类型作为传入参数,使用抽象解释器调用一次新创建的调用类型。
2.根据权利要求1所述的一种基于模式的Python代码内存泄漏检测方法,其特征在于,步骤S21中封装的抽象类型包括以下11种:
1)模块类型:modid,其中id表示模块的唯一标识符;
2)函数类型:funid,其中id表示函数的唯一标识符;
3)调用类型:invokefun,[τ],τ,其中fun表示该调用的函数类型,[τ]表示该调用需要的参数的类型,τ表示该调用的返回值的类型;
4)类类型:clsid,[cls],其中id表示类的唯一标识符,[cls]表示该类的父类的类型;
5)实例类型:inscls,其中cls表示该实例所属的类类型;
6)方法类型:methfun,ins,其中fun表示函数类型,ins表示该方法所属的实例类型;
7)组合类型:任意类型的集合;
8)字典类型:dictτ,τ,其中两个τ分别表示字典中的健和值的类型;
9)列表类型:listτ,其中τ表示列表中的元素的类型;
10)元组类型:tupleτ,其中τ表示元组中的元素的类型;
11)集合类型:setτ,其中τ表示集合中的元素的类型。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于杭州电子科技大学,未经杭州电子科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110586274.3/1.html,转载请声明来源钻瓜专利网。