软件源代码中的代码克隆现象及其检测方法

第25卷第9期 2008年9月 计算机应用与软件 

Computer Applications and Software V0l_25 No.9 Sep.2008 

软件源代码中的代码克隆现象及其检测方法 叶青青 (杭州职业技术学院浙江杭州310018) 

摘 要 如果软件源程序中的一个代码段和同一程序中的另一个代码段在结构或语义上类似,这些代码段就成了代码克隆。概 述代码克隆存在的各种形式,分析代码克隆产生的原因,并在概括了代码克隆检测的一般过程以后进一步阐述两类代码克隆检测方 法:基于语义抽象树的检测方法和基于Token序列的检测方法。 

关键词 代码克隆 软件维护 软件理解语义抽象树 后缀树 频繁项集挖掘 

CoDE CLoNES IN PRoGRAMS AND THEIR DETECTIoN Ye Qingqing (Hangzhou Vocational and Technical College,Hangzhou 310018,Zhejiang,China) 

Abstract If a code segment is similar structurally or semantically to another code segment in a source program of software,these tow code segments are called code clones.This paper describes the various forms of code clones and analyzes the factors that lead to code clones.After a brief depiction of the general ̄amework of detecting code clones.it discusses two types of clone detection techniques:abstract syntax tree— based methods,and token—based methods. 

Keywords Code clone Software maintenance Program understanding Abstract syntax tree Suffix—tree Frequent item set mining 

0 引 言 如果一个软件的源程序中的一个代码段和同一程序中的另 个代码段在结构或语义上类似,这些代码段就成了代码克隆。 代码克隆的存在增加了软件维护的困难。如果所修改的部分有 克隆的代码段,这些克隆代码段也常常需要修改。这一情形有 三个主要缺点:第一,增加了编辑修改的工作量,因为软件开发 者要修改所有的克隆代码;第二,因为修改不是同时进行,难以 确保修改的一致性;第三,要靠人力找出所有的克隆不是一件容 易的事,难免会漏掉一些克隆代码。如何检测出源代码中存在 的克隆代码因而成了软件工程研究中的一个重要课题。 

1代码克隆问题 1.1代码克隆的定义 基于对类似度的定义的不同,代码克隆也有不同的定义。 最严格的克隆定义要求两个代码段之问完全相同,即一段代码 是另一段代码的逐字重复。这样的定义很严格,没有考虑代码 格式的不同,或系统性的变量名置换等引起的词法上的表面区 别。以图1中的两个程序A和B为例,按照完全克隆的定义, 只有A的行1和B的行2才是一对代码克隆。这样严格的定义 并没有什么实际应用价值。更一般的代码克隆的定义不考虑程 序段之间由于格式或变量名的不同而引起的词法上的区别,而 着重于程序段之间的结构和语义上的类似。按照这一定义,图 1的程序A和B有两个代码克隆对:A的行1至行4与B的行2 至行4;A的行5至行7与B的行6至行7。 

程序A: 程序B: 1 upper=100; l Sum=0; 2 illax=arr[O]; 2 tipper=100; 3 rain=an'j01; 3 big=s[0】;small sIO]; 4 for(i=0;i<upper; +){ 4 fnr(p=O;P<tipper;p++f】 5 if(arr[i]>max)max=arr[i];5 slim=sum sip]; 6 if(art[i]<min)nfin=aITIi];6 if(s[pI>big)big=s[p]; 7} 7 if(sip]<smal1)small=s[p];} 

图1代码克隆例 进一步观察上面的两个代码克隆对,可以发现这两个代码 克隆对之间只被程序B的行5隔开。如果允许克隆对中有少量 不同的语句的存在,上面的两个克隆对就可以合并成一个克隆 对,即A的行1至行7与B的行2至行7构成一个克隆对。这 样当中含少量不同语句的克隆对一般被称为断层克隆。考虑到 程序员在编程过程中采用cut/paste后通常会进行修改,增加或 删除一些语句,检测断层克隆就变得很有必要。 1.2代码克隆现象和原因 代码克隆在软件系统中很普遍。即使是业界公认的高质量 系统如X Windows System仍有19%的代码克隆存在 ,Linux 的核心部分有15—25%左右的代码克隆 J。一般软件系统中 的代码克隆的比例更高,有些甚至高达38% 。 软件开发者常用的copy/paste是造成代码克隆的主要原因 之一。尽管几乎所有的软件工程教科书都反对copy/paste,要求 软件开发者把相类似的操作抽象成宏代码或函数,避免代码克 隆的存在,但是对那些系统中存在的代码克隆的分析发现,有些 代码克隆的存在是不可避免的。其中的第一个原因是对系统效 率的考虑,因为函数调用会带来额外的系统负担,在很多情况 

