CN111913874B - 一种基于语法结构变更分析的软件缺陷溯源方法 - Google Patents

一种基于语法结构变更分析的软件缺陷溯源方法 Download PDF

Info

Publication number
CN111913874B
CN111913874B CN202010574986.9A CN202010574986A CN111913874B CN 111913874 B CN111913874 B CN 111913874B CN 202010574986 A CN202010574986 A CN 202010574986A CN 111913874 B CN111913874 B CN 111913874B
Authority
CN
China
Prior art keywords
defect
submission
code
file
source file
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202010574986.9A
Other languages
English (en)
Other versions
CN111913874A (zh
Inventor
刘烃
郑庆华
贺安成
崔笛
马雪
池剑磊
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xian Jiaotong University
Original Assignee
Xian Jiaotong University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Xian Jiaotong University filed Critical Xian Jiaotong University
Priority to CN202010574986.9A priority Critical patent/CN111913874B/zh
Publication of CN111913874A publication Critical patent/CN111913874A/zh
Application granted granted Critical
Publication of CN111913874B publication Critical patent/CN111913874B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于语法结构变更分析的软件缺陷溯源方法,首先,对缺陷修复提交使用语法结构变更分析,确定导致缺陷产生的缺陷代码;其次,使用语法结构变更分析方法解析缺陷文件的历史提交,获取缺陷文件在被修复之前插入的代码模块;最后,通过比较缺陷代码和缺陷文件历史插入代码的相似性,确定缺陷代码的引入提交。本发明基于语法树差异分析技术,提出了基于语法结构变更分析的软件缺陷溯源方法,本方法的目标是给定一次缺陷修复提交,最终确定这个缺陷被引入软件系统的提交。该方法能够消除语法无关的代码修改噪声对缺陷溯源的影响,同时避免了传统缺陷溯源方法在大规模代码上建立映射关系不准确的问题,进而提升缺陷溯源结果的准确度。

Description

一种基于语法结构变更分析的软件缺陷溯源方法
技术领域
本发明涉及源代码程序分析及缺陷溯源领域,特别涉及一种基于语法结构变更分析的软件缺陷溯源方法。
背景技术
如今软件系统已经渗透到了人类生产和生活的各个方面。与此同时,由于软件缺陷导致的问题也带来了很大危害,造成了人员伤亡和经济损失。软件缺陷溯源是指在软件演化历史中通过缺陷修复提交追溯识别出缺陷引入提交,从而确定软件缺陷的生命周期起点位置。这项工作具有重要意义,一方面研究者可以通过分析缺陷引入提交,研究软件缺陷的特点和成因,进而指导后续的软件开发和测试,避免相似的缺陷再次发生。另一方面,软件开发团队可以通过缺陷溯源结果确定缺陷被引入软件系统的时间,进而构建缺陷管理系统,及时提醒用户修复潜在的缺陷。
缺陷溯源主要存在以下两个难点,一是缺陷代码的识别。在缺陷修复提交中,可能有一些和缺陷修复无关的代码修改,例如代码风格修改,代码行顺序调整等,这些修改和缺陷修复无关,因此从缺陷修复提交中识别出准确的缺陷代码是缺陷溯源首先需要解决的问题。二是软件演化过程中代码风格修改对溯源结果的影响。代码风格修改噪声会导致缺陷溯源不能识别出准确的引入提交。传统缺陷溯源方法通过在缺陷文件演化历史的不同版本之间建立代码行映射关系,然后进行缺陷代码反向溯源。这种方法在代码规模很大时建立的映射关系并不准确,会导致溯源结果出现错误。
发明内容
为了解决当前软件缺陷溯源不准确问题,本发明提供了一种基于语法结构变更分析的软件缺陷溯源方法,通过使用语法结构变更分析解析缺陷修复提交,消除和缺陷修复无关的修改噪声;同时使用语法结构变更分析解析缺陷文件历史提交,消除代码风格修改噪声,实现准确的缺陷溯源。
为了实现上述目的,本发明采用的技术方案是:
一种基于语法结构变更分析的软件缺陷溯源方法,包括如下步骤:
S1:通过对缺陷修复提交使用语法结构变更分析,解析出缺陷修复提交FixCommit修改的源文件在完成缺陷修复过程中的语法结构变更模块CUSet;
S2:根据修复提交中解析出的源文件语法结构变更模块内容,从中识别出导致缺陷产生的缺陷代码BuggyRowSet;
S3:提取修改过缺陷文件的历史提交,使用语法结构变更分析解析缺陷文件的历史提交,得到缺陷文件在被修复之前演化过程中的语法结构变更模块集合FHCUSeti
S4:解析缺陷文件在被修复之前演化过程中的语法结构变更模块集合FHCUSeti中的插入模块,然后在缺陷文件对应的历史版本中定位插入模块,提取缺陷文件在每次历史提交中插入代码的内容;
S5:通过相似性分析比较缺陷代码和缺陷文件历史提交中插入代码的相似性,如果相似性为1,则缺陷文件历史提交为缺陷潜在引入提交,否则不是缺陷潜在引入提交;
S6:比较历史提交创建时间与缺陷报告时间,如果历史提交创建时间在缺陷报告时间之前,则历史提交是缺陷引入提交,否则不是;
S7:在给定输入下,判断一次缺陷修复提交中是否存在缺陷代码还未找到其对应引入提交,如果存在,则回到S4继续算法,否则,停止算法。
通过对缺陷修复提交FixCommit使用语法结构变更分析,解析出缺陷修复提交修改的源文件在完成缺陷修复过程中的语法结构变更模块CUSet;步骤S1具体包括:
S101:修改源文件提取;通过解析版本控制系统记录,提取出缺陷修复提交FixCommit中修改的源文件集合FileSet,表示如下:
Figure GDA0002619511720000021
其中f表示本次提交中修改的源文件;在元组(fi p,fi c)中,fi p表示缺陷修复提交修改之前的源文件内容,fi c表示缺陷修复提交修改之后的源文件内容;k表示缺陷修复提交修改源文件的总数;
S102:源文件语法树解析;使用语法解析工具Spoon,将缺陷修复提交FixCommit中修改的源文件集合FileSet解析为抽象语法树形式ASTSet,表示如下:
Figure GDA0002619511720000031
其中k表示缺陷修复提交中修改源文件的个数;在元组
Figure GDA0002619511720000032
中,
Figure GDA0002619511720000033
表示缺陷修复提交修改之前源文件fi对应的抽象语法树,ASTi c表示缺陷修复提交修改之后源文件fi对应的抽象语法树;
S103:语法树映射和编辑动作推导;使用语法树差异分析工具分别在ASTSet中的抽象语法树元组
Figure GDA0002619511720000034
进行映射匹配,在两颗语法树相似节点之间建立映射关系,然后根据建立的映射关系推导出两棵语法树转换需要完成的编辑动作集合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表示修改前的源代码的位置信息。
通过对缺陷修复提交解析得到的语法结构变更模块分析,确定导致缺陷产生的缺陷代码,根据解析缺陷修复提交输出的语法结构变更模块CUSet的不同,对缺陷代码进行不同的定义:
1)如果语法结构变更模块CUSet中存在删除代码时,删除代码即为缺陷代码,此时缺陷代码集合BuggyRowSet1表示为如下:
BuggyRowSet1={BuggyRow1,BuggyRow2,…,BuggyRown}
其中n表示缺陷代码行的数量;BuggyRowi表示一行缺陷代码,表示如下:
BuggyRowi={fi,linei,cotenti}
其中fi表示缺陷代码行所在的源文件;linei表示缺陷代码行在源文件的位置;cotenti表示缺陷代码行的代码内容;
2)如果语法结构变更模块CUSet中没有删除代码,缺陷修复提交通过添加接口、枚举数值、方法,构造函数和全局变量等类的直接子节点完成缺陷修复时,新添加代码所在的类为缺陷代码;此时缺陷代码集合BuggyRowSet2表示为如下:
BuggyRowSet2={BuggyClass1,BuggyClass2,...,BuggyClassm}
其中m表示存在缺陷的类的个数,BuggyClassi表示存在缺陷的类;
BuggyClassi={fi,classnamei}
其中fi表示缺陷类所在的源文件;classnamei表示缺陷类的类名称;
3)如果语法结构变更模块CUSet中没有删除代码,缺陷修复提交通过向源文件的方法中添加新代码修复缺陷时,新添加代码所在的方法为缺陷代码,此时缺陷代码集合BuggyRowSet3表示为如下:
BuggyRowSet3={BuggyMethod1,BuggyMethod2,…,BuggyMethodk}
其中k表示缺陷方法的数量,存在缺陷的方法BuggyMethodi表示如下:
BuggyMethodi={commiti,fi,methodnamei}
其中fi表示缺陷方法所在的源文件;methodnamei表示缺陷方法的方法名称。
对缺陷代码所在的缺陷文件被修复之前的历史提交进行语法结构变更分析,获取缺陷文件被修复之前的语法结构变更模块FHCUSeti,步骤S3具体包括:
S301:缺陷文件历史提交集合提取;提取版本控制系统中修改缺陷代码所在源文件,即缺陷文件fi的提交,并按照提交创建时间排列,然后过滤缺陷修复时间之后的提交,剩下的提交即为缺陷文件历史提交集合HistoryCommitSeti,表示如下:
Figure GDA0002619511720000061
其中
Figure GDA0002619511720000062
表示第m个包含缺陷文件fi的历史提交,这些历史提交按时间顺序由早到晚排列;
S302:缺陷文件历史版本抽取;从
Figure GDA0002619511720000063
中抽取出只和当前缺陷文件fi相关的演化信息,得到缺陷文件在每次历史提交修改后的版本,则缺陷文件历史版本集合BuggyFileHistoryi可以表示如下:
BuggyFileHistoryi={fi 1,fi 2,fi 3,...fi k}
其中fi m表示缺陷文件fi在演化历史中的第m个版本;
S303:缺陷文件历史版本语法树解析;使用语法解析工具Spoon将缺陷文件fi的历史版本集合BuggyFileHistoryi中的源文件解析为抽象语法树形式,得到缺陷文件历史版本的抽象语法树集合BuggyASTHistoryi,表示如下:
BuggyASTHistoryi={ASTi 1,ASTi 2,…,ASTi 3}
其中ASTi m表示缺陷文件版本fi m对应的抽象语法树;
S304:语法树映射和编辑动作推导;使用语法树差异分析工具首先分别在缺陷文件fi的历史版本抽象语法树集合BuggyASTHistoryi中的相邻抽象语法树元组(ASTi m,ASTi m +1)进行映射匹配,在两颗语法树相似节点之间建立映射关系,然后根据建立的映射关系推导出相邻抽象语法树元组中两棵语法树转换需要完成的编辑动作集合HEASetm,表示如下:
HEASetm={HEA1,HEA2,HEA3,…,HEAn}
其中HEAk表示一个编辑动作;
经过语法树映射和编辑动作推导,得到缺陷文件fi的历史提交中的编辑动作集合FHEASeti,表示如下:
FHEASeti={HEASet1,HEASet2,…,HEASetk}
其中HEASetm表示缺陷文件在一次历史提交中的编辑动作集合;
S305:编辑动作聚簇;通过对缺陷文件在第m次历史提交中的编辑动作集合HEASetm聚簇,获取缺陷文件在这次历史提交中发生语法结构变更的代码模块,为了获取源代码的语法结构变更模块,通过分析编辑动作的类型和编辑动作所在节点位置,然后在编辑动作集合上使用聚簇规则,将相同类型的编辑动作聚簇,从而获取在这次历史提交中缺陷文件的语法结构变更模块HCUSetm,使用的聚簇规则有两条,分别如下:
1)如果相同类型的编辑动作作用于源文件同一行代码的语法树节点,则源文件语法变更结构被识别为该代码行对应的语法树根节点的结构类型;
2)如果相同类型的编辑动作作用于源文件中相邻代码行的抽象语法树节点,则源文件语法变更结构被识别为这些代码行对应的语法树根节点的结构类型;
通过对缺陷文件fi的所有历史提交中的编辑动作集合进行聚簇,得到缺陷文件fi在历史提交中的所有语法结构变更模块集合FHCUSeti,表示如下:
FHCUSeti={HCUSet1,HCUSet2,...,HCUSetk}
其中,HCUSetm表示一次历史提交中缺陷文件的语法结构变更模块。
解析历史提交中缺陷文件的语法结构变更模块FHCUSeti,分离出其中使用插入编辑动作的代码模块,得到缺陷文件的插入模块FAHCUSeti,然后解析FAHCUSeti中插入代码模块的位置信息,在缺陷文件对应的历史版本中确定每次历史提交中插入代码模块的内容。
为了确定缺陷代码的引入提交,需要比较缺陷代码和缺陷文件历史提交中插入代码的相似性,相似度计算公式如下所示:
Figure GDA0002619511720000091
其中bcode表示缺陷代码字符串;icode表示缺陷文件历史提交中插入的代码行字符串,lcs(bcode,icode)表示缺陷代码字符串与历史提交中插入代码字符串的最大公共子串;min(bcode,icode)表示缺陷代码字符串与历史提交中插入代码字符串中长度较短字符串;sim(bcode,icode)表示缺陷代码与历史提交中插入代码的相似性;
如果相似性sim(bcode,icode)为1,表示缺陷代码是在该次提交中被引入软件系统,这次历史提交是缺陷潜在引入提交,否则不是。
为了确定缺陷文件历史提交是否为真正的缺陷引入提交,需要比较历史提交创建时间和缺陷报告时间关系,比较公式如下所示:
datepcommit<datebugcreate
其中datepcommit表示缺陷文件历史提交创建日期;datebugcreate表示事务跟踪管理系统中缺陷报告的创建日期;
只有在缺陷报告创建时间之前的历史提交才是真正的缺陷引入提交。
与现有技术相比,本发明的有益效果是:
1)本发明方法使用语法结构变更分析可以有效消除缺陷修复提交中与缺陷修复无关的修改噪声,进而识别出更精确的缺陷代码,提升缺陷溯源结果的准确度。
2)本发明方法使用语法结构变更分析可以有效消除缺陷文件演化过程中的代码风格修改噪声,使得缺陷溯源结果更精确。
3)本发明方法避免了传统缺陷溯源方法在大规模代码上建立映射关系,进而提升缺陷溯源结果的准确性。
附图说明
图1为本发明方法整体流程图。
图2为缺陷修复提交语法结构变更分析流程图。
图3为缺陷文件历史提交语法结构变更分析流程图。
具体实施方式
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,以下结合附图详细说明本发明的具体实施方式。
如图1所示,一种基于语法结构变更分析的软件缺陷溯源方法,包括如下步骤:
步骤S1:对缺陷修复提交FixCommit使用语法结构变更分析,解析出缺陷修复提交修改的源文件在完成缺陷修复过程中的语法结构变更模块CUSet;结合图2,缺陷修复提交语法结构变更模块提取方法具体包括如下步骤:
步骤S101:解析版本控制系统记录,提取出缺陷修复提交FixCommit中修改的源文件集合FileSet,表示如下:
Figure GDA0002619511720000101
其中f表示本次提交中修改的源文件;在元组(fi p,fi c)中,fi p表示缺陷修复提交修改之前的源文件内容,fi c表示缺陷修复提交修改之后的源文件内容;k表示缺陷修复提交修改源文件的总数;
步骤S102:使用语法解析工具Spoon,将缺陷修复提交FixCommit中修改的源文件集合FileSet解析为抽象语法树形式ASTSet,表示如下:
Figure GDA0002619511720000111
其中k表示缺陷修复提交中修改源文件的个数;在元组
Figure GDA0002619511720000112
中,
Figure GDA0002619511720000113
表示缺陷修复提交修改之前源文件fi对应的抽象语法树,ASTi c表示缺陷修复提交修改之后源文件fi对应的抽象语法树;
步骤S103:使用语法树差异分析工具分别在ASTSet中的抽象语法树元组(ASTi p,ASTic)进行映射匹配,在两颗语法树相似节点之间建立映射关系,然后根据建立的映射关系推导出两棵语法树转换需要完成的编辑动作集合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表示修改前的源代码的位置信息。
步骤S2:分析缺陷修复提交解析得到的语法结构变更模块,确定导致缺陷产生的缺陷代码;根据解析缺陷修复提交输出的语法结构变更模块CUSet的不同,对缺陷代码进行不同的定义:
1)如果语法结构变更模块CUSet中存在删除代码时,删除代码即为缺陷代码;此时缺陷代码集合BuggyRowSet1表示为如下:
BuggyRowSet1={BuggyRow1,BuggyRow2,…,BuggyRown}
其中n表示缺陷代码行的数量;BuggyRowi表示一行缺陷代码,表示如下:
BuggyRowi={fi,linei,cotenti}
其中fi表示缺陷代码行所在的源文件;linei表示缺陷代码行在源文件的位置;cotenti表示缺陷代码行的代码内容;
2)如果语法结构变更模块CUSet中没有删除代码,缺陷修复提交通过添加接口、枚举数值、方法,构造函数和全局变量等类的直接子节点完成缺陷修复时,新添加代码所在的类为缺陷代码;此时缺陷代码集合BuggyRowSet2表示为如下:
BuggyRowSet2={BuggyClass1,BuggyClass2,…,BuggyClassm}
其中m表示存在缺陷的类的个数;BuggyClassi={fi,classnamei}表示存在缺陷的类,其中fi表示缺陷类所在的源文件;classnamei表示缺陷类的类名称;
3)如果语法结构变更模块CUSet中没有删除代码,缺陷修复提交通过向源文件的方法中添加新代码修复缺陷时,新添加代码所在的方法为缺陷代码;此时缺陷代码集合BuggyRowSet3表示为如下:
BuggyRowSet3={BuggyMethod1,BuggyMethod2,…,BuggyMethodk}
其中k表示缺陷方法的数量;存在缺陷的方法BuggyMethodi表示如下:
BuggyMethodi={commiti,fi,methodnamei}
其中fi表示缺陷方法所在的源文件;methodnamei表示缺陷方法的方法名称。
步骤S3:提取缺陷代码所在的缺陷文件被修复之前的历史提交,然后对其进行语法结构变更分析,获取缺陷文件被修复之前的语法结构变更模块FHCUSeti;结合图3,缺陷文件历史提交语法结构变更模块提取步骤如下:
步骤S301:提取版本控制系统中修改缺陷代码所在源文件,即缺陷文件fi的提交,并按照提交创建时间排列,然后过滤缺陷修复时间之后的提交,剩下的提交即为缺陷文件历史提交集合HistoryCommitSeti,表示如下:
Figure GDA0002619511720000141
其中
Figure GDA0002619511720000142
表示第m个包含缺陷文件fi的历史提交,这些历史提交按时间顺序由早到晚排列;
步骤S302:从
Figure GDA0002619511720000143
中抽取出只和当前缺陷文件fi相关的演化信息,得到缺陷文件在每次历史提交修改后的版本,则缺陷文件历史版本集合BuggyFileHistoryi可以表示如下:
BuggyFileHistoryi={fi 1,fi 2,fi 3,…,fi k}
其中fi m表示缺陷文件fi在演化历史中的第m个版本;
步骤S303:使用语法解析工具Spoon将缺陷文件fi的历史版本集合BuggyFileHistoryi中的源文件解析为抽象语法树形式,得到缺陷文件历史版本的抽象语法树集合BuggyFileHistoryi,表示如下:
BuggyASTHistoryi={ASTi 1,ASTi 2,…,ASTi 3}
其中ASTi m表示缺陷文件版本fi m对应的抽象语法树;
步骤S304:使用语法树差异分析工具首先分别在缺陷文件fi的历史版本抽象语法树集合BuggyASTHistoryi中的相邻抽象语法树元组(ASTi m,ASTi m+1)进行映射匹配,在两颗语法树相似节点之间建立映射关系,然后根据建立的映射关系推导出相邻抽象语法树元组中两棵语法树转换需要完成的编辑动作集合HEASetm,表示如下:
HEASetm={HEA1,HEA2,HEA3,…,HEAn}
其中HEAk表示一个编辑动作;
经过语法树映射和编辑动作推导,得到缺陷文件fi的历史提交中的编辑动作集合FHEASeti,表示如下:
FHEASeti={HEASet1,HEASet2,…,HEASetk}
其中HEASetm表示缺陷文件在一次历史提交中的编辑动作集合;
步骤S305:聚簇缺陷文件在第m次历史提交中的编辑动作集合HEASetm,获取缺陷文件在这次历史提交中发生语法结构变更的代码模块;为了获取源代码的语法结构变更模块,通过分析编辑动作的类型和编辑动作所在节点位置,然后在编辑动作集合上使用聚簇规则,将相同类型的编辑动作聚簇,从而获取在这次历史提交中缺陷文件的语法结构变更模块HCUSetm;使用的聚簇规则有两条,分别如下:
1)如果相同类型的编辑动作作用于源文件同一行代码的语法树节点,则源文件语法变更结构被识别为该代码行对应的语法树根节点的结构类型;
2)如果相同类型的编辑动作作用于源文件中相邻代码行的抽象语法树节点,则源文件语法变更结构被识别为这些代码行对应的语法树根节点的结构类型;
通过对缺陷文件fi的所有历史提交中的编辑动作集合进行聚簇,得到缺陷文件fi在历史提交中的所有语法结构变更模块集合FHCUSeti,表示如下:
FHCUSeti={HCUSet1,HCUSet2,...,HCUSetk}
其中,HCUSetm表示一次历史提交中缺陷文件的语法结构变更模块。
步骤S4:解析历史提交中缺陷文件的语法结构变更模块FHCUSeti,分离出其中使用插入编辑动作的代码模块,得到缺陷文件的插入模块FAHCUSeti,然后解析FAHCUSeti中插入代码模块的位置信息,在缺陷文件对应的历史版本中确定每次历史提交中插入代码模块的内容。
步骤S5:为了确定缺陷代码的引入提交,需要比较缺陷代码和缺陷文件历史提交中插入代码的相似性,相似度计算公式如下所示:
Figure GDA0002619511720000171
其中bcode表示缺陷代码字符串;icode表示缺陷文件历史提交中插入的代码行字符串;lcs(bcode,icode)表示缺陷代码字符串与历史提交中插入代码字符串的最大公共子串;min(bcode,icode)表示缺陷代码字符串与历史提交中插入代码字符串中长度较短字符串;sim(bcode,icode)表示缺陷代码与历史提交中插入代码的相似性;
如果相似性sim(bcode,icode)为1,表示缺陷代码是在该次提交中被引入软件系统,这次历史提交是缺陷潜在引入提交,否则不是。
步骤S6:比较历史提交创建时间和缺陷报告时间关系;在缺陷报告创建时间之前的历史提交才是真正的缺陷引入提交;比较公式如下所示:
datepcommit<datebugcreate
其中datepcommit表示缺陷文件历史提交创建日期;datebugcreate表示事务跟踪管理系统中缺陷报告的创建日期。
步骤S7:判断一次缺陷修复提交中是否存在缺陷代码还未找到其对应引入提交,如果存在,则回到S4继续算法,否则,停止算法。

