【技术实现步骤摘要】
一种基于语法结构变更分析的软件缺陷溯源方法
本专利技术涉及源代码程序分析及缺陷溯源领域,特别涉及一种基于语法结构变更分析的软件缺陷溯源方法。
技术介绍
如今软件系统已经渗透到了人类生产和生活的各个方面。与此同时,由于软件缺陷导致的问题也带来了很大危害,造成了人员伤亡和经济损失。软件缺陷溯源是指在软件演化历史中通过缺陷修复提交追溯识别出缺陷引入提交,从而确定软件缺陷的生命周期起点位置。这项工作具有重要意义,一方面研究者可以通过分析缺陷引入提交,研究软件缺陷的特点和成因,进而指导后续的软件开发和测试,避免相似的缺陷再次发生。另一方面,软件开发团队可以通过缺陷溯源结果确定缺陷被引入软件系统的时间,进而构建缺陷管理系统,及时提醒用户修复潜在的缺陷。缺陷溯源主要存在以下两个难点,一是缺陷代码的识别。在缺陷修复提交中,可能有一些和缺陷修复无关的代码修改,例如代码风格修改,代码行顺序调整等,这些修改和缺陷修复无关,因此从缺陷修复提交中识别出准确的缺陷代码是缺陷溯源首先需要解决的问题。二是软件演化过程中代码风格修改对溯源结果的影响。 ...
【技术保护点】
1.一种基于语法结构变更分析的软件缺陷溯源方法,其特征在于,包括如下步骤:/nS1:通过对缺陷修复提交使用语法结构变更分析,解析出缺陷修复提交FixCommit修改的源文件在完成缺陷修复过程中的语法结构变更模块CUSet;/nS2:根据修复提交中解析出的源文件语法结构变更模块内容,从中识别出导致缺陷产生的缺陷代码BuggyRowSet;/nS3:提取修改过缺陷文件的历史提交,使用语法结构变更分析解析缺陷文件的历史提交,得到缺陷文件在被修复之前演化过程中的语法结构变更模块集合FHCUSet
【技术特征摘要】
1.一种基于语法结构变更分析的软件缺陷溯源方法,其特征在于,包括如下步骤:
S1:通过对缺陷修复提交使用语法结构变更分析,解析出缺陷修复提交FixCommit修改的源文件在完成缺陷修复过程中的语法结构变更模块CUSet;
S2:根据修复提交中解析出的源文件语法结构变更模块内容,从中识别出导致缺陷产生的缺陷代码BuggyRowSet;
S3:提取修改过缺陷文件的历史提交,使用语法结构变更分析解析缺陷文件的历史提交,得到缺陷文件在被修复之前演化过程中的语法结构变更模块集合FHCUSeti;
S4:解析缺陷文件在被修复之前演化过程中的语法结构变更模块集合FHCUSeti中的插入模块,然后在缺陷文件对应的历史版本中定位插入模块,提取缺陷文件在每次历史提交中插入代码的内容;
S5:通过相似性分析比较缺陷代码和缺陷文件历史提交中插入代码的相似性,如果相似性为1,则缺陷文件历史提交为缺陷潜在引入提交,否则不是缺陷潜在引入提交;
S6:比较历史提交创建时间与缺陷报告时间,如果历史提交创建时间在缺陷报告时间之前,则历史提交是缺陷引入提交,否则不是;
S7:在给定输入下,判断一次缺陷修复提交中是否存在缺陷代码还未找到其对应引入提交,如果存在,则回到S4继续算法,否则,停止算法。
2.根据权利要求1所述基于语法结构变更分析的软件缺陷溯源方法,其特征在于,所述步骤S1中,通过对缺陷修复提交FixCommit使用语法结构变更分析,解析出缺陷修复提交修改的源文件在完成缺陷修复过程中的语法结构变更模块CUSet;步骤S1具体包括:
S101:修改源文件提取;通过解析版本控制系统记录,提取出缺陷修复提交FixCommit中修改的源文件集合FileSet,表示如下:
其中f表示本次提交中修改的源文件;在元组(fip,fic)中,fip表示缺陷修复提交修改之前的源文件内容,fic表示缺陷修复提交修改之后的源文件内容;k表示缺陷修复提交修改源文件的总数;
S102:源文件语法树解析;使用语法解析工具Spoon,将缺陷修复提交FixCommit中修改的源文件集合FileSet解析为抽象语法树形式ASTSet,表示如下:
其中k表示缺陷修复提交中修改源文件的个数;在元组中,表示缺陷修复提交修改之前源文件fi对应的抽象语法树,表示缺陷修复提交修改之后源文件fi对应的抽象语法树;
S103:语法树映射和编辑动作推导;使用语法树差异分析工具分别在ASTSet中的抽象语法树元组进行映射匹配,在两颗语法树相似节点之间建立映射关系,然后根据建立的映射关系推导出两棵语法树转换需要完成的编辑动作集合EASet,表示如下:
EASet={EA1,EA2,EA3,...,EAn}
其中EAk表示一个编辑动作,表示如下:
EAk={op,(na,linea,typea),(nb,lineb,typeb)}
其中op表示表示编辑动作类型,包括Add,Delete两种类型,分别表示插入和删除动作;(na,linea,typea)中的na表示抽象语法树中被移除的节点,linea表示被移除节点在源文件中所在的行号,typea表示移除节点的结构类型;(nb,lineb,typeb)中的nb表示抽象语法树中新插入的节点,lineb表示插入节点在源文件中所在的行号,typeb表示插入节点的结构类型;
S104:编辑动作聚簇;为了获取源代码的语法结构变更模块,通过分析编辑动作集合EASet中编辑动作的类型和编辑动作所在语法树节点位置,然后在编辑动作集合上使用聚簇规则,将相同类型的编辑动作聚簇,从而获取缺陷提交中源文件的语法结构变更模块CUSet,使用的聚簇规则有两条,分别如下:
1)如果相同类型的编辑动作作用于源文件同一行代码的语法树节点,则源文件语法变更结构被识别为该代码行对应的语法树根节点的结构类型;
2)如果相同类型的编辑动作作用于源文件中相邻代码行的抽象语法树节点,则源文件语法变更结构被识别为这些代码行对应的语法树根节点的结构类型;
通过对编辑动作集合EASet使用聚簇上述聚簇规则,获取缺陷修复提交中源文件语法结构变更模块CUSet,表示如下:
CUSet={CU1,CU2,...,CUm}
其中CUk表示一个语法结构变更模块;表示如下:
CUk={op,utype,file,bline,eline}
其中op表示当前变更模块的编辑动作类型,有Add和Delete两种类型,分别表示插入和删除动作;utype表示变更模块的结构类型;file表示变更模块所在的源文件;bline表示变更模块在源文件中的起始行;eline表示变更模块在源文件中的结束行,当编辑动作为Add时,bline和eline表示修改后的源代码的位置信息,当编辑动作为Delete时,bline和eline表示修改前的源代码的位置信息。
3.根据权利要求1所述基于语法结构变更分析的软件缺陷溯源方法,其特征在于,所述步骤S2中,通过对缺陷修复提交解析得到的语法结构变更模块分析,确定导致缺陷产生的缺陷代码,根据解析缺陷修复提交输出的语法结构变更模块CUSet的不同,对缺陷代码进行不同的定义:
1)如果语法结构变更模块CUSet中存在删除代码时,删除代码即为缺陷代码,此时缺陷代码集合BuggyRowSet1表示为如下:
BuggyRowSet1={BuggyRow1,BuggyRow2,...,BuggyRown}
其中n表示缺陷代码行的数量;BuggyRowi表示一行缺陷代码,表示如下:
BuggyRowi={fi,linei,cotenti}
其中fi表示缺陷代码行所在的源文件;linei表示缺陷代码行在源文件的位置;cotenti表示缺陷代码行的代码内容;
2)如果语法结构变更模块CUSet中没有删除代码,缺陷修复提交通过添加接口、枚举数值、方法,构造函数和全局变量等类的直接子节点完成缺陷修复时,新添加代码所在的类为缺陷代码;此时缺陷代码集合BuggyRowSet2表示为如下:
BuggyRowSet2={BuggyClass1,BuggyClass2,...,BuggyCla...
【专利技术属性】
技术研发人员:刘烃,郑庆华,贺安成,崔笛,马雪,池剑磊,
申请(专利权)人:西安交通大学,
类型:发明
国别省市:陕西;61
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。