本发明专利技术属于软件工程技术领域,具体为一种基于演化历史分析的代码克隆危害性评估方法。本发明专利技术方法主要针对由于一致性修改以及由此带来的代码缺陷而产生的代码克隆危害性问题,通过代码克隆演化历史追溯和一致性修改过程分析产生代码克隆实例一致性修改比例、一致性修改时间差等度量值并识别缺陷相关的一致性修改,在此基础上根据一组规则确定代码克隆类的危害性程度。
Evaluation method of code clone harm based on evolutionary history analysis
【技术实现步骤摘要】
基于演化历史分析的代码克隆危害性评估方法
本专利技术属于软件工程
,具体涉及代码克隆的分类及其危害性评估方法,适用于软件维护和演化过程中的代码克隆(重复代码)分析。
技术介绍
代码克隆是指相似或相同的代码(可以是代码片段、方法、文件、模块等不同粒度),即重复代码。一组相似或相同的代码克隆拷贝称为一个克隆类,其中每一个拷贝成为一个克隆实例。代码克隆广泛存在于开源以及企业软件项目中,并被广泛认为是一种代码坏味道(badsmell),在软件设计质量、代码的一致性维护、缺陷传播等方面都有很多不利影响。然而,代码克隆存在很多不同类型,其产生也不全是因为代码复制粘贴。例如,有些代码克隆是由于代码自动生成而产生的,而有些代码克隆是由于通用API的共性使用模式或通用算法实现所产生的,这些代码克隆一般没有危害。为此,企业在面对遗留系统中的代码克隆问题时,需要对各种代码克隆进行分析和评价,确定其危害性从而为相应的重构决策提供依据和支撑。
技术实现思路
本专利技术的目的是为企业代码库提供一种基于历史演化分析的代码克隆危害性评估方法,为企业对各种代码克隆进行分析和评价,确定其危害性从而为相应的重构决策提供依据和支撑。本专利技术提供的基于演化历史分析的代码克隆危害性评估方法,主要针对代码克隆由于一致性修改(即多个克隆实例之间需要进行相似的代码修改)以及由此带来的代码缺陷(即由于某些克隆实例遗漏所需要的代码修改而导致缺陷)而产生的危害,不考虑代码克隆对于代码复杂度和设计结构的影响。通过代码克隆演化历史追溯和一致性修改过程分析产生代码克隆实例一致性修改比例、一致性修改时间差等度量值并识别缺陷相关的一致性修改,在此基础上根据一组规则确定代码克隆类的危害性程度。本专利技术提供的基于演化历史分析的代码克隆危害性评估方法,具体步骤如下。(1)代码克隆检测从版本库中检出一个或多个目标软件系统的当前最新版本快照,利用代码克隆检测工具检测其中的代码克隆,产生代码克隆类及其实例。(2)代码克隆演化历史追溯针对待分析的代码克隆类中的每一个克隆实例,基于来自版本库的代码提交(Commit)历史和来自缺陷库的缺陷报告列表,进行代码克隆演化历史追溯;具体流程为:1)通过代码提交历史回溯找到首次引入该克隆实例的代码提交;2)分析从该克隆实例首次引入到最新版本快照之间的代码提交历史,识别对该克隆实例进行了修改的变更操作,收集每一个变更操作的修改时间(即代码提交时间)、修改类型(增加、删除或修改代码)、修改位置(修改在克隆代码中的相对位置)、修改内容(增加、删除或修改的内容)等信息,形成该克隆实例的变更操作集合;3)根据代码提交与缺陷报告的关联关系(如代码提交消息中的缺陷报告ID)确定该克隆实例的每一个变更操作是否属于缺陷修复操作,即该变更操作所对应的代码提交目的是否是缺陷修复。(3)一致性修改过程分析;针对待分析的代码克隆类的每两个实例构成的克隆实例对,以较晚引入的克隆实例的引入时间为起点,以当前最新版本为终点,基于这段时间之内它们的代码克隆演化历史(即只考虑这段时间之内的克隆实例变更操作),进行一致性修改过程分析;具体流程为:1)对来自这两个克隆实例的变更操作两两进行匹配,如果两个修改操作的修改类型、修改位置、修改内容都相同,那么认为这两个变更操作属于一致性修改并将它们的修改时间之差作为修改时间差;2)对于所发现的每一对一致性修改,如果其中有一个变更操作属于缺陷修复操作,那么将这一对一致性修改标记为缺陷相关的一致性修改;3)按照以下方式计算这两个克隆实例的一致性修改度量:设这两个克隆实例的变更操作集合分别为CS1和CS2,其中一致性修改对的集合为CC,某个一致性修改对cc的时间差为Δcc,那么这两个克隆实例的修改操作数为|CS1|+|CS2|,一致性修改比例为2*|CC|/(|CS1|+|CS2|),一致性修改时间差为CC中所有cc的Δcc的中位值。(4)代码克隆危害分析;根据待分析的代码克隆类中所有的克隆实例对的一致性修改度量,进行克隆危害分析;危害分析的具体规则为:1)如果所有克隆实例对的修改操作数为0,那么可以认为该代码克隆类稳定不变,因此无害;2)如果所有克隆实例对的一致性修改比例为0,那么可以认为该代码克隆类的各个实例独立演化、无需保持一致性修改,因此无害;3)如果不属于以上两种情况,那么进一步根据以下规则进行克隆危害分析:如果同时满足所有克隆实例对的平均一致性修改比例小于给定的阈值Threshold#ccratio,平均一致性修改时间差小于给定的阈值Threshold#deltaTime,没有发生过缺陷相关的一致性修改这三个条件,那么可以认为该代码克隆类需要少量的一致性维护,因此具有较低的危害性;如果没有发生过缺陷相关的一致性修改,并且所有克隆实例对的平均一致性修改比例大于等于给定的阈值Threshold#ccratio或者平均一致性修改时间差大于等于给定的阈值Threshold#deltaTime,那么可以认为该代码克隆类需要较多的一致性修改或保持一致性演化难度较高,因此具有中等的危害性;如果发生过缺陷相关的一致性修改,那么该代码克隆类危害度较高。本专利技术技术方案与现有技术相比,具有以下的优点和积极效果:本专利技术的方法可实现针对给定软件项目给定版本的代码,自动分析其中克隆代码的修改历史,进而综合评估其对软件维护的危害程度。附图说明图1为方法总体流程。图2为实施方式示意图。其中描述了由3个克隆实例组成的克隆组及其演化历史,并标出了每个克隆实例的修改、一致性修改以及一致性修改的时间差。具体实施方式本节给出了基于演化历史分析的代码克隆危害性评估方法的实施方式。给定一个GitHub项目的代码仓库R以及该项目开发过程中的缺陷报告数据。假定该代码仓库R已经切换到其最新版本。根据本专利技术的方法,对该代码仓库R当前的代码用任意代码克隆检测工具进行代码克隆检测,得到n个代码克隆类。每个代码克隆类由若干个代码克隆片段(即克隆实例)组成。以方法粒度的代码克隆检测为例,一个克隆实例即为一个方法。对某个代码克隆类G,假设其包含克隆实例数为3(即有3个方法相互之间是克隆),分别编号为1、2、3。对其中的每个方法,在代码库中收集它们的修改历史,结果发现克隆实例1修改了5次,克隆实例2修改了4次,克隆实例3修改了3次,其中有克隆实例1中第1次修改与克隆实例2中第2次、克隆实例3中的第1次修改是一致性修改;克隆实例1中第2次修改与克隆实例2中第3次修改是一致性修改;克隆实例2中第4次修改与克隆实例3中第3次修改是一致性修改。各次一致性修改的时间差如图2所示:由克隆实例1、2组成的克隆对,一致性修改时间差为3天(两次均为3天,中位值为3),其一致性修改比例为4/9(即0.44);克隆实例2、3组成的克隆对,一致性修改时间差为0.5天(两对一致性修改的时间差分别是0天、1天,中位本文档来自技高网...
【技术保护点】
1.基于演化历史分析的代码克隆危害性评估方法,主要针对代码克隆由于一致性修改以及由此带来的代码缺陷而产生的危害,一致性修改是指多个克隆实例之间需要进行相似的代码修改,代码缺陷是指由于某些克隆实例遗漏所需要的代码修改而导致缺陷;其特征在于,危害性评估的具体步骤为:/n(1)代码克隆检测;/n从版本库中检出一个或多个目标软件系统的当前最新版本快照,利用代码克隆检测工具检测其中的代码克隆,产生代码克隆类及其实例;/n(2)代码克隆演化历史追溯;/n针对待分析的代码克隆类中的每一个克隆实例,基于来自版本库的代码提交历史和来自缺陷库的缺陷报告列表,进行代码克隆演化历史追溯;/n(3)一致性修改过程分析;/n针对待分析的代码克隆类的每两个实例构成的克隆实例对,以较晚引入的克隆实例的引入时间为起点,以当前最新版本为终点,基于这段时间之内它们的代码克隆演化历史,即只考虑这段时间之内的克隆实例变更操作,进行一致性修改过程分析:/n(4)代码克隆危害分析;/n根据待分析的代码克隆类中所有的克隆实例对的一致性修改度量,进行克隆危害分析。/n
【技术特征摘要】
1.基于演化历史分析的代码克隆危害性评估方法,主要针对代码克隆由于一致性修改以及由此带来的代码缺陷而产生的危害,一致性修改是指多个克隆实例之间需要进行相似的代码修改,代码缺陷是指由于某些克隆实例遗漏所需要的代码修改而导致缺陷;其特征在于,危害性评估的具体步骤为:
(1)代码克隆检测;
从版本库中检出一个或多个目标软件系统的当前最新版本快照,利用代码克隆检测工具检测其中的代码克隆,产生代码克隆类及其实例;
(2)代码克隆演化历史追溯;
针对待分析的代码克隆类中的每一个克隆实例,基于来自版本库的代码提交历史和来自缺陷库的缺陷报告列表,进行代码克隆演化历史追溯;
(3)一致性修改过程分析;
针对待分析的代码克隆类的每两个实例构成的克隆实例对,以较晚引入的克隆实例的引入时间为起点,以当前最新版本为终点,基于这段时间之内它们的代码克隆演化历史,即只考虑这段时间之内的克隆实例变更操作,进行一致性修改过程分析:
(4)代码克隆危害分析;
根据待分析的代码克隆类中所有的克隆实例对的一致性修改度量,进行克隆危害分析。
2.根据权利要求1所述的方法,其特征在于,步骤(2)中所述进行代码克隆演化历史追溯的流程为:
1)通过代码提交历史回溯找到首次引入该克隆实例的代码提交;
2)分析从该克隆实例首次引入到最新版本快照之间的代码提交历史,识别对该克隆实例进行了修改的变更操作,收集每一个变更操作的修改时间、修改类型、修改位置、修改内容信息,形成该克隆实例的变更操作集合;
3)根据代码提交与缺陷报告的关联关系(如代码提交消息中的缺陷报告ID)确定该克隆实例的每一个变更操作是否属于缺陷修复操作,即该变更操作所对应的代码提交目的是否是缺陷修复。
3.根据权利要求2所述的方法,其特征在于,步骤(3)中所述进行一致性修改过程分析的流程为:
1)对来自这两个克隆实例的变...
【专利技术属性】
技术研发人员:彭鑫,吴毅坚,赵文耘,
申请(专利权)人:复旦大学,
类型:发明
国别省市:上海;31
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。