APP下载

基于图像相似度检测代码克隆

2019-09-04王亚芳刘东升侯敏

计算机应用 2019年7期

王亚芳 刘东升 侯敏

摘 要:目前在代码克隆检测领域,学者们主要从文本、词汇、语法和语义四种角度展开研究,然而长期以来代码克隆检测效果并未取得新的突破。针对这一问题,从图像处理角度提出了一种基于图像相似度的新型代码克隆检测(CCIS)方法。首先对源代码进行移除注释、空白符等操作,以获取“干净”的函数片段,并将函数中的标识符、关键字等进行高亮处理;然后将处理好的源代码转换为图像,并对图像进行规范化处理;最后使用Jaccard距离和感知哈希算法进行检测,得到代码克隆信息。为了验证实验的有效性,使用6款开源软件构建评价数据集进行测试。实验结果表明,CCIS方法能够检测出100%的类型一代码克隆、88%的类型二代码克隆与60%的类型三代码克隆,因此CCIS方法可以很好地进行代码克隆检测。

关键词:代码克隆;克隆检测;Jaccard距离;感知哈希算法;语法高亮

Abstract: At present, scholars mainly focus on four perspectives of text, vocabulary, grammar and semantics in the field of clone code detection. However, few breakthroughs have been made in the effect of clone code detection for a long time. In view of this problem, a new method called Clone Code detection based on Image Similarity (CCIS) was proposed. Firstly, the source code was preprocessed by removing comments, white space, etc., from which a “clean” function fragment was able to be obtained, and the identifiers, keywords, etc. in the function were highlighted. Then the processed source code was converted into images and these images were normalized. Finally, Jaccard distance and perceptual Hash algorithm were used for detection, obtaining the clone code information from these images. In order to verify the validity of this method, six open source softwares were used to constitute the evaluation dataset for testing. The experimental results show that CCIS method can detect 100% type-1 clone code, 88% type-2 clone code and 60% type-3 clone code, which proves the good effect of CCIS method on clone code detection.

Key words: clone code; clone detection; Jaccard distance; perceptual Hash algorithm; syntax highlighting

0 引言

在软件开发与维护过程中,开发人员经常使用“复制—粘贴”或者使用开发框架的开发方式,使得软件系统中出现大量的代码克隆。代码克隆是软件工程领域的重要研究内容,具体体现在软件维护、软件演化、软件質量、软件复用及软件授权、反剽窃等众多领域。经实证研究发现[1-3],代码克隆广泛存在于各项开源与闭源代码中,并且占据了相当比例,因此有必要检测代码克隆并对其进行良好的维护与管理。针对这一问题,学术界已经提出许多种代码克隆检测技术,然而所有的方法都需要将源代码按照各自制定的规则转换为Token、抽象语法树或者程序依赖图等,中间过程复杂,并没有对源代码规范化的统一标准,为此本文提出了一种基于图像相似度代码克隆检测(Code Clone detection based on Image Similarity, CCIS)方法。在开发过程中,程序员在集成开发环境(Integrated Development Environment, IDE)中查看源代码时,首先看到的就是代码的可视图像,开发人员手动查找克隆时是通过粗略扫描代码的形状与布局确定视觉上的相似代码片段,进而对这些视觉上的相似文本进行更细粒度的检查,并确定是否为真正的克隆代码。本文正是遵循这种使用源代码图像之间在视觉上相似性的直觉来寻找代码克隆,通过将源代码片段表示为图像,检测图像之间的相似度确定代码克隆。本文检测方法与传统检测方法相比,提出了一种基于图像相似度的代码克隆检测方法,为代码克隆分析研究在源代码的表征方式上提供了全新的视角。

1 相关工作

从20多年前学者们就开始研究代码克隆[4],在该领域中,目前被研究者广泛认可的代码克隆分类标准是由Bellon等[5]依据代码克隆程度不同提出的四分类标准:类型一是指除去空格与注释完全相同的代码对;类型二是指除去类型名、标识符以及常量外都相同的代码对;类型三是指部分语句增删改或标识符、类型有所替换但句法结构基本相同的代码对;类型四是指语义相似但是句法结构不同的代码对。

至今学术界已有一些优秀的代码克隆检测方法[6-13],主要是以基于文本、词汇、语法以及语义四种表征方式进行检测。