收稿日期:2007—06—13。叶青青,讲师,主研领域:软件工程。 

维普资讯 http://www.cqvip.com 148 计算机应用与软件 2008丘 下,软件开发人员在权衡利弊后会选择克隆代码。其次,有些系 列操作在问题领域中没有对应的基本的概念,难以抽象成一个意 义的函数。如果勉强把它们抽象成一个函数,会大大增加程序理 解的难度。比如说,调用库函数时往往需要一些固定的操作组合 等等。第三,象各种驱动程序等软件模块在结构上大致相同,但 具体细节多有不同,难以抽象为函数进行系统性的复用。 

2克隆检测的一般过程 如图2所示,检测源代码中含有的克隆代码由三个主要步 骤组成:中间形式生成,原型克隆检测和克隆报告生成。 

图2克隆检测过程 源代码是为编译器以及软件维护人员而编写的,其中含有 大量与克隆代码检测无关的信息。克隆代码检测一般无法对源 代码直接进行操作,必须要从源代码中抽出只与克隆代码检测 有关的信息,生成便于进行克隆检测的中间形式。 原型克隆检测对源程序的中间形式进行分析,检测出具有 相同的中间形式的程序段。由于这一过程的结果只是在中间形 式上的相同,而不一定是最后所要求的代码克隆,我们称之为原 型克隆。通过对这些原型克隆的分析和剪接处理,克隆报告生 成把原型克隆还原成有意义的源代码克隆对,输出具有良好可 读性的克隆报告。把原型克隆还原成源代码的克隆需要中间形 式和源代码之间的对应关系,因此,中间形式生成过程还需要生 成一个程序格式信息表格,用于纪录中间形式和源代码之间的 对应关系。 克隆代码检测方法取决于采用什么样的中间形式来表示程 序源代码。抽象语法树和Token序列是两种主要的中间形式, 本文将在下面两节里讨论基于这两种中间形式的检测方法。 

3基于抽象语法树的方法 基于抽象语法树(AST)的方法利用源程序的AST作为代码 克隆检测的中间形式。它首先对源程序作句法解析,生成抽象 语法树,然后把每一棵子树与其他的子树进行比较,找出相同的 子树从而找出克隆的代码段。对有N个结点的AST,这一子树 逐一比较过程需要O(N^3)的计算时间,由于一行程序语句平均 会生成10个抽象句法树结点,实际上的处理时间是0(L^4),L 为程序的语句数。这样的方法显然无法处理大型的程序,因此 本方法的关键在于提高子树的比较效率,主要有直接散列法和 特征矢量法两种方法。 3.1直接散列法 直接散列法利用散列函数把每一个树结点映射到散列值, 然后根据散列值对子树进行比较。AST中的仅含有标识符的叶 子结点都被映射到同一散列值,以消除仅仅由标识符而引入的 区别。 子树T1和T2的相似性可用下列公式进行计算: Sire(T1,T2)=2 S/(2 S+T1一only+T2一only) 

其中s表示T1和T2所含有的结点中具有相同散列值的结点的 个数,T1 only表示仅在T1中出现的结点的个数,T2一only则表 示仅在T2中出现的结点的个数。一旦两个子树的相似性超过一 个预定的阂值,就可以把它们当作代码克隆。克隆检测的精确度 可通过对阈值的设定来调节,如果设定的阂值为1.0,那么只有那 些仅在标识符上有所不同的代码段才会被判断成克隆代码。 3.2特征矢量法 特征矢量法用多维矢量表示AST结点的结构信息,每一维 代表程序语言的基本成分。文献[4]提议用下列9维特征来表 示C和Java源代码: [标识符,常量,赋值,增1,数组,条件,表达式,宣言,循环] 每一个结点的特征矢量值通过后序遍历计算,父结点的值 是所有子结点的值和父结点本身的特征值的矢量和。图3例示 赋值语句x=1的特征矢量值及其计算方式,该语句的特征矢量 值是[1,1,1,0,0,0,0,O,0]’因为在其AST中,它的父结点是赋 值语句,其特征值是[0,0,1,0,0,0,0,0,0];它还有两个子结点, 分别是标识符[1,0,0,0,0,0,0,0,0]和常量[0,1,0,0,0,0,0, 0],把上面三个特征值相加即得到这一赋值语句的特征矢量。 