Claims (7)

1.一种基于语法结构变更分析的软件缺陷溯源方法,其特征在于,包括如下步骤:
S1:通过对缺陷修复提交使用语法结构变更分析,解析出缺陷修复提交FixCommit修改的源文件在完成缺陷修复过程中的语法结构变更模块CUSet;
S2:根据修复提交中解析出的源文件语法结构变更模块内容,从中识别出导致缺陷产生的缺陷代码集合BuggyRowSet;
S3:提取修改过缺陷文件的历史提交,使用语法结构变更分析解析缺陷文件的历史提交,得到缺陷文件在被修复之前演化过程中的语法结构变更模块集合FHCUSeti
S4:解析缺陷文件在被修复之前演化过程中的语法结构变更模块集合FHCUSeti中的插入模块,然后在缺陷文件对应的历史版本中定位插入模块,提取缺陷文件在每次历史提交中插入代码的内容;
S5:通过相似性分析比较缺陷代码和缺陷文件历史提交中插入代码的相似性,如果相似性为1,则缺陷文件历史提交为缺陷潜在引入提交,否则不是缺陷潜在引入提交;
S6:比较历史提交创建时间与缺陷报告时间,如果历史提交创建时间在缺陷报告时间之前,则历史提交是缺陷引入提交,否则不是;
S7:在给定输入下,判断一次缺陷修复提交中是否存在缺陷代码还未找到其对应引入提交,如果存在,则回到S4继续算法,否则,停止算法。
2.根据权利要求1所述基于语法结构变更分析的软件缺陷溯源方法,其特征在于,所述步骤S1中,通过对缺陷修复提交FixCommit使用语法结构变更分析,解析出缺陷修复提交修改的源文件在完成缺陷修复过程中的语法结构变更模块CUSet;步骤S1具体包括:
S101:修改源文件提取;通过解析版本控制系统记录,提取出缺陷修复提交FixCommit中修改的源文件集合FileSet,表示如下:
Figure FDA0003309216800000021
其中f表示本次提交中修改的源文件;在元组(fi p,fi c)中,fi p表示缺陷修复提交修改之前的源文件内容,fi c表示缺陷修复提交修改之后的源文件内容;k表示缺陷修复提交修改源文件的总数;
S102:源文件语法树解析;使用语法解析工具Spoon,将缺陷修复提交FixCommit中修改的源文件集合FileSet解析为抽象语法树形式ASTSet,表示如下:
Figure FDA0003309216800000022
其中k表示缺陷修复提交中修改源文件的个数;在元组
Figure FDA0003309216800000023
中,
Figure FDA0003309216800000024
表示缺陷修复提交修改之前源文件fi对应的抽象语法树,ASTi c表示缺陷修复提交修改之后源文件fi对应的抽象语法树;
S103:语法树映射和编辑动作推导;使用语法树差异分析工具分别在ASTSet中的抽象语法树元组
Figure FDA0003309216800000025
进行映射匹配,在两颗语法树相似节点之间建立映射关系,然后根据建立的映射关系推导出两棵语法树转换需要完成的编辑动作集合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,...,BuggyClassm}
其中m表示存在缺陷的类的个数,BuggyClassi表示存在缺陷的类;
BuggyClassi={fi,classnamei}
其中fi表示缺陷类所在的源文件;classnamei表示缺陷类的类名称;
3)如果语法结构变更模块CUSet中没有删除代码,缺陷修复提交通过向源文件的方法中添加新代码修复缺陷时,新添加代码所在的方法为缺陷代码,此时缺陷代码集合BuggyRowSet3表示为如下:
BuggyRowSet3={BuggyMethod1,BuggyMethod2,...,BuggyMethodk}
其中k表示缺陷方法的数量,存在缺陷的方法BuggyMethodi表示如下:
BuggyMethodi={commiti,fi,methodnamei}
其中fi表示缺陷方法所在的源文件;methodnamei表示缺陷方法的方法名称。
4.根据权利要求1所述基于语法结构变更分析的软件缺陷溯源方法,其特征在于,所述步骤S3中,对缺陷代码所在的缺陷文件被修复之前的历史提交进行语法结构变更分析,获取缺陷文件被修复之前的语法结构变更模块FHCUSeti,步骤S3具体包括:
S301:缺陷文件历史提交集合提取;提取版本控制系统中修改缺陷代码所在源文件,即缺陷文件fi的提交,并按照提交创建时间排列,然后过滤缺陷修复时间之后的提交,剩下的提交即为缺陷文件历史提交集合HistoryCommitSeti,表示如下:
Figure FDA0003309216800000061
其中
Figure FDA0003309216800000062
表示第m个包含缺陷文件fi的历史提交,这些历史提交按时间顺序由早到晚排列;
S302:缺陷文件历史版本抽取;从
Figure FDA0003309216800000063
中抽取出只和当前缺陷文件fi相关的演化信息,得到缺陷文件在每次历史提交修改后的版本,则缺陷文件历史版本集合BuggyFileHistoryi表示如下:
BuggyFileHistoryi={fi 1,fi 2,fi 3,...,fi k}
其中fi m表示缺陷文件fi在演化历史中的第m个版本;
S303:缺陷文件历史版本语法树解析;使用语法解析工具Spoon将缺陷文件fi的历史版本集合BuggyFileHistoryi中的源文件解析为抽象语法树形式,得到缺陷文件历史版本的抽象语法树集合BuggyASTHistoryi,表示如下:
Figure FDA0003309216800000064
其中
Figure FDA0003309216800000065
表示缺陷文件版本fi m对应的抽象语法树;
S304:语法树映射和编辑动作推导;使用语法树差异分析工具首先分别在缺陷文件fi的历史版本抽象语法树集合BuggyASTHistoryi中的相邻抽象语法树元组
Figure FDA0003309216800000071
进行映射匹配,在两颗语法树相似节点之间建立映射关系,然后根据建立的映射关系推导出相邻抽象语法树元组中两棵语法树转换需要完成的编辑动作集合HEASetm,表示如下:
HEASetm={HEA1,HEA2,HEA3,...,HEAn}
其中HEAk表示一个编辑动作;
经过语法树映射和编辑动作推导,得到缺陷文件fi的历史提交中的编辑动作集合FHEASeti,表示如下:
FHEASeti={HEASet1,HEASet2,...,HEASetk}
其中HEASetm表示缺陷文件在一次历史提交中的编辑动作集合;
S305:编辑动作聚簇;通过对缺陷文件在第m次历史提交中的编辑动作集合HEASetm聚簇,获取缺陷文件在这次历史提交中发生语法结构变更的代码模块,为了获取源代码的语法结构变更模块,通过分析编辑动作的类型和编辑动作所在节点位置,然后在编辑动作集合上使用聚簇规则,将相同类型的编辑动作聚簇,从而获取在这次历史提交中缺陷文件的语法结构变更模块HCUSetm,使用的聚簇规则有两条,分别如下:
1)如果相同类型的编辑动作作用于源文件同一行代码的语法树节点,则源文件语法变更结构被识别为该代码行对应的语法树根节点的结构类型;
2)如果相同类型的编辑动作作用于源文件中相邻代码行的抽象语法树节点,则源文件语法变更结构被识别为这些代码行对应的语法树根节点的结构类型;
通过对缺陷文件fi的所有历史提交中的编辑动作集合进行聚簇,得到缺陷文件fi在历史提交中的所有语法结构变更模块集合FHCUSeti,表示如下:
FHCUSeti={HCUSet1,HCUSet2,...,HCUSetk}
其中,HCUSetm表示一次历史提交中缺陷文件的语法结构变更模块。
5.根据权利要求1所述基于语法结构变更分析的软件缺陷溯源方法,其特征在于,所述步骤S4中,解析历史提交中缺陷文件的语法结构变更模块FHCUSeti,分离出其中使用插入编辑动作的代码模块,得到缺陷文件的插入模块FAHCUSeti,然后解析FAHCUSeti中插入代码模块的位置信息,在缺陷文件对应的历史版本中确定每次历史提交中插入代码模块的内容。
6.根据权利要求1所述基于语法结构变更分析的软件缺陷溯源方法,其特征在于,所述步骤S5中,为了确定缺陷代码的引入提交,需要比较缺陷代码和缺陷文件历史提交中插入代码的相似性,相似度计算公式如下所示:
Figure FDA0003309216800000081
其中bcode表示缺陷代码字符串;icode表示缺陷文件历史提交中插入的代码行字符串,lcs(bcode,icode)表示缺陷代码字符串与历史提交中插入代码字符串的最大公共子串;min(bcode,icode)表示缺陷代码字符串与历史提交中插入代码字符串中长度较短字符串;sim(bcode,icode)表示缺陷代码与历史提交中插入代码的相似性;
如果相似性sim(bcode,icode)为1,表示缺陷代码是在该次提交中被引入软件系统,这次历史提交是缺陷潜在引入提交,否则不是。
7.根据权利要求1所述基于语法结构变更分析的软件缺陷溯源方法,其特征在于,所述步骤S6中,为了确定缺陷文件历史提交是否为真正的缺陷引入提交,需要比较历史提交创建时间和缺陷报告时间关系,比较公式如下所示:
datepcommit<datebugcreate
其中datepcommit表示缺陷文件历史提交创建日期;datebugcreate表示事务跟踪管理系统中缺陷报告的创建日期;
只有在缺陷报告创建时间之前的历史提交才是真正的缺陷引入提交。
CN202010574986.9A 2020-06-22 2020-06-22 一种基于语法结构变更分析的软件缺陷溯源方法 Active CN111913874B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010574986.9A CN111913874B (zh) 2020-06-22 2020-06-22 一种基于语法结构变更分析的软件缺陷溯源方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010574986.9A CN111913874B (zh) 2020-06-22 2020-06-22 一种基于语法结构变更分析的软件缺陷溯源方法

