当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法技术

技术编号:23314982 阅读:26 留言:0更新日期:2020-02-11 17:45
本发明专利技术提供一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法,包括下列步骤:1)获取同一软件生态系统中不同项目、多个版本的程序源代码;2)从每个项目基础版本的程序源代码中抽取调用关系,构建生态系统基本依赖网络;3)从每个项目其它版本的程序源代码中获取代码变更,构建版本敏感的生态系统依赖网络;4)对于给定的跨项目缺陷,已知其上游出错方法,挑选候选下游模块;5)针对每个候选下游模块,进行代码预处理;6)对每个预处理后的候选下游模块,进行符号编码;7)对每个符号编码后的下游模块进行约束求解,如有解,则提示开发人员该模块可能受给定跨项目缺陷影响。本发明专利技术解决了目前存在的缺乏针对跨项目缺陷影响分析、无法提示下游项目受影响模块等问题,进而指导跨项目缺陷的修复方案设计,提高缺陷修复补丁的质量,从而能更好地控制和管理软件生态系统的健康发展。

A cross project defect impact analysis method based on program dependency and symbol analysis

【技术实现步骤摘要】
一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法
本专利技术属于计算机
,尤其是软件维护领域。本专利技术提供了一种面向软件生态系统的、基于程序依赖关系和符号分析的跨项目缺陷影响分析方法,用在修复跨项目缺陷过程中,为评估缺陷严重程度、设置修复优先级和设计缺陷修复方案提供辅助信息。
技术介绍
软件生态系统通常指“一系列具有一定程度共生关系的软件产品集合”。在软件生态系统中,不同项目通过依赖关系产生代码上的关联,其中提供功能或服务的项目被称为上游项目,使用者被称为下游项目。上下游项目是相对的,且一个项目在软件生态系统中会扮演不同的角色。例如,在Python科学计算生态系统中,天文学领域核心库Astropy作为下游项目依赖于基础计算库Numpy;同时它作为上游项目为大量天文学领域附属软件提供丰富功能。由此,不同项目通过它们之间复杂多样的相互依赖关系共同发展和演化,这又给项目维护带来了新的挑战。在软件生态系统中,由于项目间依赖关系的存在,上游项目中的缺陷极有可能将其影响传播到下游项目,危害下游项目的正常运转,形成软件生态系统中独有的一类缺陷——跨项目缺陷。所谓跨项目缺陷,是指其产生的根本原因在上游项目,但其影响与修复除涉及本身项目外,涉及至少一个下游项目。随着软件生态系统的发展,跨项目缺陷愈加不容忽视。相比于传统的项目内缺陷,跨项目缺陷的影响范围更广。由其定义可知,跨项目缺陷一旦产生,其影响不局限在单个项目内,可能破坏多个项目的正常功能,危害软件生态系统的健康与发展。且因影响多个项目,此类缺陷的修复过程更复杂。尽管跨项目缺陷最终在上游根源项目中被修复,但因其对下游项目功能产生干扰,在其修复过程中往往需要考虑下游项目的需求。然而,与独立项目开发模式不同,软件生态系统中不同项目的开发和维护是相对独立和异步的。上游修复一个跨项目缺陷并不代表消除了该缺陷对其它项目的影响,只有在上游发布了包含该缺陷修复补丁的新版本(修复版本)之后,下游才能摆脱影响。然而,如果修复版本仍然不能令下游满意,那么受影响的下游项目需要至少再等待一个发布周期才能获得新的修复版本,这无疑会扩大缺陷的影响,且耗费额外的维护工作量。因此,上游程序员在面对跨项目缺陷时往往非常谨慎,他们希望能从受影响的下游项目中获得建议。也就是说,为设计和提供令上下游均满意的修复方案,上游开发者需要了解哪些下游代码受到影响,并与其开发者进行沟通讨论。但是,手工识别受影响的下游模块(方法或类)极其耗时且容易出错。近年来,已有部分研究人员注意到了跨项目缺陷的存在,并进行了初步的探索。例如,Decan等人在研究R语言生态系统时发现,当上游项目出现问题,下游开发者会遭遇很大的困难。Adams等人指出,整合开源软件的核心活动是同步新的上游版本;为避免上游缺陷,开发者需要在同步过程上花费大量精力。Canfora等人研究了FreeBSD和OpenBSD内核中的跨系统缺陷修复(CSBF),并使用社会网络分析来探索贡献者的社会特征与CSBF的关系。他们着重关注了从代码修改中如何识别CSBF,并对比跨系统缺陷修复的参与者和非参与者之间的区别。Ding等人研究了在面对跨项目缺陷时,下游程序员的惯常行为,即在自己项目中提供的临时解决方案。然而,目前没有学者针对跨项目缺陷的影响进行研究或提出技术、工具。
技术实现思路
本专利技术提供了一种面向软件生态系统的、基于程序依赖关系和符号分析的跨项目缺陷影响分析方法,用以识别可能受影响的下游模块(方法或类)。该方法应用于开始修复缺陷之前,它能够从生态系统大量下游模块中找到所有受影响的部分,因而上游提出的修复方案更有可能满足所有的下游需求。具体来说,给定一个跨项目缺陷,已知造成缺陷的上游方法和缺陷触发条件,首先通过生态系统范围的依赖分析收集所有使用该上游方法的候选下游模块;然后对于每个模块,将模块入口处到调用点处的所有语句和缺陷触发条件共同编码成符号约束,通过约束求解判断该模块是否受影响。本专利技术旨在解决目前存在的缺乏针对跨项目缺陷影响分析、无法提示下游项目受影响模块等问题,进而指导跨项目缺陷的修复方案设计,提高缺陷修复补丁的质量,从而能更好地控制和管理软件生态系统的健康发展。本跨项目影响分析方法包括下列步骤:1)获取同一软件生态系统中不同项目、多个版本的程序源代码;2)从每个项目基础版本的程序源代码中抽取调用关系,构建生态系统基本依赖网络;3)从每个项目其它版本的程序源代码中获取代码变更,构建版本敏感的生态系统依赖网络;4)对于给定的跨项目缺陷,已知其上游出错方法,挑选候选下游模块;5)针对每个候选下游模块,进行代码预处理;6)对每个预处理后的候选下游模块,进行符号编码;7)对每个符号编码后的下游模块进行约束求解,如有解,则提示开发人员该模块可能受给定跨项目缺陷影响。进一步,其中上述步骤1)的具体步骤如下:步骤1)-1:起始状态;步骤1)-2:根据项目名和版本号,从软件版本控制系统中获取每个项目、每个版本的源程序;步骤1)-3:不同项目多个版本源程序采集完毕。进一步,其中上述步骤2)的具体步骤如下:步骤2)-1:起始状态;步骤2)-2:对每个项目基础版本的源程序代码进行词法分析和语法分析,利用Python标准库中的ast模块生成对应的抽象语法树;步骤2)-3:从抽象语法树中抽取四种类型的节点:方法调用节点、方法定义节点、类定义节点和import节点;步骤2)-4:提取方法调用节点中的调用者和被调函数,并根据方法定义节点、类定义节点和import节点过滤定义在同个项目中的调用关系,即只保留跨项目调用关系;步骤2)-5:将调用者m作为源节点,被调函数f作为目标节点,两者之间的调用关系e=m→f作为有向边,生成生态系统基础依赖网络G(SE)=<Vfrom;Vto;E>,其中Vfrom为源节点集合,Vto为目标节点集合,E为边(调用关系)集合;步骤2)-6:生态系统基础依赖网络构建完毕。进一步,其中上述步骤3)的具体步骤如下:步骤3)-1:起始状态;步骤3)-2:对每个项目其它版本的源程序代码进行词法分析和语法分析,利用Python便准库中的ast模块生成对应的抽象语法树;步骤3)-3:对比相邻两个版本的抽象语法树,提取方法调用节点、类定义节点和方法定义节点的变更;步骤3)-4:为G(SE)中的每个目标节点f∈Vto维护一个元组类型的属性tf,记录其所属项目中包含方法f的最老和最新版本;对于每个调用关系e=m→f∈E维护一个字典类型的属性c,记录从m的一个特定版本到f的版本范围的映射,用来表示该版本的m依赖于哪些版本的f;步骤3)-5:根据节点变更信息更新tf和c的值;步骤3)-6:版本敏感的生态系统依赖网络构建完毕;进一步,其中上述步骤4)的具体步骤如下:步骤4)-1:起始状态;步骤4)-2:给定跨项目缺陷,已知其根源的上游出错本文档来自技高网
...