图3 X=1的AST和其特征矢量值 这样一来,子树的类似性的比较就变成了特征矢量的比较。 可以考虑简单地采用计算矢量间的欧几里德距离来计算子树的 类似性。为了避免逐对比较所需的大量计算时间,可以用合适 的散列函数把矢量映射到散列值。LSH(Local Sensitive Has— hing) 就是这样的一种散列法,它能把距离相近的矢量映射到 同一散列值上,距离较远的矢量映射到不同的散列值上。 

4基于Token序列的方法 基于Token序列的克隆代码检测法对计算机源代码作简单 的词法分析,把源代码转换成Token序列,通过检测Token序列 中的重复序列找出克隆的代码。 4.1 Token序列生成 为提高克隆检测的效果,基于Token的检测方式会采取下 列几个步骤对源代码作变形处理生成源代码的Token序列以消 除源代码在表面上的区别。 最基本的变形处理是删除所有的对程序功能没有影响的注 释部分和各种冗余的空白字符(如重复的空格和制表符等)。 不同的方法对换行符的处理有些不同。比如说CCFinder 删除 所有的换行符,把整个程序变成一行Token序列。删除换行符 有利也有弊。它的优点在于可以最大程度地消除程序格式的不 同,但它也会增加系统的虚报,即检测出实际上并不是克隆的代 码。同时由于Token序列中不再有换行符,这一方法也会报出 跨行的代码克隆,需要在后期处理的克隆报告生成中加以删减, 把克隆代码的起始点和终止点移到语句行首与行尾。 第二类的变形处理删除程序中的冗余结构。这一类处理与 程序设计语言的特性有关系。以J a程序为例,可以考虑删除 impo ̄语句、pack ̄e定义语句等;还可以删除else、break、eonst、 protected、private、public、static等保留字。这些字符对要生成执 行代码的编译程序有意义,但对基于Token的克隆检测没有影 

合集下载

软件系统中代码克隆的检测技术

软件系统中代码克隆的检测技术

软件系统中代码克隆的检测技术
叶青青
【期刊名称】《计算机系统应用》
【年(卷),期】2007(000)012
【摘要】大型的软件系统常常有很多重复的克隆代码,给软件维护增加了很大的困难.如何利用工具检测这些重复代码是软件工程领域中一个重要的研究课题.本文首先引入了代码克隆的概念和定义,然后深入探讨自动检测克隆代码所面临的难点,并在此基础上详细阐述了利用后缀树检测代码克隆的一般方法.
【总页数】5页(P94-97,77)
【作者】叶青青
【作者单位】杭州职业技术学院,浙江杭州,310018
【正文语种】中文
【中图分类】TP3
【相关文献】
1.一种基于代码克隆检测技术的WSNs重编程方法 [J], 汪治理;章勇;刘红
2.基于深度学习的代码克隆检测技术研究 [J], 刘复星;魏金津;任女尔
3.代码克隆检测技术的Android应用重打包检测 [J], 陈其龙
4.克隆代码检测技术综述 [J], 曹羽中;金茂忠;刘超
5.克隆代码检测技术研究 [J], 侯敏;张丽萍
因版权原因,仅展示原文概要,查看原文内容请购买。

基于代码克隆检测的抽取方法重构模式识别

基于代码克隆检测的抽取方法重构模式识别