基于文本的代码克隆检测方法主要有NICAD(Accurate Detection of Near-miss Intentional Clones)[6]、SDD(Similar Data Detection)[7]、Duploc[14]、Dup[15]等。Roy等[6]提出的NICAD工具與Lee等[7]提出的SDD方法是本领域内现在被广泛认可的基于文本的检测方法。NICAD工具首先对源代码预处理,然后按照特定规则进行转换,最后利用动态匹配模式寻找最长相同子序列从而进行文本比较,最终能够检测类型一到类型三的代码克隆。SDD方法直接对源代码建立倒排索引,使用n近邻算法进行代码克隆检测,可以检测类型一到类型三的代码克隆。然而将源代码简单表征为文本,会丢失大量代码的特殊信息。

基于词汇的代码克隆检测技术主要有CCFinder(Code Clone Finder)[8]、CP-Miner[9]、Boreas[16]、CCLearner[17]等。Kamiya等[8]提出的CCFinder与Li等[9]提出的CP-Miner是两种知名的基于词汇的代码克隆检测技术。CCFinder将源代码按照一定规则转换为正则化序列以及参数化符号,然后使用后缀树匹配算法进行代码克隆检测,该工具能够检测类型一与类型二的代码克隆。CP-Miner采用频繁子项挖掘技术对大规模系统进行克隆检测,可以检测类型一与类型二的代码克隆。基于词汇表征代码,会忽略源代码的结构信息。

基于语法的代码克隆检测方法主要有DECKARD[10]、CloneDR[11]、CDLH(Clone Detection with Learning to Hash)[18]、Wahler等[19]的工作等。Jiang等[10]提出的DECKARD与Baxter等[11]提出的CloneDR是被目前广泛使用的基于语法的代码克隆检测方法。两者的原理都是将源代码解析为抽象语法树(Abstract Syntax Tree, AST),再分别利用树匹配技术与局部敏感哈希(Locality Sensitive Hashing, LSH)匹配算法进行相似度对比。DECKARD可以检测到类型一到类型三的代码克隆,CloneDR可以检测到类型一与类型二的克隆片段。基于树的检测方法由于需要遍历树,计算开销相对较大。

基于语义的代码克隆检测技术主要有Duplix[12]、ConQAT[13]、利用同构程序依赖图的切片检测克隆的方法[20]等。Krinke等[12]提出的Duplix和Hummel等提出的ConQAT[13]是两种知名的基于语义的检测方法。Duplix利用程序依赖图表示源代码,使用K-length patch算法对代码片段进行相似性对比,可以检测到类型一与类型四的代码克隆;ConQAT将源代码符号化,使用基于后缀树和索引的检测算法,可以检测到类型一与类型二的代码克隆。基于图的检测技术需要程序依赖图的生成器,且计算开销十分大。

本团队在克隆代码检测方面也作了许多研究,史庆庆等[21]提出了一种基于后缀数组的克隆检测方法,利用后缀数组查找相同Token子串,从而确定代码克隆,此方法只能检测出类型一和类型二的代码克隆。张久杰等[22]提出了一种基于Token编辑距离检测代码克隆的方法,通过对Token的定长子串映射,进而利用编辑距离查找克隆对,此方法中源代码转换规则复杂。

此外,目前基于图像的代码克隆检测方法只有Ragkhitwetsagul等[23]提出的Vincent,该方法利用EMD(Earth Movers Distance)和高斯模糊滤波器对代码图像之间进行相似度比较,从而检测出类型一到类型三的代码克隆,只适用于Java语言的系统,具有一定的局限性。

2 基于图像相似度的代码克隆检测方法

本文所提出的基于图像相似度代码克隆检测(CCIS)方法的流程如图1所示,主要由4个核心步骤组成:1)首先移除源代码中的注释及空白符等非函数代码,提取代码函数片段,并为代码添加高亮;2)然后将经过预处理的代码片段转换为图像;3)接着对图像进行裁剪、填充以及调整大小等操作;4)最终使用Jaccard距离(Jaccard Distance)与感知哈希算法对标准化的代码图像进行检测,得到代码克隆信息,并返回检测结果。

2.1 源代码预处理

源代码预处理是基于图像相似度检测代码克隆的基础性工作。本文以Python语言为研究对象,对源代码预处理的步骤主要包括移除源代码中的单行注释、多行注释及空白符等非函数代码,以函数粒度进行识别并标记代码片段,根据关键字、数据类型、函数名称、标识符以及数字或字符串在代码中所占权重不同,对代码进行高亮。

