CN111240740B - 基于演化历史分析的代码克隆危害性评估方法 - Google Patents

基于演化历史分析的代码克隆危害性评估方法 Download PDF

Info

Publication number
CN111240740B
CN111240740B CN202010077081.0A CN202010077081A CN111240740B CN 111240740 B CN111240740 B CN 111240740B CN 202010077081 A CN202010077081 A CN 202010077081A CN 111240740 B CN111240740 B CN 111240740B
Authority
CN
China
Prior art keywords
clone
modification
code
consistency
defect
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
CN202010077081.0A
Other languages
English (en)
Other versions
CN111240740A (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.)
Fudan University
Original Assignee
Fudan 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 Fudan University filed Critical Fudan University
Priority to CN202010077081.0A priority Critical patent/CN111240740B/zh
Publication of CN111240740A publication Critical patent/CN111240740A/zh
Application granted granted Critical
Publication of CN111240740B publication Critical patent/CN111240740B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • G06F8/751Code clone detection

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明属于软件工程技术领域,具体为一种基于演化历史分析的代码克隆危害性评估方法。本发明方法主要针对由于一致性修改以及由此带来的代码缺陷而产生的代码克隆危害性问题,通过代码克隆演化历史追溯和一致性修改过程分析产生代码克隆实例一致性修改比例、一致性修改时间差等度量值并识别缺陷相关的一致性修改,在此基础上根据一组规则确定代码克隆类的危害性程度。

Description

基于演化历史分析的代码克隆危害性评估方法
技术领域
本发明属于软件工程技术领域,具体涉及代码克隆的分类及其危害性评估方法,适用于软件维护和演化过程中的代码克隆(重复代码)分析。
背景技术
代码克隆是指相似或相同的代码(可以是代码片段、方法、文件、模块等不同粒度),即重复代码。一组相似或相同的代码克隆拷贝称为一个克隆类,其中每一个拷贝成为一个克隆实例。代码克隆广泛存在于开源以及企业软件项目中,并被广泛认为是一种代码坏味道(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天,中位值为0.5),其一致性修改比例为4/7(即0.57);克隆实例1、3组成的克隆对,一致性修改时间差为4天(仅有一对一致性修改,时间差为4天),其一致性修改比例为2/8(即0.25)。整个克隆组的一致性修改比例为0.42,平均一致性修改时间差为2.5天。若设置一致性修改比例阈值Threshold#ccratio为0.3、一致性修改时间差阈值Threshold#deltaTime为2天,则该克隆组的危害性为中等。若在某次一致性修改中,确认是对某个缺陷的修复,则该克隆组危害性将升级为高。
在该例中,给定软件代码克隆的危害性可通过自动化的代码修改历史分析得到,并根据一致性修改情况和由一致性缺陷导致的缺陷信息自动对代码克隆的危害性的大小进行评估。

Claims (4)