种 eclipse插件,能对一种或者几种重构模式进行 识 别;钟林辉等[5]提出了一种基于版本的多重软件重构 自动检测技术;刘洋[6]提出了一种可以识别函数抽取 的方法。但上述算法面对变更的文本时忽视了形式不 同而含义相似的情况,比如说一些变更仅仅是变量名 称改变,或者仅仅是字母大小写变换,含义并没有变。
第 36卷第 9期 2019年 9月
计算机应用与软件 ComputerApplicationsandSoftware
Vol36 No.9 Sep.2019
基于代码克隆检测的抽取方法重构模式识别
张志浩 杨春花
(齐鲁工业大学(山东省科学院)计算机科学与技术学院 山东 济南 250000)
摘 要 抽取方法是一种常用的代码重构手段,被广泛应用到软件开发和维护中。提出一个基于克隆检测的 抽取方法重构模式的识别算法。以代码变更块 hunk为单位,用代码克隆检测工具 simian对候选的 hunk进行筛 选,用语法分析对该模式进行判定。在 4个开源项目上进行实验,结果表明该算法具有较高的准确率。 关键词 重构模式 重构模式识别 代码克隆检测 代码变更 抽取方法 中图分类号 TP3 文献标识码 A DOI:10.3969/j.issn.1000386x.2019.09.003
在现代软件开发的过程中,代码变更包括特征增 加、修复 bug以及代码重构等。这些不同类型的变更 代码混合在一起使得阅读和理解代码变更趋于困难, 如果将重构的代码变更与其他变更进行隔离,将有利 于阅读和理解。
为了实现代码重构与其他变更的隔离,应该设法 对代码重构模式进行自动识别。当前,国内外学者对 软件重构识别进行了深入的研究探索。主要相关的研 究 有:Werβgerber等[2]提 出 了 基 于 签 名 分 析 的 方 法; Prete等[3]开发了 REFFINDER;Fokaefs等[4]开发了一

代码克隆检测方法研究进展

代码克隆检测方法研究进展
研究与开发
文章编号:1007-1423(2019)13-0032-07
DOI:10. 3969/j. issn. 1007-1423. 2019. 13.007
代码克隆检测方法研究进展
王婷,牟永敏,张志华
(北京信息科技大学计算机学院,北京100101)
摘要: 代码克隆检测问题是软件工程领域一个基础的研究课题.在代码片段推荐、软件项目维护等应用领域发挥着重要的 作用。随着在线代码库中代码规模的快速增长,以及信息检索、机器学习领域的快速发展,代码克隆检测的研究也取 得新的进展。介绍代码克隆检测的基本概念与主流方法,重点介绍近几年基于信息检索、机器学习的代码克隆检测 的主要方法,对基于token的融合信息检索与深度学习的方法进行实验。 关键词: 代码克隆检测;软件工程;机器学习;信息检索 基金项目: 北京市自然科学基金(重点研究专题项目 )(No.Z 160002);网络文化与数字传播北京市重点实验室开放课题 (No.ICDD2017XX)
C. K. Roy 等人何提出的 Mutation/injeetion-based
framework为解决真实系统中对克隆的判定存在歧义 的问题,提出了人工生成克隆的新思路,并采用变异分 析的方法构建人工克隆数据集和评测标准。Mutation/ injection-based framework将特定的编辑操作映射为一组代码变异操作符,将操作符应用于一段代码即可得 到特定类型的克隆代码。将克隆代码注入到原始代码 所在的系统中,构成克隆对已知的代码库。
与代码克隆检测相近的研究课题包括代码相似性 检测、软件抄袭检测等。熊浩等人冋在2010年发表过 一篇代码相似性检测的中文综述,但已无法涵盖最近 十年取得的最新进展。田振洲等人冏在2016年发表过 一篇软件抄袭领域的中文综述,但论文主要讨论二进 制代码的克隆检测,对源代码的克隆检测未做深入探 讨。因此本文只关注源代码克隆检测,介绍其基本概 念与主流方法,并重点介绍近几年基于信息检索、机器 学习的代码克隆检测的主要方法。

软件克隆检测技术研究