基于图像相似度检测代码克隆是根据源代码图像中像素分布匹配来计算相似度,若两个代码片段为克隆关系,则它们之间大部分代码像素对齐,反之亦然,因此,代码预处理会直接影响后续过程以及检测结果。

本文所提取的函数包括循环嵌套深度,而不是仅仅限制于考虑词法层面的信息[22]。函数提取算法主要步骤如下:

2.2 图像转换

经过预处理的源代码需要转换为图像,然后根据计算图像之间的相似度,进行代码克隆检测,确定代码克隆对。本文借助文本处理工具Highlight(http://www.andre-simon.de)将经过预处理提取的函数代码批量添加高亮并转换为超级文本标记语言(HyperText Markup Language, HTML)文件,使得所占权重高的代码在图像相似度检测中发挥作用,从而降低数字、字符串等不重要代码在结果中所占的比重。如图2所示,为工具Highlight的使用界面截图。

本文使用Python imgkit (https://pypi.org/project/imgkit/)将文件中每个函数的HTML文件都转换为便携式网络图形(Portable Network Graphics, PNG)。图像以大小为m×n的二维矩阵方式读入存储器,矩阵中每一项数值的取值范围为0到255,代表原始图像的8位灰度图,而灰度值是根据像素点色彩通道中的红色、绿色和蓝色(RGB)值求平均值所取。

2.3 图像规范化

经过图像化的函数代码片段无法直接进行相似度检测,这是由于直接转换后的图像之间像素以及比例不同,不满足Jaccard距离(Jaccard Distance)与感知哈希算法(perceptual Hash, pHash)的检测条件。为了解决这一问题,需要对源代码转换后的图像进行规范化处理。

本文将图像背景即非源代码像素设置为黑色,其灰度值为0,而源代码的像素是通过该像素点的RGB值求平均计算所得,这意味着可以根据矩阵中非零元素的数量来计算图片中所包含源代码的像素数量。

在进行图像相似度检测时,需要被检测的原始图像相互之间大小相同,且不能经过随意缩放,避免造成因图像中代码的字体大小不一样,而导致图像中像素点错位,从而丢失克隆对的情况。基于此,需要对所有图像进行规范化处理。对于长度不同的图像,使用黑色补全相对短的图像,从而与较长的图像长度相等。由于生成的圖像宽度是统一像素的,为了在pHash检测过程中减小因非代码像素所占比重过大而造成相似度过高的问题,需要极大限度地在宽度方面裁剪非代码像素,并还要保证图像之间宽度一致。图像规范化的算法主要步骤如下:

2.4 相似度检测

本文选取两种计算图像相似度的方法:Jaccard距离与感知哈希算法。

使用Jaccard距离检测代码克隆片段速度相对较快,可以处理大量的数据,但是效果并不理想,该方法只能检测到较简单的代码克隆,对于比较复杂的情况无法准确地识别,因此使用pHash算法进一步检测,pHash算法通过离散余弦变换最大限度上保留图片中低频部分,只要图像的整体结构保持不变,其对应的哈希值基本不变,能较好地识别相对复杂的克隆情况。

2.4.1 Jaccard距离

Jaccard距离[23-26]是用来衡量两个集合差异性的一种指标,它是Jaccard相似系数(Jaccard similarity coefficient)的补集,被定义为1减去Jaccard相似系数。为了计算Jaccard距离,本文将基于零范数的两个代码图像的差异给出如下定义。给定两个尺寸相等的图像,分别用大小为m×n的二维矩阵A和B表示。矩阵D是由矩阵A和B衍生的逐元差分矩阵,其中第i行第j列的元素记为dij。这两个图像之间的差异用矩阵D中的非零元素的个数表示,记作diff。如图3(a)与图3(b)所示,给定一对源代码图像bubble_sort1和bubble_sort2,它们的区别如图3(c)所示,diff值为图像中白色实线区域内的非零像素的个数:

本文将矩阵A和B相加得到的矩阵记为矩阵S,sij表示矩阵S中第i行第j列的元素。这两个图像中所包含源代码文本的区域用矩阵S中的非零元素的个数表示,记作sum。为了将距离限制于(0,1)区间,本文借助sum对距离进行标准化处理。如图3(d)所示,sum的值为图中黑色实线区域内的非零像素的个数:

由于背景在图像中所占比例较大,且背景之间始终相互匹配,为了防止该情况所造成的影响,即产生比实际情况远远要小的距离值,本文选取代码区域像素个数总和,而不是图像中所有像素的总数,然后根据diff值与sum值计算归一化距离,其相似性与距离的互补。矩阵A和B之间的归一化距离记为distance,用矩阵A与B表示的两张图像之间的相似度记作similarity:

2.4.2 感知哈希算法

本文使用感知哈希(perceptual hash,pHash)算法[27-28]进行代码图像的克隆检测,pHash算法使用离散余弦变换(Discrete Cosine Transform, DCT)将像素域的图像转换为频率域,得到其频率系数矩阵,选取矩阵左上角区域元素计算图像哈希值。通过比较两张图像哈希值的距离,进而判断图像是否相似。pHash算法主要步骤如下:

使用最大pHash距离对计算出的距离进行归一化,相似度与距离互补。矩阵A和B之间的pHash距离用pHash(A,B)表示,任意两个矩阵之间最大的pHash距离记作pHashmax,用矩阵A与B表示的两张图像之间的相似度用变量similarity表示:

3 实验及分析

3.1 数据描述

由于研究者们所提出的克隆检测方法在检测粒度、针对语言以及系统规模等方面并不统一,所以目前还没有用于评价代码克隆检测工具的国际标准测试数据集。Svajlenko等[29]提出了一个Java代码集——BigCloneBench,但是它受语言和只有10种功能的限制,并不能适用于全部检测工具。为了准确而客观地评价CCIS方法,本文借鉴Roy团队提出的变异插入[30]测试方法,该方法不依赖于任何工具与编程语言,可以比较公平且独立地评价检测结果,其核心思想是在给定的源代码片段中通过人为修改、增加或删除一些语句,产生类型一到类型三的代码克隆对。例如对源代码进行更改类型名称、修改常量值、增加空白符等操作,产生类型二的代码对。所有源代码片段经过变异插入后得到的代码片段为变异代码片段,在此过程中,所有变异相关信息的信息都会被记录,便于对所提出的方法检测结果进行召回率与精确度的计算。数据集的构建与变异相关信息的记录人员包括作者本人、校内代码克隆研究专家5名以及企业软件开发人员6名。

本文以函数粒度作为研究对象,选取来自6款开源项目中的219个源代码片段,具体变异插入过程包括三种情况:第一种情况就是对源代码片段进行增加、删除空白符或注释,以及修改注释的操作,使经过变异插入的代码片段与源代码片段形成类型一的代码克隆对;第二种情况是对源代码片段进行修改数据类型、标识符以及常量数值等操作,使源代码片段和变异插入的代码片段形成类型二的代码克隆对;第三种情况是对源代码片段中的少量语句删除、修改或者增加,并且修改后的代碼片段与源代码片段的功能要相同,形成类型三的代码克隆对。经过变异插入过程之后,得到275个变异片段,因此数据集当中共有494个代码克隆片段。为了使结果更加客观,又在此基础上加入了72个非代码克隆片段,即噪声片段,且任意两个噪声片段之间都互不为代码克隆。项目基本信息见表1所示。

3.2 评价指标

检测的结果是二分类问题,即该代码片段是克隆片段或者不是克隆片段,因此采用召回率与精确度两个度量指标对实验结果进行评价[22,30-31]。召回率(Recall)指所有被检测到的代码克隆数量占总体克隆数量的比例:

精确度(Precision)指克隆检测算法所检测到候选代码克隆中真实代码克隆的比例:

其中:TP(True Positive)代表CCIS方法检测出的克隆片段与真实代码克隆片段的交集;FP(False Positive)代表CCIS方法检测出是克隆片段但实际并不是真实克隆片段的代码克隆片段集合;FN(False Negative)代表CCIS方法未检测出的真实代码克隆片段集合。

3.3 实验结果及分析

代码克隆检测最终结果以可扩展标记语言(eXtensible Markup Language, XML)形式反馈,为后续对代码克隆数据进一步分析提供数据交换基础。图4为XML的部分结果展示。

实验将494个代码克隆片段与72个非代码克隆片段整合到一起作为一个待检测的项目,然后使用CCIS方法进行检测。根据检测结果显示,该数据集中共有414个代码克隆片段。为了验证检测出的代码克隆片段在不同项目中分布是否均衡,表2显示出了源项目中的494个真实代码克隆片段与414个所检测到的代码克隆片段在6个项目中的分布情况。

表2中出现的错检与漏检情况,针对这一问题进行了分析,漏检的主要原因是由于这些片段与其对应的代码克隆片段在替换的标识符等长度发生较大变化从而导致大量像素点整体偏移发生错位,且包含一些语句的增加删除,从而导致代码片段的整体结构轮廓发生改变,在对代码图像进行相似度检测时,只有少数像素点可以匹配。发生错检的主要原因是两个代码片段虽然不是克隆对,但是其代码结构轮廓相似,从而使得大部分像素点相互可以匹配,造成两幅图像之间计算距离比实际距离小,然而这种情况相对比较少见,在后续的实验中会改进算法去改善该问题。

根据变异插入过程的记录信息,对检测结果进行分析,发现检测出的414个代码克隆片段中包含412个真实的代码克隆片段,即这些代码克隆片段来自包括源代码片段与变异插入代码片段在内的494个代码克隆片段,还有一个检测出的克隆代码片段来自于噪声代码片段。利用式(8)、(9)对CCIS方法得到的克隆检测结果进行召回率与精确度的计算,本次实验的召回率为430/494=87.04%,精确度为412/414=96.38%。由于数据集中设置的噪声片段所占总体克隆代码片段的比例较小,而且噪声片段与变异插入的代码片段相似度较低,使得本次实验的精确度相对较高。在后续的工作中,将会不断扩大数据集中的代码克隆片段数量与噪声代码片段。

为了分析CCIS方法对于类型一、类型二与类型三的代码克隆检测效果,本文根据数据集中的变异插入记录信息对实验最终检测结果中三种类型的代码克隆数量进行统计,并分别计算出了使用Jaccard与pHash两种方法所检测到每种类型代码克隆的召回率与精确度,具体信息如表3所示。

根据表3的结果发现,使用Jaccard方法能准确地检测出所有类型一的代码克隆与60%类型二的克隆,而仅能检测到10%类型三的代码克隆。使用pHash算法可以检测检测出100%的类型一克隆、88%类型二的代码克隆以及60%类型三的克隆。可以得出使用pHash算法检测代码克隆比使用Jaccard方法检测具有更准确且更全面的效果,即可以使用pHash算法对Jaccard方法检测不到的克隆进一步检测。

3.4 对比实验及分析

为了验证CCIS方法的有效性,本实验与NICAD工具在同款检测软件和相同实验环境的条件下进行了对比。选取NICAD是因为它在当前的代码克隆检测方法的评价与对比性研究[4,32]中有较优秀的表现,目前可以对Python语言进行代码克隆检测的方法较少,而NICAD可以检测Python语言中的代码克隆,并且被代码克隆领域广泛认可。NICAD可以检测类型一、类型二与部分类型三的代码克隆。

使用上文中构建好的实验评价数据集以及变异插入相关信息,分别利用CCIS方法与NICAD进行代码克隆检测,得到不同的召回率与精确度如表4所示。

通过对比实验结果发现,两种代码克隆检测方法对6款软件都有很好的检测效果。在6款测试的软件中,使用NICAD与使用CCIS方法检测代码克隆的精确度都很高,几乎都可以达到100%。根据召回率与精确度各自的平均值来讲,CCIS方法在检测代码克隆时比NICAD所检测的代码克隆结果的召回率约高出5个百分点。经过人为查验检测出的克隆信息发现,CCIS方法的精确度与NICAD的精确度不相上下,虽然CCIS方法漏检了一些真正的代码克隆片段,但是CCIS方法可以检测到NICAD检测不到的代码克隆片段。结果的查验与分析人员包括作者本人、校内代码克隆研究专家5名以及企业软件开发人员6名。

3.5 實验有效性说明

本文中代码预处理主要通过Python语言编程实现,代码转换为图像使用文本处理工具Highlight 3.4.8和调用Python imgkit 1.0.1包实现,图像处理与基于图像相似度的代码克隆检测方法使用Python编程与Python Imaging Library (PIL) (http://pythonware.com/products/pil/)图像处理工具、numpy 1.15.2 (http://www.numpy.org/)科学计算与分析工具,其余工作借助Python实现。研究中所使用的数据集已上传到百度网盘,链接https://pan.baidu.com/s/1zwll924jGtYo1ILVH8oOIQ(提取码:wihx)。

4 结语

本文提出了一种基于图像相似度的代码克隆检测方法,根据图像语义的相似性进行代码克隆检测,是一种新的源代码表征方式,为代码克隆分析提供了一种全新的视角。利用图像表征源代码片段进行克隆检测,为后续进行深度学习方面的研究奠定了基础。

本文的研究工作仍有不足之处,例如由于选取的代码行数受到限制会导致漏检一些代码克隆,检测的算法还可以进一步优化,只能针对Python语言的项目进行检测等。在今后的工作中,本文将会继续研究并解决这些问题,并且拟通过结合深度学习技术对代码克隆检测进行更深入的研究,从而取得更好的结果。

参考文献 (References)

[1] VERENA K, WAGNER S, KOSCHKE R. Are there functionally similar code clones in practice?[C]// Proceedings of the 12th International Workshop on Software Clones. Washington, DC: IEEE Computer Society, 2018: 2-8.

[2] ROY C K. Large scale clone detection, analysis, and benchmarking: An evolutionary perspective (Keynote)[C]// Proceedings of the 12th International Workshop on Software Clones. Washington, DC: IEEE Computer Society, 2018: 1.

[3] ABDULLAH S, JUGAL K. A survey of software clone detection techniques [J]. International Journal of Computer Applications, 2016, 137(10): 1-21.

[4] ROY C K, CORDY J R, KOSCHKE R. Comparison and evaluation of code clone detection techniques and tools: a qualitative approach [J]. Science of Computer Programming, 2009, 74(7): 470-495.

[5] BELLON S, KOSCHKE R, ANTONIOL G, et al. Comparison and evaluation of clone detection tools [J]. IEEE Transactions on Software Engineering, 2007, 33(9): 577-591.

[6] ROY C K, CORDY J R. NICAD: accurate detection of near-miss intentional clones using flexible pretty-printing and code normalization [C]// Proceedings of the 16th IEEE International Conference on Program Comprehension. Piscataway, NJ: IEEE, 2008: 172-181.

[7] LEE S. SDD: high performance code clone detection system for large scale source code [C]// Proceedings of the 20th ACM SIGPLAN Conference on Object-Oriented Programming. New York: ACM, 2005: 140-141.

[8] KAMIYA T, KUSUMOTO S, INOUE K. CCFinder: a multilinguistic token-based code clone detection system for large scale source code[J]. IEEE Transactions on Software Engineering, 2002, 28(7): 654-670.

[9] LI Z, LU S, MYAGMAR S, et al. CP-Miner: finding copy-paste and related bugs in large-scale software code[J]. IEEE Transactions on Software Engineering, 2006, 32(3): 176-192.

[10] JIANG L, MISHERGHI G, SU Z, et al. DECKARD: scalable and accurate tree-based detection of code clones [C]// Proceedings of the 29th International Conference on Software Engineering. Washington, DC: IEEE Computer Society, 2007: 96-105.

[11] BAXTER I D, YAHIN A, MOURA L, et al. Clone detection using abstract syntax trees [C]// Proceedings of the 1998 IEEE International Conference on Software Maintenance. Piscataway, NJ: IEEE, 1998: 368.

[12] KRINKE J. Identifying similar code with program dependence graphs[C]// Proceedings of the 8th Working Conference on Reverse Engineering. Piscataway, NJ: IEEE, 2001: 301-309.

[13] HUMMEL B, JUERGENS E, HEINEMANN L, et al. Index-based code clone detection: incremental, distributed, scalable [C]// Proceedings of the 2010 IEEE International Conference on Software Maintenance. Washington, DC: IEEE Computer Society, 2010: 1-9.

[14] DUCASSE S, RIEGER M, DEMEYER S. A language independent approach for detecting duplicated code[C]// Proceedings of the 1999 International Conference on Software Maintenance. Piscataway, NJ: IEEE, 1999: 109-118.

[15] BAKER B S. On finding duplication and near-duplication in large software systems[C]// Proceedings of the 2nd Working Conference on Reverse Engineering. Piscataway, NJ: IEEE, 1995: 86-95.

[16] YUAN Y, GUO Y. Boreas: an accurate and scalable token-based approach to code clone detection[C]// Proceedings of the 27th IEEE/ACM International Conference on Automated Software Engineering. Piscataway, NJ: IEEE, 2012: 286-289.

[17] LI L, FENG H, ZHUANG W, et al. CCLearner: a deep learning-based clone detection approach[C]// Proceedings of the 2017 IEEE International Conference on Software Maintenance and Evolution. Washington, DC: IEEE Computer Society, 2017: 249-260.

[18] WEI H H, LI M. Supervised deep features for software functional clone detection by exploiting lexical and syntactical information in source code[C]// Proceedings of the 26th International Joint Conferences on Artificial Intelligence Organization. Piscataway, NJ: IEEE, 2017: 303-309.

[19] WAHLER V, SEIPEL D, WOLFF J, et al. Clone detection in source code by frequent itemset techniques[C]// Proceedings of the 4th IEEE International Workshop on Source Code Analysis and Manipulation. Piscataway, NJ: IEEE, 2004: 128-135.

[20] KOMONDOOR R, HORWITZ S. Using slicing to identify duplication in source code[C]// Proceedings of the 8th International Symposium on Static Analysis. Berlin: Springer, 2001: 40-56.

[21] 史庆庆,张丽萍,尹丽丽,等.基于后缀数组的克隆检测[J].计算机工程,2013,39(9):123-127.(SHI Q Q, ZHANG L P, YIN L L, et al. Clone detection based on suffix array[J]. Computer Engineering, 2013, 39(9): 123-127.)

[22] 张久杰,王春晖,张丽萍,等.基于Token编辑距离检测克隆代码[J].计算机应用,2015,35(12):3536-3543.(ZHANG J J, WANG C H, ZHANG L P, et al. Clone code detection based on Levenshtein distance of token[J]. Journal of Computer Applications, 2015, 35(12): 3536-3543.)

[23] RAGKHITWETSAGUL C, KRINKE J, MARNETTE B. A picture is worth a thousand words: Code clone detection based on image similarity[C]// Proceedings of the 12th International Workshop on Software Clones. Washington, DC: IEEE Computer Society, 2018: 44-50.

[24] MCCORMICK W P, LYONS N I, HUTCHESON K. Distributional properties of Jaccards index of similarity[J]. Communications in Statistics, 1992, 21(1): 51-68.

[25] 俞婷婷,徐彭娜,江育娥,等.基于改进的Jaccard系数文档相似度计算方法[J].计算机系统应用,2017,26(12):137-142.(YU T T, XU P N, JIANG Y E, et al. Text similarity method based on the improved Jaccard coefficient[J]. Computer Systems and Applications, 2017, 26(12): 137-142.)

[26] 田星,郑瑾,张祖平.基于词向量的Jaccard相似度算法[J].计算机科学,2018,45(7):186-189.(TIAN X, ZHENG J, ZHANG Z P. Jaccard text similarity algorithm based on word embedding[J]. Computer Science, 2018, 45(7): 186-189.)

[27] 宋博,姜万里,孙涛,等.快速特征提取与感知哈希结合的图像配准算法[J].计算机工程与应用,2018,54(7):206-212.(SONG B, JIANG W L, SUN T, et al. Image registration algorithm based on fast feature extraction and perceptual hash[J]. Computer Engineering and Applications, 2018, 54(7): 206-212.)

[28] 李丹平,杨超,姜奇,等.一种支持所有权认证的客户端图像模糊去重方法[J].计算机学报,2018,41(6):1047-1063.(LI D P, YANG C, JINAG Q, et al. A client-based image fuzzy deduplication method supporting proof of ownership[J]. Chinese Journal of Computers, 2018, 41(6): 1047-1063.)

[29] SVAJLENKO J, ROY C K. BigCloneEval: a clone detection tool evaluation framework with BigCloneBench [C]// Proceedings of the 2016 IEEE International Conference on Software Maintenance and Evolution. Piscataway, NJ: IEEE, 2016: 131-140.

[30] ROY C K, CORDY J R. A mutation/injection-based automatic framework for evaluating code clone detection tools[C]// Proceedings of the 2009 IEEE International Conference on Software Testing Verification and Validation Workshop. New York: ACM, 2009: 157-166.

[31] 蘇小红,张凡龙.面向管理的克隆代码研究综述[J].计算机学报,2018,41(3):628-651.(SU X H, ZHANG F L. A survey for management-oriented code clone research[J]. Chinese Journal of Computers, 2018, 41(3): 628-651.)

[32] SVAJLENKO J, ROY C K. Evaluating modern clone detection tools[C]// Proceedings of the 2014 IEEE International Conference on Software Maintenance and Evolution. Piscataway, NJ: IEEE, 2014: 321-330.