[发明专利]一种基于抽象语法树的Python程序类型缺陷检测方法有效

专利信息
申请号: 201710376265.5 申请日: 2017-05-22
公开(公告)号: CN108932192B 公开(公告)日: 2020-01-14
发明(设计)人: 陈林;刘畅;徐兆桂;徐宝文 申请(专利权)人: 南京大学
主分类号: G06F11/36 分类号: G06F11/36
代理公司: 暂无信息 代理人: 暂无信息
地址: 210023 *** 国省代码: 江苏;32
权利要求书: 查看更多 说明书: 查看更多
摘要:
搜索关键词: 抽象语法树 错误类型 源代码 程序类型 缺陷代码 缺陷检测 特征向量 结点 标识符 变更 机器学习技术 多分类模型 上下文信息 版本程序 报告信息 标记缺陷 程序文件 可维护性 缺陷分析 缺陷信息 缺陷修复 软件缺陷 匹配 提示 测试 检测 开发 管理
【权利要求书】:

1.一种基于抽象语法树的Python程序类型缺陷检测方法,其特征在于,从软件缺陷追踪系统中获取Python软件中已被修复的缺陷报告信息,并从软件版本控制系统中获取相应Python软件修改前和修改后两个版本的源代码,生成两个版本源程序对应的抽象语法树,匹配抽象语法树,寻找发生变更的函数定义结点,结合从缺陷报告的摘要和描述中抽取的错误类型信息,为函数定义结点标记相应的错误类型,根据函数结点内赋值语句的相关信息生成特征向量,通过机器学习技术在特征向量与错误类型的关系上建立分类模型,对新的Python程序源代码给出可能引发缺陷的函数以及错误类型;该方法包括下列步骤:

1)收集Python软件缺陷报告信息,提取缺陷标识符和错误类型;从软件缺陷追踪系统中收集Python软件中已被修复的缺陷报告信息,包括缺陷标识符、摘要和描述;判断以下9种Python错误类型是否在摘要和描述中出现:ArithmeticError,AttributeError,KeyError,IndexError,IOError,NameError,SyntaxError,TypeError,ValueError;并将其中出现的错误类型加入错误类型列表;

定义1:缺陷标识符是缺陷追踪系统中的唯一数字序列,代表一个特定的缺陷;

2)获取缺陷修复前后两个版本程序的源代码;根据步骤1)中获取的缺陷标识符,从软件版本控制系统的提交记录中找出修改的文件名和对应的修复版本号,并根据文件名和版本号从软件版本控制系统中下载缺陷修复前后两个版本的源代码;

定义1:提交记录是软件版本控制系统中开发者提交程序代码时记录的历史信息,包括提交日期、版本号、开发者姓名、本次提交中修改的文件以及开发者的注释信息,如果该提交修复一个缺陷,则提交记录中会包含缺陷标识符;

定义2:文件名和版本号是软件版本控制系统中用于区分不同软件或同一软件不同版本的标识;

3)生成两个版本源代码对应的抽象语法树,匹配获取变更函数定义结点和未变更函数定义结点并分别标记错误类型;对步骤2)中的包含缺陷的源代码和修复后的源代码进行词法分析和语法分析,利用Python标准库中的ast模块生成抽象语法树,并设置label和value,标识结点类型和内容,同时设置结点标识符;后序遍历两个版本的抽象语法树,依次匹配各个对应结点,寻找缺陷版本源代码对应的抽象语法树中的changed_node以及unchanged_node,使用由步骤1)获取的错误类型列表中的错误类型对changed_node进行标记,使用NoError对unchanged_node进行标记,对于抽象语法树中的FunctionDef结点,使用元组δ=(结点标识符,错误类型列表)记录结点引发错误的情况;

定义1:抽象语法树是源代码抽象语法结构的树状表现形式,每个结点代表源代码中的一种结构;

定义2:Python标准库随Python语言一起发行,包含了诸多能提供系统级功能访问的内建模块;

定义3:ast模块是Python标准库中的一个模块,帮助解析Python抽象语法;

定义4:label表示抽象语法树中结点的类型,类型信息来自Python抽象语法;

定义5:value表示结点的内容,中间结点的value依赖于其label,如赋值语句的value,叶子结点的value即语句的文本表示,如函数调用语句等;

定义6:结点标识符用于唯一标识结点,每个结点不同;

定义7:FunctionDef是ast模块中的一种结点类型,表示函数定义;

定义8:changed_node表示抽象语法树中发生变更的且结点类型为FunctionDef的结点;

定义9:unchanged_node表示抽象语法树中未发生变更的且结点类型为FunctionDef的结点;

定义10:NoError表示结点未发生错误;

4)根据变更函数结点上下文信息,生成缺陷代码特征向量;使用树的中序遍历方式遍历步骤3)中得到的func_def,得到assign_list,统计assign_list中所有出现过的变量名,构成name_list;针对name_list中的每个name,使用pysonar2统计name在func_def中出现过的不同类型的个数,得到func_def中每个name与其类型种类数的映射,构成map;对assign_list中的每个assign_item,记录所有位于赋值符左侧的变量名,构成left_names,并记录所有为与赋值符右侧的变量名,构成right_names,然后通过计算assign_len,min_name_len,max_category,max_call和all_checked,得出缺陷代码特征向量Δ;

定义1:func_def表示抽象语法树中结点类型为FunctionDef的语法结点;

定义2:Assign是ast模块中的一种结点类型,表示赋值;

定义3:assign_list表示赋值结点列表,列表中的元素是赋值结点,其类型为Assign;

定义4:name_list表示变量名称列表,列表中的元素是变量名称;

定义5:name是name_list中的元素,表示变量名称;

定义6:map是由name_list中的name与其类型种类数的映射关系构成的哈希表,哈希表中的每个元素为变量名和类型种类数的映射,形式为:

map={name1:n1,name2:n2,...,namek:nk}

定义7:assign_item是assign_list中的元素,表示一个赋值结点;

定义8:left_names是由assign_item中所有位于赋值符左侧的变量名构成的变量名列表;

定义9:right_names是由assign_item中所有位于赋值符右侧的变量名构成的变量名列表;

定义10:astunparse是Python语言的一个模块,可用于将ast中的语法结点转换为相应的Python源代码;

定义11:assign_len是将assign_item转换成Python源代码程序后所对应的赋值语句的长度;计算过程为:使用astunparse模块将assign_item反向解析,得到对应的源代码字符串,然后利用Python中的len方法对该字符串进行求值,得出赋值语句的长度;

定义12:min_name_len表示left_names中所有变量名长度的最小值;

定义13:max_category表示right_names中变量名对应类型种类数的最大值;

定义14:max_call表示在right_names中的变量名上所直接施加的方法调用次数的最大值;

定义15:all_checked表示right_names中的变量在使用前是否均被执行过类型检查,取值为1或0;计算过程为:使用树的深度优先遍历方法确定func_def到assign_item的路径,得出路径中除func_def和assign_item的所有结点,构成路径结点集合,获取路径结点集合中使用Python内置方法type()或instance()进行操作的结点,提取在这些结点上被传入type()或instance()的不同变量名,记为distinct_names;若right_names为distinct_names的子集,则all_checked为1,否则为0;

定义16:缺陷代码特征向量Δ是由assign_len,min_name_len,max_category,max_call和all_checked组成的特征向量,形式为:

Δij=[assign_lenij,min_name_lenij,max_categoryij,max_callij,all_checkedij]

其中,i=1,2,...,M;j=1,2,...,N;M为抽象语法树中的函数定义结点数,N为函数结点中赋值结点的个数;

5)利用机器学习技术,在缺陷代码特征向量上训练多分类模型;根据步骤4)中的缺陷代码特征向量及其对应的缺陷错误类型,生成训练集,训练多分类Logistic回归模型;

定义1:多分类Logistic回归模型是通过一系列连续型或类别型预测变量来预测多值型相应变量的模型,是二分类Logistic回归模型的扩展;记y是因变量且有c种取值,从0到c-1,自变量x=(x1,x2,...,xp)是我们采集到的缺陷代码特征向量,则可以得出y的条件概率:

其中,k=0,1,2,…,c-1;由此得到多分类Logistic回归模型:

其中,是回归系数;

6)提示开发者在测试Python程序文件中可能出现的缺陷信息;对于一个新的Python程序文件,应用于步骤5)中得到的多分类Logistic回归模型,提示开发者在程序中可能引发缺陷的函数,以及可能的缺陷错误类型。

下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。

该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于南京大学,未经南京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服

本文链接:http://www.vipzhuanli.com/pat/books/201710376265.5/1.html,转载请声明来源钻瓜专利网。

×

专利文献下载

说明:

1、专利原文基于中国国家知识产权局专利说明书;

2、支持发明专利 、实用新型专利、外观设计专利(升级中);

3、专利数据每周两次同步更新,支持Adobe PDF格式;

4、内容包括专利技术的结构示意图流程工艺图技术构造图

5、已全新升级为极速版,下载速度显著提升!欢迎使用!

请您登陆后,进行下载,点击【登陆】 【注册】

关于我们 寻求报道 投稿须知 广告合作 版权声明 网站地图 友情链接 企业标识 联系我们

钻瓜专利网在线咨询

周一至周五 9:00-18:00

咨询在线客服咨询在线客服
tel code back_top