代码克隆的类别总结

翻译 2016年08月31日 19:24:54

写在前面的话

这篇文章是翻译了 A Survey on Software Clone Detection Research这篇文章的第7小节,作者是:Chanchal Kumar Roy and James R. Cordy
在语言上我做了一些修改,让它比较符合我说话的习惯。


所有不懂的事情自己一点点弄明白。加油,doggy~

对于两个代码片段来说,基本来说有两种相似性。对于两个相似的代码段,要么是它们的程序文本相似(代码的某些片段相似)要么是它们的功能是相似的但是程序的文本没有任何相似的地方。

对于第一类代码克隆(code clone)来说主要的原因就是复制了某个代码片段然后把它粘贴到了其他你需要的地方。

对于代码克隆我们主要把它们分为文本相似功能相似


文本相似:

我们基于文本相似把代码可能分为了下面的三类:

【类型一】: 代码片段是完全相同的,除了空格,代码的布局格式或者是注释不同

【类型二】:代码的结构或者是代码的语法构成都是相同的,除了用户定义的变量,常量值,类型,布局或者是注释有不同

【类型三】:复制粘贴的代码片段被做了一些改动。除了在类型二上的变动之外,程序本身可能增加,删除修改了部分语句


功能相似性

【类型四】:如果两个代码片段的功能是相似的或者是完全相同的, 例如:他们有相同的前后条件,我们把这种叫做语义克隆


**
这些克隆的的类型从类型1到类型4他们的变化是逐级递增的,同样的他们的分析难度以及检测难度也是逐级递增的。类型1最低,类型4最难。检测类型4的代码克隆需要大量的程序构建背景知识和软件设计的背景知识。

下面我们给每个程序克隆举几个例子。

类型一

类型一其实就是复制的代码片段和原来的代码片段是一样的。但是他们在空格或者是在行,tabs这些地方有些许的不同,注释和布局的地方也有不同。类型一就是我们广泛知道的精确克隆。

考虑下面的代码段:

 if ( a >= b){
       c = b + d; //coomment 1
       d = d + 1;
 }
 else
       c = d-a;  //comment 2

一个精确的代码复制能够如下所示:

if ( a>= b){
    //comment
    c=d+b;
    d=d+1;
}
else //comment2
    c=d-a

我们可以发现上面的这两段代码片段都是文本相似的是(甚至是在移出了空格和注释以后,行和行之间都是相似的)当然就算移出了空格和注释,在结构上是不同的,但是我们也认为这是类型一,如下面这段代码所示:

if(a>=b)
{   //comment 1
    c=d+b;
    d=d+1;
}
else //comemnt2
c=d-a

但是现有的一行一行检测对比技术对于第一个代码段和第三个代码段可能就会失效。

类型二

类型二的克隆代码段和原始的代码段大部分是相同的,除了用户自定义的标识符(变量名,常量名,类名,方法名),布局和注释不同。 系统自定义的关键字(保留字)和句子的结构是完全和源代码一直的。

下面来看下面的代码片段:

if(a>=b){
    c = d + b; //comment
    d = d + 1;
}
else
    c = d - a; //comment

类型二的代码克隆片段:

if (m>=n)
{ //comment1'
    y = x + n;
    x = x + 5; //comment3
}
else
    y = x - m; //comment2

对于上面的两个代码片段我们可以看出来,在布局,变量名和赋值语句上都有很大的区别。但是它们在语法的结构上是相似的。


类型三

类型三在语句上做了更多的修改。比如说:增加,删除,修改。

考虑下面的代码片段:

if (a>=b){
    c = d + b; //comment1
    d = d + 1;}
else
    c = d - a; //comment2

如果我们在我们的这段代码中添加一个语句 e=1 之后我们可以得到

if (a>=b){
    c = d + b; //comment1
    e = 1; // This statement is added
    d = d + 1;}
else
    c = d - a; //comment2

像这样插入一条新的语句就是我们说的类型三。

我们在看一个例子:
下面的这个代码片段不同的地方我们将在表格中展现出来。

这里写图片描述

两个代码段不同的地方
这里写图片描述

类型四

类型四指的是语义上相似的代码片段。对于这种类型的复制,克隆的代码片段并不需要复制原始的代码。两个代码甚至有完全不同的执行逻辑。

看下面的两个代码段。
他们都是实现阶乘,一个用了循环,一个用了递归,最后的执行结果是完全相同。

这里写图片描述

这里写图片描述



写在后面的话

如果我说不吻你不罢休,谁能逼我将就

我没有不快乐,只是还有一点淡淡的心痛,有时候明知道一段感情像无底洞,有始无终,还是愿意挂念还是不愿放手。

我今天很想你,很想很想,我也不知道是在想你还是想我为你规划的未来的所有美好

你必需非常努力才可以看起来毫不费力,狗狗加油~

                                        my dear Mr. lovable
举报

相关文章推荐

Java对象克隆——浅克隆和深克隆的区别

在Java中对象的克隆有深克隆和浅克隆之分。有这种区分的原因是Java中分为基本数据类型和引用数据类型,对于不同的数据类型在内存中的存储的区域是不同的。基本数据类型存储在栈中,引用数据类型存储在堆中。...

重复代码(克隆代码)的几个概念与类型

本文内容来源于以下两篇参考文献:       Chanchal K. Roy, James R. Cordy, Rainer Koschke. Comparison and Evaluation of...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

克隆Object类

问:clone()函数是用来做什么的? 答:clone()可以产生一个相同的类并且返回给调用者。 问:clone()是如何工作的? 答:Object将clone()作为一个本地方法来...

KVM虚拟机克隆方法总结(链接克隆)

KVM像其他的虚拟机产品有相同的克隆方式,一种是连接方式的克隆,另一种是完全克隆的方式。但是,一般情况下我们使用连接克隆,使用这种克隆方式的时候会节省硬盘的空间,而且还能够快速的进行虚拟机的克隆,而采...
  • wswit
  • wswit
  • 2016-09-20 23:54
  • 2702

使用代码克隆检测功能查找重复代码

代码克隆是非常相似的独立代码片段。 在已开发一段时间的应用程序中,常会出现这种现象。 克隆提高了更改应用程序的难度,因为你必须找到并更新多个片段。 Visual Studio Ultimate ...

浅克隆与深克隆

1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用...

浅克隆、深克隆

// ———-1、直接复制对象 ———– package ninthTestModel;/* * 浅克隆 * 深克隆 * 序列化。 * 区别在于对象有引用对象的时候 一个是指向同...

对象的克隆

对象的克隆     对象的浅克隆:浅复制(浅克隆)被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然只指向原来的对象,换言之,浅复制仅仅复制锁考虑的对象,而不复制...

Java 克隆

纸上得来终觉浅 1.现在遇到了一个对象copy的问题,用Java的克隆可以解决,所以克隆解决的是对象拷贝一份;希望达到更改克隆的那一份的属性时,原来的对象不受影响; 2.克隆需要在类上继承一个接口,只...

浅克隆与深度克隆

一.概念 clone是Object类的方法,为了避免我们创建的每个类都具有clone能力,clone方法在基础类中得到了保留,设为protected。这样造成的后果就是:对于那些简单地使用一下这个类的...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)