【技术保护点】
1.一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法,其特征在于,从软件版本控制系统中获取同一软件生态系统中不同项目多个版本的源代码,通过抽取项目间调用关系构建版本敏感的软件生态系统跨项目调用网络,以此识别调用了上游出错方法的下游候选模块,基于符号分析将每个候选模块入口到调用点处的语句连同缺陷触发条件一同编码成符号约束,通过约束求解判断每个候选模块是否受给定跨项目缺陷影响;该方法包括下列步骤:/n1)获取同一软件生态系统中不同项目、多个版本的程序源代码;版本控制系统中保存了软件生态系统中每个项目的所有程序版本的提交,根据文件名和版本号,从软件版本控制系统中获取每个软件不同版本程序的源代码;/n定义1:文件名和版本号是软件版本控制系统中用于区分不同软件或同一软件不同版本的标识;/n2)从每个项目基础版本的程序源代码中抽取调用关系,构建生态系统基本依赖网络;对步骤1)中已经收集好的每个项目基础版本的源程序代码进行词法分析和语法分析,利用Python标准库中的ast模块生成对应的抽象语法树,并从抽象语法树中抽取四种类型的节点:方法调用节点、方法定义节点、类定义节点和import节点;然后提取方法调用节点中的调用者和被调函数,并根据方法定义节点、类定义节点和import节点过滤定义在同个项目中的调用关系,即只保留跨项目调用关系,并生成生态系统基础依赖网络G(SE)=<V...

【技术特征摘要】
1.一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法,其特征在于,从软件版本控制系统中获取同一软件生态系统中不同项目多个版本的源代码,通过抽取项目间调用关系构建版本敏感的软件生态系统跨项目调用网络,以此识别调用了上游出错方法的下游候选模块,基于符号分析将每个候选模块入口到调用点处的语句连同缺陷触发条件一同编码成符号约束,通过约束求解判断每个候选模块是否受给定跨项目缺陷影响;该方法包括下列步骤:
1)获取同一软件生态系统中不同项目、多个版本的程序源代码;版本控制系统中保存了软件生态系统中每个项目的所有程序版本的提交,根据文件名和版本号,从软件版本控制系统中获取每个软件不同版本程序的源代码;
定义1:文件名和版本号是软件版本控制系统中用于区分不同软件或同一软件不同版本的标识;
2)从每个项目基础版本的程序源代码中抽取调用关系,构建生态系统基本依赖网络;对步骤1)中已经收集好的每个项目基础版本的源程序代码进行词法分析和语法分析,利用Python标准库中的ast模块生成对应的抽象语法树,并从抽象语法树中抽取四种类型的节点:方法调用节点、方法定义节点、类定义节点和import节点;然后提取方法调用节点中的调用者和被调函数,并根据方法定义节点、类定义节点和import节点过滤定义在同个项目中的调用关系,即只保留跨项目调用关系,并生成生态系统基础依赖网络G(SE)=<Vfrom;Vto;E>;
定义1:抽象语法树是源代码抽象语法结构的树状表现形式,每个节点代表源代码中的一种结构;
定义2:Python标准库随Python语言一起发行,包含了诸多能提供系统级功能访问的内建模块;
定义3:ast模块是Python标准库中的一个模块,帮助解析Python抽象语法;
定义4:方法调用节点是抽象语法树中表示方法调用语句的节点;
定义5:方法定义节点是抽象语法树中表示方法定义语句的节点;
定义6:类定义节点是抽象语法树中表示类定义语句的节点;
定义7:import定义节点是抽象语法树中表示import语句的节点;
定义8:调用者是在方法调用关系中调用另一个方法的方法;
定义9:被调函数是在方法调用关系中被调用的方法;
定义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的值以添加版本信息;
定义1:版本敏感的生态系统依赖网络是指在生态系统依赖网络图中标注版本信息,以区别同一项目不同版本中的项目间依赖关系;
定义2:属性tf是一个元组,用来记录其所属项目中包含方法f的最老和最新版本,在基于项目Pi的基本版本Vi0构建基本调用图时,tf被初始化为(Vi0,Vi0);
定义3:属性c是一个哈希表,记录从m的一个特定版本到f的版本范围的映射,用来表示该版本的m依赖于哪些版本的f。在基于项目Pi的基本版本Vi0构建基本调用图时,c的键被初始化为{Vi0}。为获得c的对应值,首先尝试从Pi的配置文件(如Python项目中的setup.py)中获取相关信息,可能会指明依赖的上游项目的最新和最老版本。然而,由于缺失配置文件或内容不全,版本信息通常不能完全由该途径获得。在这种情况下,依赖版本的上下界通常是其所属项目Pj中包含方法f(具有完全相同的接口)的最新和最老版本;
定义4:源代码被转化为抽象语法树,因此代码变更转换成了树节点的变更;
定义5:为添加版本信息,本发明方法以增量的方式比较Pi的两个相邻版本,以更新tf和c的值。具体而言,从基本版本外的最老版本Vi1到最新版本Vik,比较两个版本Vip和Vi(p-1)(1≤p≤k)的抽象语法树,记录四种更改:方法调用删除、方法调用插入、方法定义删除和方法定义插入,用以更新tf和c的值;<...

【专利技术属性】
技术研发人员:陈林马皖王莹任浩罗阳
申请(专利权)人:南京大学
类型:发明
国别省市:江苏;32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1