软件克隆检测技术研究
的根源在 于软件 的不同部分之 间存在 内在 的语 义联 系 。因
收稿 日期 :2 1 .0 2 0 1 1—4;修 回日期 :2 1— 2 1 0 1 1.2
基金项 目:国家自然科学基金 资助项 目(0 0 14) 软件工程国家重点 实验 室开放基金 6931 ;
资助项 目( K S 2 0 0 0 ) 深圳市科技研发资金基础研究计划资助项 目(C 0 0 5 84 2 S LE0872 ; J 2 10 2 03 A) 作者简 介:梁正平( 99 ), 湖南涟源人, 17 一 男, 副教授 , 士, 博 主要研 究方向为模型 克隆检 测、 需求 建模 与分析 等(inz @s .d . n ; 一群 1 gp z eu c ) 程 a u
Sfw r E gnei otae n i r g,Wua nvrt,Wua 30 2 hn e n h nU i sy ei h n4 0 7 ,C i a)
A bsr c : S fwa e c o e e to Sa v r mpot n e hn lg o o t r it n n e, s fwa e sr t r pt ia in, ta t o t r lne d tc in i ey i ra ttc oo y f rs fwa e man e a c o t r tucu e o i z to m
关联 , 特别是发掘高层 的结构克 隆 , 利于优 化软件 的结 构和 有
抽 象层次 , 提高软 件质 量 , 同时 降低软 件维护 的难度 和成本 。
软件克隆检测可广泛应用于程序理解 、 软件重构 、 抄袭检测 、 版 权保 护 、 面挖掘 、 品线开 发 、 方 产 恶意代 码分 析及错 误预 防等 领域 。 本文通过对 软件 克隆 的定 义与分 类 、 件克 隆 的检测 过 软

基于路径序列相似度判别的程序克隆检测方法

基于路径序列相似度判别的程序克隆检测方法

2018,54(2)1引言克隆代码在软件开发过程及软件系统中的运用十分普遍。

据相关研究,克隆代码在软件系统中的运用约占了近5%~20%。

目前,不加改动地复制代码片段在开发软件中是一种常见的现象。

被复制的代码就是原始代码,一般来说,在软件系统中很难辨别哪段是原始的、哪段是克隆的。

所以,在软件系统中有一定程度上相似的代码,就被认为是克隆代码。

克隆代码的存在给软件维护增加了困难,即使是在高质量的软件系统中,代码克隆也难以避免。

当在软件维护过程中出现错误时,就必须快速地把分散在各处与其他相似代码找出来,以避免其所有发生错误的可能,对一些软件功能做调整时,也需要找出相似代码。

因此,在软件系统中尽可能高质量地检测克隆代码就显得十分必要。

目前已有很多种克隆检测方法,主要包括基于文本的检测、基于token 序列的检测[1]、基于AST 语法树的检测[2-4],基于度量的检测、基于图的检测[5-6]等。

基于文本的检测,是从文本结构和语法的角度去分析克隆,易扩展到多种语言。

但是,这种检测忽略不同语言、语法差异的行为,会使一些克隆无法检测。

有部分研究,是从程序文本出发,将代码中的变量语句等内容进行规范化处理,让代码的书写风格统一化,进而在针对文本的相似度进行克隆分析[7]。

基于AST 语法树的检测,是将待检测代码转化为抽象语法树。

它是通过分析语言的全部语法结构,之结果对代码的语法结构进行静态分析。

这种方法的代价过大,检测时间相对较长[8-9]。

基于图的检测,是将代码转换为程序依赖图,对图中结点进行分类获取匹配结点,分析结点的数据依赖和控制依赖矩阵,查找图中的同构子图并对其进行泛化处理,计算程序的差异向量距离实现克隆检测。

这种检测方法对于断层克隆极为有效,但它对更深层次的功能克隆效果不明显[10]。

基于Token 序列的检测,通过将源代码中的标志符、关键字、运算符等词法标识符转换成统一的内部符号,并去掉标识符的实际名称和实际值,对整个token 序基于路径序列相似度判别的程序克隆检测方法吕博然,吴军华LV Boran,WU Junhua南京工业大学计算机科学与技术学院,南京211800School of Computer Science and Technology,Nanjing University of Technology,Nanjing 211800,ChinaLV Boran,WU Junhua.Clone detection method based on path sequence similarity puter Engi-neering and Applications,2018,54(2):55-61.Abstract :Code clone is a common phenomenon in the software system.The program code is converted to path execution sequence constituted by program nodes,through static analysis,by attribute definitions of nodes in this paper,and the cal-culation for the similarity is solved by discrete sequence similarity detection distance,line model and sequence correlation coefficient,and similarity between different programs.The experiments and data analysis verify the feasibility of this approach.Key words :clone detection;control flow graph;program node;execution sequence;path similarity摘要:代码克隆是软件系统中常见现象。

