【技术实现步骤摘要】
一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法
本专利技术属于计算机
,尤其是软件维护领域。本专利技术提供了一种面向软件生态系统的、基于程序依赖关系和符号分析的跨项目缺陷影响分析方法,用在修复跨项目缺陷过程中,为评估缺陷严重程度、设置修复优先级和设计缺陷修复方案提供辅助信息。
技术介绍
软件生态系统通常指“一系列具有一定程度共生关系的软件产品集合”。在软件生态系统中,不同项目通过依赖关系产生代码上的关联,其中提供功能或服务的项目被称为上游项目,使用者被称为下游项目。上下游项目是相对的,且一个项目在软件生态系统中会扮演不同的角色。例如,在Python科学计算生态系统中,天文学领域核心库Astropy作为下游项目依赖于基础计算库Numpy;同时它作为上游项目为大量天文学领域附属软件提供丰富功能。由此,不同项目通过它们之间复杂多样的相互依赖关系共同发展和演化,这又给项目维护带来了新的挑战。在软件生态系统中,由于项目间依赖关系的存在,上游项目中的缺陷极有可能将其影响传播到下游项目,危害下游项目的正常运转,形成软件生态系统中独有的一类缺陷——跨项目缺陷。所谓跨项目缺陷,是指其产生的根本原因在上游项目,但其影响与修复除涉及本身项目外,涉及至少一个下游项目。随着软件生态系统的发展,跨项目缺陷愈加不容忽视。相比于传统的项目内缺陷,跨项目缺陷的影响范围更广。由其定义可知,跨项目缺陷一旦产生,其影响不局限在单个项目内,可能破坏多个项目的正常功能,危害软件生态系统的健康与发展。且因影响多个项目,此类缺陷的修复 ...
【技术保护点】
1.一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法,其特征在于,从软件版本控制系统中获取同一软件生态系统中不同项目多个版本的源代码,通过抽取项目间调用关系构建版本敏感的软件生态系统跨项目调用网络,以此识别调用了上游出错方法的下游候选模块,基于符号分析将每个候选模块入口到调用点处的语句连同缺陷触发条件一同编码成符号约束,通过约束求解判断每个候选模块是否受给定跨项目缺陷影响;该方法包括下列步骤:/n1)获取同一软件生态系统中不同项目、多个版本的程序源代码;版本控制系统中保存了软件生态系统中每个项目的所有程序版本的提交,根据文件名和版本号,从软件版本控制系统中获取每个软件不同版本程序的源代码;/n定义1:文件名和版本号是软件版本控制系统中用于区分不同软件或同一软件不同版本的标识;/n2)从每个项目基础版本的程序源代码中抽取调用关系,构建生态系统基本依赖网络;对步骤1)中已经收集好的每个项目基础版本的源程序代码进行词法分析和语法分析,利用Python标准库中的ast模块生成对应的抽象语法树,并从抽象语法树中抽取四种类型的节点:方法调用节点、方法定义节点、类定义节点和import节点;然 ...
【技术特征摘要】
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
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。