论文部分内容阅读
代码克隆(clone code)是指软件代码库中存在的两个或两个以上完全相同或彼此之间结构不同但功能相同的源代码片段。在开发软件与维护系统的过程中,开发人员经常使用“复制-粘贴”或者使用开发框架的开发方式,使得软件系统中频繁出现代码克隆的情况。代码克隆不仅能够减小重新编写代码所产生的潜在风险,还可以缩短软件开发所需的时间,具有一定的积极影响。但是有研究表明,大量的代码克隆会对软件系统产生消极的影响,例如重复使用包含未知bugs的代码片段,可能会造成软件缺陷传播的现象,从而使系统的稳定性降低。此外,若没有对系统中存在的代码克隆进行良好的管理,代码库会不断扩大,从而造成代码库冗余,增加了维护成本。因此,检测、识别并呈现软件系统中所存在的代码克隆是代码克隆领域中的一个重要研究内容。研究者们为了消除代码克隆,降低其所带来的负面效应,主要从文本、Token、树、度量值以及图五种表征方式展开研究,然而长期以来代码克隆检测效果并未取得新的进展。为此,本研究从图像处理角度提出了一种新型的代码克隆检测方法(Clone Code Detection Based on Image Similarity,CCIS),帮助开发者识别并更好地理解代码克隆所包含的有价值信息。主要工作包括:(1)对需要进行代码克隆检测的源代码进行预处理,主要包括移除源代码中与克隆检测内容不相关的信息,如空白符、单行注释以及多行注释等,规范代码格式,以函数为粒度对源代码进行识别并提取,为了更准确的检测代码克隆,本研究所提取的函数包括循环嵌套深度,为代码克隆检测提供基础研究。(2)在已获取函数为粒度的代码片段基础上,根据关键字、数据类型、函数名称、标识符以及数字或字符串等内容在代码中所占权重的不同,为代码片段内容添加高亮,并将其转换为PNG(便携式网络图形)形式的图像。采用8位灰度图的方式表示转换后的代码图像,并将图像以大小为m*n的二维矩阵方式读入存储器,从而减轻后期相似度检测的计算量。(3)对上述的代码图像进行取负值和调整图像尺寸大小的操作,使得图像之间的像素与比例相同,从而满足后续图像相似度检测的条件。除了调整图像的尺寸,还需要使用图像模糊滤波器对代码图像的内容进行规范化操作。(4)基于已规范化处理的代码图像,使用Jaccard距离与感知哈希算法进行相似度检测,将检测结果存储到XML文件中,并将得到代码克隆信息可视化。为了验证实验的有效性,使用6款开源软件构建评价数据集进行测试,实验结果显示,基于图像相似度检测代码克隆与可视化方法能够检测出100%的类型一代码克隆,88%的类型二代码克隆与60%的类型三代码克隆,证明了本研究方法对代码克隆检测可行有效。