1.基于演化历史分析的代码克隆危害性评估方法,主要针对代码克隆由于一致性修改以及由此带来的代码缺陷而产生的危害,一致性修改是指多个克隆实例之间需要进行相似的代码修改,代码缺陷是指由于某些克隆实例遗漏所需要的代码修改而导致缺陷;其特征在于,危害性评估的具体步骤为:
(1)代码克隆检测;
从版本库中检出一个或多个目标软件系统的当前最新版本快照,利用代码克隆检测工具检测其中的代码克隆,产生代码克隆类及其实例;
(2)代码克隆演化历史追溯;
针对待分析的代码克隆类中的每一个克隆实例,基于来自版本库的代码提交历史和来自缺陷库的缺陷报告列表,进行代码克隆演化历史追溯;
(3)一致性修改过程分析;
针对待分析的代码克隆类的每两个实例构成的克隆实例对,以较晚引入的克隆实例的引入时间为起点,以当前最新版本为终点,基于这段时间之内它们的代码克隆演化历史,即只考虑这段时间之内的克隆实例变更操作,进行一致性修改过程分析:
(4)代码克隆危害分析;
根据待分析的代码克隆类中所有的克隆实例对的一致性修改度量,进行克隆危害分析;
按照以下方式计算克隆实例对的一致性修改度量:设这两个克隆实例的变更操作集合分别为CS1和CS2,其中一致性修改对的集合为CC,某个一致性修改对cc的时间差为Δcc,那么这两个克隆实例的修改操作数为|CS1|+|CS2|,一致性修改比例为2*|CC|/(|CS1|+|CS2|),一致性修改时间差为CC中所有cc的Δcc的中位值。
2.根据权利要求1所述的方法,其特征在于,步骤(2)中所述进行代码克隆演化历史追溯的流程为:
1)通过代码提交历史回溯找到首次引入该克隆实例的代码提交;
2)分析从该克隆实例首次引入到最新版本快照之间的代码提交历史,识别对该克隆实例进行了修改的变更操作,收集每一个变更操作的修改时间、修改类型、修改位置、修改内容信息,形成该克隆实例的变更操作集合;
3)根据代码提交与缺陷报告的关联关系确定该克隆实例的每一个变更操作是否属于缺陷修复操作,即该变更操作所对应的代码提交目的是否是缺陷修复。
3.根据权利要求2所述的方法,其特征在于,步骤(3)中所述进行一致性修改过程分析的流程为:
1)对来自这两个克隆实例的变更操作两两进行匹配,如果两个修改操作的修改类型、修改位置、修改内容都相同,那么认为这两个变更操作属于一致性修改并将它们的修改时间之差作为修改时间差;
2)对于所发现的每一对一致性修改,如果其中有一个变更操作属于缺陷修复操作,那么将这一对一致性修改标记为缺陷相关的一致性修改;
3)按照以下方式计算这两个克隆实例的一致性修改度量:设这两个克隆实例的变更操作集合分别为CS1和CS2,其中一致性修改对的集合为CC,某个一致性修改对cc的时间差为Δcc,那么这两个克隆实例的修改操作数为|CS1|+|CS2|,一致性修改比例为2*|CC|/(|CS1|+|CS2|),一致性修改时间差为CC中所有cc的Δcc的中位值。
4.根据权利要求3所述的方法,其特征在于,步骤(4)中所述进行克隆危害分析的规则为:
1)如果所有克隆实例对的修改操作数为0,那么认为该代码克隆类稳定不变,因此无害;
2)如果所有克隆实例对的一致性修改比例为0,那么认为该代码克隆类的各个实例独立演化、无需保持一致性修改,因此无害;
3)如果不属于以上两种情况,那么进一步根据以下规则进行克隆危害分析:
如果同时满足所有克隆实例对的平均一致性修改比例小于给定的阈值Threshold#ccratio,平均一致性修改时间差小于给定的阈值Threshold#deltaTime,没有发生过缺陷相关的一致性修改这三个条件,那么认为该代码克隆类需要少量的一致性维护,因此具有较低的危害性;
如果没有发生过缺陷相关的一致性修改,并且所有克隆实例对的平均一致性修改比例大于等于给定的阈值Threshold#ccratio或者平均一致性修改时间差大于等于给定的阈值Threshold#deltaTime,那么认为该代码克隆类需要较多的一致性修改或保持一致性演化难度较高,因此具有中等的危害性;
如果发生过缺陷相关的一致性修改,那么该代码克隆类危害度较高。
CN202010077081.0A 2020-01-23 2020-01-23 基于演化历史分析的代码克隆危害性评估方法 Active CN111240740B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010077081.0A CN111240740B (zh) 2020-01-23 2020-01-23 基于演化历史分析的代码克隆危害性评估方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010077081.0A CN111240740B (zh) 2020-01-23 2020-01-23 基于演化历史分析的代码克隆危害性评估方法

Publications (2)

Publication Number Publication Date
CN111240740A CN111240740A (zh) 2020-06-05
CN111240740B true CN111240740B (zh) 2021-09-17

Family

ID=70879826

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010077081.0A Active CN111240740B (zh) 2020-01-23 2020-01-23 基于演化历史分析的代码克隆危害性评估方法

Country Status (1)