基于字符串的代码克隆检测方法的分析

基于字符串的代码克隆检测方法的分析

基于字符串的代码克隆检测方法的分析
安帝玟;唐艳宾
【期刊名称】《电脑知识与技术》
【年(卷),期】2009(005)031
【摘要】克隆代码是指在软件源程序中存在的相同或相似的代码片段.克隆代码在很多软件工程中,例如程序理解,代码质量分析,剽窃检测,漏洞查找和病毒检测,都需要通过找出语义或语法上相似的代码片段来实现.目前常用的检测方法有四种:基于文本(text-based)的检测,基于字符序列(token-based)的检测,基于语法树(tree-based)的检测和基于关系图(PDG-based)的检测.基于字符序列的克隆检测首先对源程序进行预处理转换,再经过匹配算法得到克隆检测结果.克隆代码的检测是软件分析的一个重要的部分.
【总页数】2页(P8756-8757)
【作者】安帝玟;唐艳宾
【作者单位】汉阳大学,计算机工学院,编程语言实验室,韩国,423791;汉阳大学,计算机工学院,编程语言实验室,韩国,423791
【正文语种】中文
【中图分类】TP311
【相关文献】
1.一种基于特征矩阵的软件脆弱性代码克隆检测方法∗ [J], 甘水滔;秦晓军;陈左宁;王林章
2.基于字符串的代码克隆检测方法的分析 [J], 安帝玟;唐艳宾
3.基于Ad-Sim算法的代码克隆检测方法 [J], 王卫红;谷永亮;毛怡伟;张政豪
4.基于Word2vec的克隆代码检测方法研究 [J], 贾清;杨抒
5.基于分层特征的代码克隆检测方法 [J], 张冬梅;陈永乐;杨玉丽
因版权原因,仅展示原文概要,查看原文内容请购买。

基于深度学习的代码克隆检测技术研究

基于深度学习的代码克隆检测技术研究作者:刘复星魏金津任女尔来源:《电脑知识与技术》2018年第18期摘要:在实际软件项目中,复制粘贴式的代码复用或者解决相似问题的模式化思维会造成软件源代码重复出现相同或相似的代码片段。

代码克隆检测分析作为衡量代码复用的一种有效方式,在软件开发、维护以及质量保证中发挥着重要作用。

提出以深度学习为基础的代码克隆检测技术能够很好地补充常用检测办法无法检测到的场景,如相同含义不同写法的代码段;基于sonar做插件式研发,具有重要的工程意义与实践指导作用。

关键词:代码克隆;深度学习;代码质量管控中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2018)18-0178-021 引言代码克隆是指在程序设计中表示一段源代码在一个程序,或者一个团体所维护的不同程序中重复出现,是不希望出现的现象【5】。

在实际项目中,复制粘贴式的代码复用或者解决相似问题的模式化思维会造成软件源代码重复出现相同或相似的代码片段。

为避免巧合,只有超过一定数量的代码相似才能判定为代码克隆。

不好的代码复用方式会对整个软件系统的开发和维护带来很多不利因素,因此对于代码复用的分析显得越来越重要。

代码克隆分析作为衡量代码复用的一种有效方式,在软件开发、维护以及质量保证中发挥着重要作用。

软件行业内常将Sonar作为技术债务管控的主流工具,Sonar插件式模式,方便自身被其他平台所引入,且有利于扩展第三方插件。

通过不同的插件对检测结果进行再加工处理,量化代码质量,方便对不同规模和种类的项目进行代码质量管理[1]。

自动检测代码重复的过程叫作克隆检测,实现基于Sonar的代码克隆自动检测技术,从根源上解决软件代码质量问题带来的风险并提供解决方案,指导软件项目研发质量改进。

基于深度学习算法研发代码克隆检测技术,并以插件形式集成进Sonar,用来检测项目代码中高相似部分从而对代码进行重构,减少代码量和重复功能点,达到节约成本的目的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档