背景与动机
深度学习(DL)是近年来非常活跃的研究领域。代码克隆作为一种常见的代码实践,在提高开发效率的同时,也可能会对软件维护产生负面影响。在开发DL软件时,开发人员往往依赖框架来实现 DL 功能。同时,为了提高效率,开发人员经常重用构建深度学习模型的步骤和配置设置。这些可能会导致代码复制粘贴或重用,从而产生代码克隆。然而,目前较少有研究探索代码克隆对 DL 软件的影响。本文对数十个开源的深度学习(DL)和传统软件项目进行了实证研究,结果表明:(1)DL项目中普遍存在代码克隆,约16.3%的代码片段是克隆片段,几乎是传统项目的2倍;(2)75.6%的DL项目包含共变克隆,这意味着变化会在克隆片段之间传播,带来维护困难;(3)克隆行数占比和克隆行数与共变的出现有关;(4)不同框架的DL项目中代码克隆的流行程度各不相同,但差异不显著;(5) 类型 1 共变克隆通常分布在不同的文件夹中,但类型 2 和 3 共变克隆主要发生在相同的文件或文件夹中;(6)57.1%的共变克隆涉及到bug。本研究揭示了代码克隆在深度学习软件中的普遍性及其潜在影响,为优化DL软件开发和维护提供了重要启示。
论文链接:https://dl.acm.org/doi/10.1145/3607181
论文《Exploring the Impact of Code Clones on Deep Learning Software》发表在《ACM Transactions on Software Engineering and Methodology》(TOSEM)上。TOSEM是软件工程领域两大CCF A类国际期刊之一,是国际上公认的最权威的、最有影响力的软件工程领域的顶级期刊之一。在长达31年的历史中(1992-2022),TOSEM共收录论文800余篇,平均每年仅接收论文26篇左右,论文接收率极低,显示出其极高的门槛和严格的审稿标准。
方法
本文使用NiCad进行代码克隆检测,图1展示了其参数配置。NiCad已被广泛用于检测代码克隆,具有显著的准确性。本文遵循先前的研究的设置来最大限度地提高检测的准确率和召回率。
表1 NiCad配置
本文实现了CCDetector工具来检测共变克隆,图1展示了该工具的整体流程,具体步骤如下:
图1 共变克隆检测步骤
1. 检测基版本和比较版本中的代码克隆。对于每个项目,首先下载它的git仓库,然后切换到它的最新版本作为“基版本”,以及五个相邻的版本(非Candidate (RC)或Beta版本)作为“比较”版本。针对这六个版本的源代码,使用NiCad来检测代码克隆。
2. 提取基版本和比较版本之间的共变克隆。根据基版本和比较版本的克隆结果,CCDetector工具将对每个比较版本和基版本执行共变克隆检测(共五次检测)。在此过程中,克隆检测以“函数”的粒度执行,因此每个检测到的克隆对由两个函数组成。CCDetector检测共变克隆的总体思想如下:对于基版本中的克隆对C1,首先提取它的两个函数。然后,遍历从比较版本中检测到的每个克隆对(Ci),如果Ci的两个函数的路径和名称与C1的路径和名称匹配,则认为C1和Ci是相同的克隆对(即同一对克隆对)。接下来,检查C1和Ci中相同的代码片段是否已从比较版本修改为基版本。是的话则把C1识别为共变克隆。重复上述步骤,直到检查完比较版本中的所有克隆对,从而可以识别出基版本中所有共变克隆对。最后,使用基版本中的克隆作为基础,从检测到的共变克隆中删除重复的克隆,以消除前面使用五个比较版本进行检测可能导致的结果重复。
3. 根据代码克隆的类型对代码克隆进行分类。在检测到共变克隆之后,还需进一步确定每个克隆的具体类型。如表1所示,NiCad将使用“配置三”检测所有三种类型的克隆(Result3),使用“配置二”检测类型1和2克隆(Result2)和使用“配置一”检测类型1克隆(Result1)。CCDetector根据克隆对中函数的路径和名称,挖掘所有检测结果,以区分每种类型的共变克隆:(1)将Result1与共变克隆直接匹配,得到类型1共变克隆;(2)从Result2中去除Result1,然后将剩余的结果与共变克隆进行匹配,得到类型2共变克隆;(3)从Result3中去除Result1和Result2,然后将剩余的结果与共变克隆进行匹配,得到类型3共变克隆。
评价和结果
本文进行了一项实证研究,从代码克隆普遍性和共变情况两个方面探讨了代码克隆对深度学习软件的影响。通过对45个深度学习软件的深入分析,得到以下发现:首先,代码克隆普遍存在于深度学习软件项目中。与传统项目相比,深度学习软件更容易出现代码克隆;其次,深度学习软件中的代码克隆存在大量共变,意味着这些代码克隆导致了维护困难;第三,克隆行数所占比例和克隆行数是与共变出现相关的两个重要因素;第四,大多数所研究的深度学习项目使用了PyTorch、TensorFlow或两者来实现深度学习功能。其中仅使用PyTorch的项目中可能更容易出现代码克隆,而且这些代码克隆也更容易发生共变。但在统计学上这种差异并不显著;第五,类型1共变克隆往往分布在不同的文件夹中,而类型2和类型3的共变克隆更有可能出现在同一文件或同一文件夹中。最后,在分析的3,113对共变克隆中,57.1%具有Bug倾向性。由于篇幅限制,更多数据细节可见原文。
技术贡献
本研究的贡献包括:(1)本文创新性地聚焦于DL项目中共变克隆的研究,并且实现了一个用于识别共变克隆的工具。(2)本文明确了引起代码克隆出现共变的相关因素,为开发者提供了控制共变克隆的重要参考。(3)本文比较了使用不同框架的DL项目中代码克隆的差异,为理解不同框架下代码克隆提供了基础认识。(3)本文详细报告了共变克隆片段的空间位置分布情况,并分析了共变克隆的Bug倾向性,这一结果揭示了共变克隆可能导致的维护风险,为开发者提供了有价值的启示。(4)本文整理了一个包含45个DL项目和45个传统Python项目的数据集,通过所检测的代码克隆和共变克隆,为未来的代码克隆研究提供了一个基准数据集。
详细内容参见
Ran Mo, Yao Zhang, Yushuo Wang, Siyuan Zhang, Pu Xiong, Zengyang Li, and Yang Zhao. 2023. Exploring the Impact of Code Clones on Deep Learning Software. ACM Trans. Softw. Eng. Methodol. 32, 6, Article 153 (November 2023), 34 pages. https://doi.org/10.1145/3607181
Source Code: https://codeclonedl.github.io/datasets.com/
作者介绍
莫然,华中师范大学计算机学院副教授
入选湖北省“楚天学子”计划,华中师范大学“桂子青年学者”,获武汉计算机软件工程学会“青年才俊奖”。CCF软件工程专委会专委、CCF开源发展委员会执委。近年来主持国家、省部级等各类项目多项,在软件工程著名的会议和期刊上发表论文40余篇,其中CCF A类论文10余篇,包括ICSE、ASE、TSE、TOSEM等。获得国际发明专利授权两项。担任国内外软件工程知名期刊审稿人(TSE、TOSEM、JSS、FSC、软件学报等)和会议程序委员会委员(ICSE、SANER、ICSME等)。