Publications (2)

Publication Number Publication Date
CN111913874A CN111913874A (zh) 2020-11-10
CN111913874B true CN111913874B (zh) 2021-12-28

Family

ID=73226946

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010574986.9A Active CN111913874B (zh) 2020-06-22 2020-06-22 一种基于语法结构变更分析的软件缺陷溯源方法

Country Status (1)

Country Link
CN (1) CN111913874B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113326189A (zh) * 2021-05-27 2021-08-31 南京大学 一种追踪引入缺陷提交的方法、系统及设备
CN116339818B (zh) * 2023-05-30 2023-10-20 荣耀终端有限公司 代码变更类型的筛选方法、电子设备及可读存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9009665B2 (en) * 2012-05-16 2015-04-14 International Business Machines Corporation Automated tagging and tracking of defect codes based on customer problem management record
CN107066384A (zh) * 2017-03-28 2017-08-18 东南大学 基于Halstead复杂度度量的软件演化评估方法
CN107608732A (zh) * 2017-09-13 2018-01-19 扬州大学 一种基于bug知识图谱的bug搜索定位方法
CN107967208A (zh) * 2016-10-20 2018-04-27 南京大学 一种基于深度神经网络的Python资源敏感缺陷代码检测方法
CN108932192A (zh) * 2017-05-22 2018-12-04 南京大学 一种基于抽象语法树的Python程序类型缺陷检测方法
CN110532019A (zh) * 2019-06-27 2019-12-03 北京大学 一种软件代码片段历史追溯的方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105159715B (zh) * 2015-09-01 2018-07-20 南京大学 一种基于抽象语法树节点变更抽取的Python代码变更提示方法
US10782964B2 (en) * 2017-06-29 2020-09-22 Red Hat, Inc. Measuring similarity of software components

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9009665B2 (en) * 2012-05-16 2015-04-14 International Business Machines Corporation Automated tagging and tracking of defect codes based on customer problem management record
CN107967208A (zh) * 2016-10-20 2018-04-27 南京大学 一种基于深度神经网络的Python资源敏感缺陷代码检测方法
CN107066384A (zh) * 2017-03-28 2017-08-18 东南大学 基于Halstead复杂度度量的软件演化评估方法
CN108932192A (zh) * 2017-05-22 2018-12-04 南京大学 一种基于抽象语法树的Python程序类型缺陷检测方法
CN107608732A (zh) * 2017-09-13 2018-01-19 扬州大学 一种基于bug知识图谱的bug搜索定位方法
CN110532019A (zh) * 2019-06-27 2019-12-03 北京大学 一种软件代码片段历史追溯的方法

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
"Investigating the Impact of Multiple Dependency";Di Cui等;《2019 IEEE/ACM 41st International Conference on Software Engineering (ICSE)》;20190531;全文 *
"Locating Bug IDs and Development Logs in Open Source Software (OSS) projects:An Experience Report";Bilyaminu Auwal Romo等;《2018 International Conference on Innovation and Intelligence for Informatics, Computing, and Technologies (3ICT)》;20181120;全文 *
"node2defect: Using Network Embedding to Improve Software";Yu Qu等;《2018 33rd IEEE/ACM International Conference on Automated Software Engineering (ASE)》;20180907;全文 *
《软件抄袭检测研究综述》;田振洲等;《信息安全学报》;20160715;全文 *
《面向源代码的软件漏洞静态检测综述》;李珍;《网络与信息安全学报》;20190215;全文 *

