[发明专利]一种跨项目缺陷影响分析方法有效

专利信息
申请号: 201911020242.6 申请日: 2019-10-23
公开(公告)号: CN110781086B 公开(公告)日: 2022-02-08
发明(设计)人: 陈林;马皖王莹;任浩;罗阳 申请(专利权)人: 南京大学
主分类号: G06F11/36 分类号: G06F11/36;G06F8/71
代理公司: 暂无信息 代理人: 暂无信息
地址: 210023 *** 国省代码: 江苏;32
权利要求书: 查看更多 说明书: 查看更多
摘要:
搜索关键词: 一种 项目 缺陷 影响 分析 方法
【权利要求书】:

1.一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法,其特征在于,从软件版本控制系统中获取同一软件生态系统中不同项目多个版本的源代码,通过抽取项目间调用关系构建版本敏感的软件生态系统跨项目调用网络,以此识别调用了上游出错方法的下游候选模块,基于符号分析将每个候选模块入口到调用点处的语句连同缺陷触发条件一同编码成符号约束,通过约束求解判断每个候选模块是否受给定跨项目缺陷影响;该方法包括下列步骤:

1)获取同一软件生态系统中不同项目、多个版本的程序源代码;版本控制系统中保存了软件生态系统中每个项目的所有程序版本的提交,根据文件名和版本号,从软件版本控制系统中获取每个软件不同版本程序的源代码;

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

2)从每个项目基础版本的程序源代码中抽取调用关系,构建生态系统基本依赖网络;对步骤1)中已经收集好的每个项目基础版本的源程序代码进行词法分析和语法分析,利用Python标准库中的ast模块生成对应的抽象语法树,并从抽象语法树中抽取四种类型的节点:方法调用节点、方法定义节点、类定义节点和import节点;然后提取方法调用节点中的调用者和被调函数,并根据方法定义节点、类定义节点和import节点过滤定义在同个项目中的调用关系,即只保留跨项目调用关系,并生成生态系统基础依赖网络G(SE)=Vfrom;Vto;E;

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

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

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

定义2.4:方法调用节点是抽象语法树中表示方法调用语句的节点;

定义2.5:方法定义节点是抽象语法树中表示方法定义语句的节点;

定义2.6:类定义节点是抽象语法树中表示类定义语句的节点;

定义2.7:import定义节点是抽象语法树中表示import语句的节点;

定义2.8:调用者是在方法调用关系中调用另一个方法的方法;

定义2.9:被调函数是在方法调用关系中被调用的方法;

定义2.10:生态系统基础依赖网络G(SE)=Vfrom;Vto;E是一个有向图,将调用者m作为源节点,被调函数f作为目标节点,两者之间的调用关系e=m→f作为有向边,则G(SE)中Vfrom为源节点集合,Vto为目标节点集合,E为边集合,边指的是调用关系;

3)从每个项目其它版本的程序源代码中获取代码变更,构建版本敏感的生态系统依赖网络;为表示版本信息,为步骤2)中生成的生态系统依赖网络中的每个目标节点f∈Vto维护一个属性tf;对于每个调用关系e=m→f∈E维护一个属性c;对比相邻两个版本的抽象语法树,提取方法调用节点、类定义节点和方法定义节点的变更,然后根据节点变更信息更新tf和c的值以添加版本信息;

定义3.1:版本敏感的生态系统依赖网络是指在生态系统依赖网络图中标注版本信息,以区别同一项目不同版本中的项目间依赖关系,假设一个软件生态系统SE包含n个项目,每个项目Pi(0≤i≤n)有k个版本,即Vi0、Vi1、......、Vik

定义3.2:属性tf是一个元组,用来记录其所属项目中包含方法f的最老和最新版本,在基于项目Pi的基本版本Vi0构建基本调用图时,基本版本即项目Pi的最老版本Vi0,tf被初始化为(Vi0,Vi0);

定义3.3:属性c是一个哈希表,记录从m的一个版本到f的版本范围的映射,用来表示一个版本的m依赖于哪些版本的f,在基于项目Pi的基本版本Vi0构建基本调用图时,c的键被初始化为{Vi0},为获得c的对应值,首先尝试从Pi的配置文件中获取依赖信息,配置文件是Python项目中的setup.py,配置文件中会指明依赖的上游项目的最新和最老版本,然而,由于缺失配置文件或内容不全,版本信息不能完全从配置文件中获得,在这种情况下,依赖版本的上下界是方法所属的另一个项目Pj中包含具有完全相同的接口的方法f的最新和最老版本;

定义3.4:源代码被转化为抽象语法树,因此代码变更转换成了树节点的变更;

定义3.5:为添加版本信息,以增量的方式比较Pi的两个相邻版本,以更新tf和c的值,具体而言,从基本版本外的最老版本Vi1到最新版本Vik,比较两个版本Vip和Vi(p-1)(1≤p≤k)的抽象语法树,记录四种更改:方法调用删除、方法调用插入、方法定义删除和方法定义插入,用以更新tf和c的值;

定义3.6:更新tf的规则如下:当Vip中一个新的方法被定义,其tf值被初始化为(Vip,Vip);如果一个已有的方法在Vip中被删除,它的tf值保持不变;对于其它在Vip中方法,由于它们没有发生改变,其tf的第二个元素从Vi(p-1)更新为Vip

定义3.7:更新c的规则如下:在Vip中,如果Pi的某一调用者m发生更改,不再调用上游方法f,边e=m→f的哈希表不发生改变;否则,在c中增加新的键以表示在Vip中存在该方法调用;新增键所对应的值定义3.3由配置文件或f.tf获得;

4)对于给定的跨项目缺陷,已知其上游出错方法,根据生态系统依赖网络挑选候选下游模块;

定义4.1:在软件生态系统中,不同项目通过依赖关系产生代码上的关联,其中提供功能或服务的项目为上游项目,使用者为下游项目;

定义4.2:跨项目缺陷是指其产生的根本原因在上游项目,但其影响和修复除涉及上游项目本身外,涉及至少一个下游项目;

定义4.3:出错上游方法是指在上游项目中造成跨项目缺陷的根本原因;

定义4.4:候选下游模块是在下游项目中调用了上游出错方法的所有方法或类;

5)针对每个候选下游模块,进行代码预处理;首先将其复杂语句标准化,然后将上游出错方法、缺陷触发条件与下游候选模块代码进行代码整合;

定义5.1:代码标准化是将源代码中的复杂语句简单化、标准化,使得每行代码只包含一个简单操作;

定义5.2:代码整合是将上游出错方法、缺陷触发条件和每个下游候选模块整合成一个标准的分析单元,首先将上游出错方法抽象成一个简单的缺陷触发条件检查,即仅保留上游出错方法的接口部分,将其主体代码替换成一个if-else语句,从缺陷报告中获取的缺陷触发条件作为if-else语句的条件部分,然后,保留下游候选模块中从第一行到调用上游方法之处的代码,并修改调用点处的语句,将原返回目标变量替换为tmpResult或添加返回目标变量tmpResult;

6)对于整合后的下游候选模块代码进行符号分析,首先对输入变量进行初始化,然后将模块入口到上游出错方法调用点的路径进行约束编码;

定义6.1:输入变量初始化是指符号变量来表示一个输入参数x的值;对于Python动态编程语言,变量的类型信息不会显式给出;模块的一个给定输入参数为多种不同类型;为处理此种情况,使用多种不同类型的符号变量来表示一个输入参数x的值,对于涉及x的语句s,所有代表x的符号变量都会被更新,以编码语句s在x属于不同类型时的行为;

定义6.2:约束编码是将对从模块入口处到调用处的可达路径进行符号化编码,编码时,首先将每条路径转化为静态单赋值形式,以保证每个变量都只被定义一次;具体对几种语句的编码规则如下:

赋值语句 对于常量赋值语句x=v,其中v包括数字、字符串和列表,首先将其转化成SSA形式,然后编码成约束;对于简单赋值语句x=y,首先查找y的最近定义,如果找到,先决断y的最近定义并在将语句转化成SSA形式之后进行编码,若未找到y的定义,则先用多个类型的符号变量将y初始化;对于二元操作x=y+z,处理方式与对赋值语句的处理方式相同;

方法调用 为保证影响分析的效率,编码过程限制在目标模块内部,除上游出错方法外,下游模块会调用其它方法或函数,因此按照符号分析中的惯例,手工为Python项目常用的库函数提供符号模型,对于其它未建模的外部函数,我们采用保守的方式处理,假设这些函数可以改变其所有输入参数的值,且可以返回任意类型的任意值,对于语句x=f(p1,p2,...,pn),它的返回目标变量x和每个输入参数pi(1≤i≤n)都重新初始化为多个不同类型的符号变量;

分支结构 对于分支语句if conditions S1 else S2,首先决断断言,然后逐一处理S1和S2中的每一条语句,在编码过程中,路径分为两个类别:中止和活跃,中止的路径无法到达上游出错方法的调用处,因此被排除在后续分析之外;活跃路径被符号执行到调用点,在模块内影响分析过程中,仅关注活跃路径;

7)约束求解,判断候选下游模块是否受影响;对在步骤6)中活跃路径上收集到的所有符号约束进行约束求解,其中的符号约束也包含编码后的缺陷触发条件,如有解且tmpResult的值为1,则被分析的下游候选模块被认为受给定跨项目缺陷影响,同时,触发影响的下游模块输入将给出。

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

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

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

×

专利文献下载

说明:

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

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

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

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

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

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

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

钻瓜专利网在线咨询

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

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