Country Link
CN (1) CN111240740B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012079230A1 (en) * 2010-12-15 2012-06-21 Microsoft Corporation Intelligent code differencing using code clone detection
CN104572471A (zh) * 2015-01-28 2015-04-29 杭州电子科技大学 一种基于索引的Java软件代码克隆检测方法
CN105190546A (zh) * 2013-03-08 2015-12-23 日本电气方案创新株式会社 成本计算装置、成本计算方法及计算机可读记录介质
CN106843840A (zh) * 2016-12-23 2017-06-13 中国科学院软件研究所 一种基于相似度分析的源代码版本演化注释复用方法
CN109828785A (zh) * 2019-01-23 2019-05-31 复旦大学 一种采用gpu加速的近似代码克隆检测方法
CN109976806A (zh) * 2019-01-03 2019-07-05 杭州电子科技大学 基于字节码序列匹配的Java语句块克隆检测方法

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120159434A1 (en) * 2010-12-20 2012-06-21 Microsoft Corporation Code clone notification and architectural change visualization
CN104077147A (zh) * 2014-07-11 2014-10-01 东南大学 一种基于代码克隆自动检测和及时提醒的软件复用方法
CN204129783U (zh) * 2014-09-09 2015-01-28 杜晨林 基于云计算技术的综合检测系统
CN106919403B (zh) * 2017-03-16 2019-12-13 杭州鹿径科技有限公司 云环境下基于Java字节码的多粒度代码克隆检测方法

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012079230A1 (en) * 2010-12-15 2012-06-21 Microsoft Corporation Intelligent code differencing using code clone detection
CN105190546A (zh) * 2013-03-08 2015-12-23 日本电气方案创新株式会社 成本计算装置、成本计算方法及计算机可读记录介质
CN104572471A (zh) * 2015-01-28 2015-04-29 杭州电子科技大学 一种基于索引的Java软件代码克隆检测方法
CN106843840A (zh) * 2016-12-23 2017-06-13 中国科学院软件研究所 一种基于相似度分析的源代码版本演化注释复用方法
CN109976806A (zh) * 2019-01-03 2019-07-05 杭州电子科技大学 基于字节码序列匹配的Java语句块克隆检测方法
CN109828785A (zh) * 2019-01-23 2019-05-31 复旦大学 一种采用gpu加速的近似代码克隆检测方法

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
Can I Clone This Piece of Code Here?;Xiaoyin Wang等;《ASE"12》;20120907;全文 *
How clones are maintained:;L. Aversano等;《11th European Conference on Software Maintenance》;20070323;全文 *
克隆代码有害性预测中的特征选择模型;王欢等;《计算机应用》;20170430;第37卷(第4期);全文 *
基于支持向量机的克隆代码有害性评价方法;张帆龙等;《智能计算机与应用》;20160828;第6卷(第4期);全文 *

Also Published As

Publication number Publication date
CN111240740A (zh) 2020-06-05

Similar Documents

Publication Publication Date Title
US10296447B2 (en) Automated software program repair
Islam et al. Bug replication in code clones: An empirical study
Herzig Using pre-release test failures to build early post-release defect prediction models
Alshehri et al. Applying machine learning to predict software fault proneness using change metrics, static code metrics, and a combination of them
CN109740457B (zh) 一种人脸识别算法评测方法
CN111949480B (zh) 一种基于组件感知的日志异常检测方法
KR102282382B1 (ko) 소프트웨어의 신뢰성 시험 시스템 및 시험 방법
Islam et al. A comparative study of software bugs in micro-clones and regular code clones
Mondal et al. Investigating context adaptation bugs in code clones
WO2019019429A1 (zh) 一种虚拟机异常检测方法、装置、设备及存储介质
CN114757468A (zh) 一种面向流程挖掘中流程执行异常的根源分析方法
CN111240740B (zh) 基于演化历史分析的代码克隆危害性评估方法
CN113328914A (zh) 工控协议的模糊测试方法、装置、存储介质及处理器
CN111581110A (zh) 一种业务数据准确性检测方法、装置、系统及存储介质
CN104572433B (zh) 一种金融信息系统测试方法和装置
CN113641573B (zh) 基于修订日志的程序分析软件自动化测试方法及系统
KR20200065820A (ko) 스마트 팩토리 도입을 위한 디지털트윈 모델링 기반의 에너지 및 보안 효율성 분석 시스템
CN112035364B (zh) 功能测试结果评估方法及装置
Pathania et al. Role of test case prioritization based on regression testing using clustering
Schäfer et al. Experiments on code clone detection and machine learning
Wang et al. Empirical study on the correlation between software structural modifications and its fault-proneness
Zhou et al. A logistic regression based approach for software test management
CN111124922A (zh) 基于规则的自动程序修复方法、存储介质和计算设备
Kapel et al. On the Difficulty of Identifying Incident-Inducing Changes
CN109947657A (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