Also Published As

Publication number Publication date
CN111913874A (zh) 2020-11-10

Similar Documents

Publication Publication Date Title
CN111916161B (zh) 用于临床试验过程中多数据源采集转换的方法及装置
CN111913874B (zh) 一种基于语法结构变更分析的软件缺陷溯源方法
CN109492106B (zh) 一种文本代码相结合的缺陷原因自动分类方法
CN113656805B (zh) 一种面向多源漏洞信息的事件图谱自动构建方法及系统
CN107016018B (zh) 数据库索引创建方法及装置
CN110442847B (zh) 基于代码仓库过程管理的代码相似性检测方法及装置
CN111127068B (zh) 一种工程量清单自动组价方法和装置
CN114547619B (zh) 一种基于树的漏洞修复系统及修复方法
Stephan et al. Using mutation analysis for a model-clone detector comparison framework
KR102099069B1 (ko) 하이브리드 erd 관리 시스템 및 그 방법
CN108228232B (zh) 一种针对程序中循环问题的自动修复方法
CN116523284A (zh) 基于机器学习的业务操作流程自动化评估方法、系统
CN103744788B (zh) 基于多源软件数据分析的特征定位方法
CN114398394A (zh) 数据血缘解析方法、装置、设备及存储介质
CN110806977A (zh) 基于产品需求的测试用例集生成方法、装置及电子设备
CN117093260B (zh) 一种基于决策树分类算法的融合模型网站结构解析方法
CN112699018A (zh) 基于软件缺陷关联分析的软件缺陷定位方法
CN111913704A (zh) 一种基于VSCode快速开发GSP7脚本的方法及插件工具
CN111522705A (zh) 一种工业大数据智能运维解决方法
CN115438341A (zh) 提取代码循环计数器的方法、装置、存储介质和电子设备
CN117390130A (zh) 一种基于多模态表示的代码搜索方法
CN112766707B (zh) 细胞全生命周期追溯方法、应用服务器、系统及存储介质
CN115168085A (zh) 一种基于diff代码块匹配的重复冲突方案检测方法
CN114722960A (zh) 一种业务过程事件日志不完整轨迹检测方法与系统
CN113505283A (zh) 一种测试数据的筛选方法及系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant