摘要:运用深度学习来检测语义代码克隆受到了研讨界的广泛重视。

本文共享自华为云社区《语义级代码克隆检测数据集的评估与改进》,作者:软件剖析Lab。

一、背景介绍

代码克隆检测[1]是软件工程领域一个很重要的研讨方向。代码克隆不用要地增加了软件体系的巨细。一个体系越大,需要维护的开支就越高。为了检测和办理代码克隆,研讨者把代码克隆分为四类[2]:

  • 类型一是除了注释、空格、换行之外,完全相同的代码片段;

  • 类型二是在类型一的根底上,除了类型名、变量名以及常量名之外,完全相同的代码片段;

  • 类型三是在类型二的根底上,有少数语句的增加、删除、修正;

  • 类型四是指完成的功用相同,但完成的办法完全不同。

在代码克隆成为一个软件工程的研讨方向以来,许多非深度学习的办法都专注在检测类型一、二、三的克隆,可是在检测语义代码克隆(中等类型三、弱类型三以及类型四)上取得的发展很有限。这是因为非深度学习的办法没有识别在词法以及语法等级完成很不相同,但归于语义代码克隆的代码对(例如冒泡排序和快速排序)。

根据一个带标记的数据集(如BigCloneBench[3]),研讨者提出许多根据深度学习的办法来检测语义代码克隆[4][5]。他们的试验成果展现了他们的办法可以有用的检测语义代码克隆。根据深度学习的办法可以有用的检测语义代码克隆是因为这些办法可以从练习会集学习到语义代码克隆的语义信息。

可是目前还没有有作业研讨BigCloneBench数据集是否真的可以用来验证语义代码克隆检测办法的有用性。在本篇文章中[6],咱们首要发现BigCloneBench数据集的语义代码克隆对运用类似的标识符,而非语义代码克隆对的标识符不类似。接着文章提出了一个不合理(undesirable-by-design)的克隆检测模型(名为Linear-Model),经过只考虑那些标识符在代码克隆片段中呈现来检测代码语义代码克隆。这个不合理的模型可以到达跟其他被验证有用的办法相同的作用。为了减轻这个问题,咱们经过笼统BigCloneBench数据会集的一部分标识符(类型名、变量名以及办法名)得到AbsBigCloneBench数据集。试验成果标明AbsBigCloneBench数据集可以更好的验证语义代码克隆检测办法的有用性,一同运用AbsBigCloneBench数据集练习的模型在BigCloneBench数据集测验仍然有用,而运用BigCloneBench数据集练习的模型在AbsBigCloneBench数据集测验却无效。

二、BigCloneBench数据集剖析

BigCloneBench数据集由Svajlenko等人[3]提出,它是从IJaDataset[7]中发掘而来,而且由三个专家手动承认。IJaDataset包含25000个项目,3.65亿行代码。BigCloneBench包含10类问题以及600万克隆对和26万非克隆对。BigCloneBench将类型三的代码克隆分为弱、中、强和十分强四类。表1展现了BigCloneBench数据会集每个类型的代码克隆对占比,超越98%的代码克隆对归于语义代码克隆。

表1:BigCloneBench数据会集每个克隆类型的占比

语义级代码克隆检测数据集的评估与改进

1. BigCloneBench不同问题之间标识符的Jaccard类似系数剖析

算法1展现了咱们计算BigCloneBench数据集的不同问题之间标识符的Jaccard类似系数剖析的流程图。咱们首要得到每一个问题呈现频率最高的20个标识符。然后咱们计算两两问题之间的标识符的Jaccard类似系数,因为BigCloneBench数据会集包含10个问题,因而咱们终究会得到45个类似系数。最终咱们对这45个类似系数取平均作为数据集的不同问题之间的Jaccard类似系数。BigCloneBench数据集不同问题之间的标识符的Jaccard类似系数为0.038,它标明BigCloneBench数据集不同问题之间的标识符很不相同。

语义级代码克隆检测数据集的评估与改进

表2具体展现了BigCloneBench数据会集每类问题的前20个标识符姓名。咱们用相同的办法剖析了OJClone数据集[11](另一个被广泛运用的语义代码克隆检测数据集)的不同问题之间的标识符的Jaccard类似系数为0.469,它标明OJClone数据集的不同问题之间的标识符比较相同。导致差异的原因是BigCloneBench数据集是从真实项目中发掘到的,完成同一个问题时,往往会用到相同的第三方库的类以及Java根底类。而OJClone是经过学生提交的编程题结构而来,这些编程题往往是根底的算法,学生一般很少引证第三方库,在界说变量名时,一般都会界说i、j、k、n等。

表2:BigCloneBench数据会集每类问题的前20个标识符姓名

语义级代码克隆检测数据集的评估与改进

2. BigCloneBench数据集和实际世界中的语义代码克隆示例

图1和图2展现了一个BigCloneBench数据会集的语义代码克隆包含类似的标识符的比方和Stack Overflow中的一个语义代码克隆包含不类似的标识符的比方。这两个比方可以阐明实际世界中的确存在不依靠标识符的语义代码克隆,而BigCloneBench数据会集的语义代码克隆依靠标识符的问题应该需要被重视和提高。

语义级代码克隆检测数据集的评估与改进

图1:BigCloneBench数据会集具有类似标识符的语义代码克隆示例

语义级代码克隆检测数据集的评估与改进

图2:Stack Overflow具有不类似标识符的语义代码克隆示例

三、不合理的克隆检测模型

本节展现了咱们规划的不合理的克隆检测模型(名为Linear-Model)的全体架构以及具体的技能细节。

1.全体架构

图3展现了Linear-Model的全体架构图。咱们首要运用javalang[8]将代码片段解析为笼统语法树。然后咱们运用PACE[5](由Yu等人提出)对每个结点进行编码,接着运用编码的结点传给Linear-Model和一个最大池化层。

图4展现了具体比方(虚线标明AST中的完结结点,实线标明AST中的非完结结点)。然后咱们遍历AST(笼统语法树)上的一切结点,而且根据node的ID去重。最终咱们得到的node ID为“MethodDeclaration”, “copy”, “FormalParameter”, “src”, “ReferenceType”, “String”, “dest”, and “IOException”。State-of-the-art的办法运用程序的AST信息,包含词法和结构信息。Linear-Model也运用相同的词法信息,可是因为Linear-Model不对AST做处理,因而Linear-Model只运用程序的少数结构信息(比方根据ForStatement结点得知程序包含for循环结构等),具体的Linear-Model的完成在下一节介绍。

语义级代码克隆检测数据集的评估与改进

图3:Linear-Model的全体架构

语义级代码克隆检测数据集的评估与改进

图4:一个代码片段及其对应的AST以及遍历AST得到的Node IDs调集的示例

2.线性操作和最大池化

图5展现了Linear-Model的线性操作和最大池化。Node IDs调会集有n个token,每个token的编码长度为d。Linear-Model运用一个dm的矩阵进行线性操作,得到一个nm的矩阵。经过线性操作后,node IDs调会集的token个数不变。然后对每一维度运用一个最大池化的操作,终究得到一个1m的向量。

语义级代码克隆检测数据集的评估与改进

图5:线性操作

四、试验设置

咱们经过试验答复如下3个Research Question:

RQ1:一个不合理的模型Linear-Model(经过只考虑哪些标识符呈现在代码片段中)可以在BigCloneBench数据会集到达好的作用吗?

RQ2:State-of-the-art的办法和Linear-Model在AbsBigCloneBench数据集上的作用怎么?

RQ3:State-of-the-art的办法和Linear-Model在穿插试验上的作用怎么?

1.比照办法

  • ASTNN[9]。ASTNN是一个根据神经网络的程序笼统语法树的标明模型。它对笼统语法树的子树进行编码来更加充沛的捕获程序笼统语法树的信息。然后它运用一个双向RNN来对每个子树的标明做处理,得到整个AST的标明。最终经过比较两个代码片段的AST标明的类似性来判断两个代码片段是否归于代码克隆。

  • TBCCD[5]。TBCCD提出运用根据树的卷积神经网络检测语义代码克隆的作业。TBCCD还提出了一个根据词位置编码的办法来处理测验会集存在不在词表中的不知道token的问题。

  • FA[10]。FA运用根据图的卷积神经网络进行语义代码克隆检测。FA首要在程序的笼统语法树上加边,然后FA运用两个不同类型的图神经网络来判断两个代码片段的类似性。因为FA只支撑Java言语的代码克隆检测,因而咱们只汇报FA在BigCloneBench数据集以及AbsBigCloneBench数据集上的成果。

2.数据集

咱们运用两个揭露的数据集(剩下两个数据集是根据这两个数据集改变而来):BigCloneBench[3]和OJClone[11]。这两个数据集被广泛用来验证语义代码克隆检测办法的有用性。表3展现了两个数据集的具体信息。

表3:BigCloneBench数据集和OJClone数据集的全体计算信息

语义级代码克隆检测数据集的评估与改进

  • BigCloneBench

BigCloneBench数据集由Svajlenko等人提出,它是从IJaDataset中发掘而来,而且由三个专家手动承认。IJaDataset包含25000个项目,3.65亿行代码。BigCloneBench包含10类问题以及600万克隆对和26万非克隆对。BigCloneBench将类型三的代码克隆分为弱、中、强和十分强四类。表1展现了BigCloneBench数据会集每个类型的代码克隆对占比,超越98%的代码克隆对归于语义代码克隆。咱们运用OJClone来答复咱们的RQ1。

  • OJClone

OJClone由Mou等人提出,它开始是用来验证代码分类使命有用性的。后来CDLH、TBCCD、ASTNN以及FA运用OJClone来验证语义代码克隆检测使命有用性。学生为了处理同一问题提交的代码片段的完成往往不同,因而OJClone的代码克隆对被以为至少归于类型三的克隆。咱们运用OJClone来答复咱们的RQ1。

  • AbsBigCloneBench

AbsBigCloneBench是从BigCloneBench数据会集笼统而来。AbsBigCloneBench笼统了BigCloneBench数据会集的部分标识符,包含类型、变量以及函数名,保留了其他token,比方操作符、根本类型以及成员变量。根据代码克隆类型的界说,笼统标识符之后的AbsBigCloneBench不会改动BigCloneBench数据会集语义代码克隆和非语义代码克隆的标记信息。咱们运用AbsBigCloneBench数据集来答复咱们的RQ2和RQ3.

  • Over-AbsBigCloneBench

跟Mou等人和Yu等人相同,咱们相同测验研讨假如只运用AST中的非完结结点,语义代码克隆检测办法在该数据集的有用性。Over-AbsBigCloneBench只运用图4中实线部分的token进行试验。咱们运用Over-AbsBigCloneBench来展现state-of-the-art办法在这样一个过笼统的数据集上相同比Linear-Model有用。

3.试验设置

对于一切数据集,咱们依照8:1:1区分练习集、验证集和测验集。Linear-Model的参数如下:m为100,练习的epoch为10,优化器为SGD。

五、试验成果

RQ1:一个不合理的模型Linear-Model(经过只考虑哪些标识符呈现在代码片段中)可以在BigCloneBench数据会集到达好的作用吗?

表4展现了State-of-the-art的办法和Linear-Model在BigCloneBench以及OJClone数据集的作用。从表中可以看到,Linear-Model在BigCloneBench数据集上可以到达跟state-of-the-art办法简直一致的作用,而在OJClone数据集上的作用要显着比state-of-the-art办法差许多。在运用BigCloneBench数据集验证根据深度学习的语义代码克隆检测办法的有用性时,研讨者应当留意BigCloneBench数据会集的标识符的影响。

表4:State-of-the-art的办法和Linear-Model在BigCloneBench以及OJClone的作用

语义级代码克隆检测数据集的评估与改进

发现1:

一个不合理的模型Linear-Model在只考虑哪些标识符呈现在代码片段中,可以在BigCloneBench数据集上到达很好的作用,可是它在OJClone数据集上失效。只运用BigCloneBench数据集来验证根据深度学习的语义代码克隆检测办法是有问题的,BigCloneBench数据集需要被改进。

RQ2:State-of-the-art的办法和Linear-Model在AbsBigCloneBench数据集上的作用怎么?

为了减轻BigCloneBench数据会集标识符的影响,咱们经过笼统BigCloneBench数据会集的一部分标识符来更好的验证根据深度学习的语义代码克隆检测办法的有用性。咱们将笼统后的数据集记为AbsBigCloneBench。咱们首要介绍state-of-the-art的办法和Linear-Model在Over-AbsBigCloneBench数据集(只保留程序AST中的非完结结点)上的作用,接着介绍怎样修正BigCloneBench来得到AbsBigCloneBench,最终评论为什么AbsBigCloneBench比BigCloneBench在验证根据深度学习的语义代码克隆检测办法有用性时更合理。

1. State-of-the-art的办法和Linear-Model在Over-AbsBigCloneBench数据集的作用

跟Mou等人和Yu等人相同,为了进一步研讨代码token对代码克隆检测的影响,咱们在Over-AbsBigCloneBench数据集上测验了state-of-the-art的办法和Linear-Model的作用。表5展现了state-of-the-art的办法和Linear-Model在Over-AbsBigCloneBench数据集的作用。当程序AST中的完结结点(即代码token)被移除后,state-of-the-art的办法显着比Linear-Model的办法有用,因为state-of-the-art的办法在学习程序结构信息方面比Linear-Model更有用。可是移除一切的代码token是不合理的,这样会丢失大量的程序语义信息。这也是state-of-the-art的办法在Over-AbsBigCloneBench数据集上的作用比较BigCloneBench差许多的原因。

表5:state-of-the-art的办法和Linear-Model在Over-AbsBigCloneBench数据集的作用

语义级代码克隆检测数据集的评估与改进

2. 怎样修正BigCloneBench来得到AbsBigCloneBench

考虑到保留代码语义信息不变,笼统一切的代码token是不合理的。咱们只笼统BigCloneBench数据会集的部分标识符,包含类型、变量以及函数名,保留了其他token,比方操作符、根本类型以及成员变量。图6展现了一个BigCloneBench数据会集的代码片段以及其笼统后的示例。

语义级代码克隆检测数据集的评估与改进

图6:BigCloneBench数据会集的一个代码片段以及其笼统后的示例

AbsBigCloneBench数据集不同问题之间的标识符的Jaccard类似系数为0.484,比照BigCloneBench数据集的0.038,标明AbsBigCloneBench比BigCloneBench数据集更少的依靠于标识符。

3. State-of-the-art的办法和Linear-Model在AbsBigCloneBench数据集的作用

跟RQ1类似,咱们比较了state-of-the-art的办法和Linear-Model在AbsBigCloneBench数据集的作用。试验成果如表6所示,∆F1指标指相对表4的F1值成果的提高或下降。

表6:State-of-the-art的办法和Linear-Model在AbsBigCloneBench数据集的作用

语义级代码克隆检测数据集的评估与改进

从表6可以看到,state-of-the-art的办法在AbsBigCloneBench数据集上的F1值显着比Linear-Model高。一同state-of-the-art的办法在AbsBigCloneBench数据集上的F1比较BigCloneBench简直没有改变,而Linear-Model却有一个显着的下降。剖析原因咱们以为在笼统了部分标识符后,Linear-Model只经过考虑哪些标识符呈现来进行语义代码克隆检测是无效的。图7进一步展现了state-of-the-art的办法和Linear-Model在BigCloneBench以及AbsBigCloneBench数据集的PR曲线以及AUC值,PR曲线和AUC值相同能阐明AbsBigCloneBench数据集在检测根据深度学习的语义代码克隆检测办法的有用性时更合理。

发现2:合理的笼统BigCloneBench数据会集的标识符可以协助其更好的别离state-of-the-art的办法和不合理的根据深度学习的代码克隆检测办法。笼统BigCloneBench数据会集的标识符姓名能更协助其更好的评估根据深度学习的代码克隆检测办法的有用性。

RQ3:State-of-the-art的办法和Linear-Model在穿插试验上的作用怎么?

本节咱们经过穿插试验来研讨模型在BigCloneBench(AbsBigCloneBench)数据集上练习,在AbsBigCloneBench(BigCloneBench)数据集上测验的作用,而且提出三个评估技能来查看用来验证根据深度学习的代码克隆检测办法的数据集是否合理。

1. State-of-the-art的办法和Linear-Model在BigCloneBench数据集练习,在AbsBigCloneBench数据集测验

表7的上半部分展现了state-of-the-art的办法和Linear-Model在BigCloneBench数据集练习,在AbsBigCloneBench测验的作用比较在BigCloneBench测验的作用有一个显着的下降,它标明在BigCloneBench数据集上练习的模型,在其他只是标识符不同的数据集上测验将会失效,而根据代码克隆的界说,标识符不同不应该影响代码语义克隆检测模型的作用。剖析原因咱们以为模型在BigCloneBench数据集上练习时,可以经过标识符信息快速到达收敛,模型不会继续深化学习程序的结构信息。因而一旦测验会集的标识符跟练习集不类似,模型的作用就会有一个显着的下降。

表7:State-of-the-art的办法和Linear-Model在穿插试验上的作用

语义级代码克隆检测数据集的评估与改进

发现3:

在BigCloneBench数据集上练习的模型在AbsBigCloneBench数据集测验无效

2. State-of-the-art的办法和Linear-Model在AbsBigCloneBench数据集练习,在BigCloneBench数据集测验

表7的下半部分展现了state-of-the-art的办法和Linear-Model在AbsBigCloneBench数据集练习,在BigCloneBench测验的作用比较在AbsBigCloneBench测验的作用简直没有改变,它标明在BigCloneBench数据集上练习的模型,在其他只是标识符不同的数据集上测验仍然有用。剖析原因咱们以为模型在AbsBigCloneBench数据集上练习时,不可以经过标识符信息快速到达收敛,模型会继续深化学习程序的结构信息。因而即使测验会集的标识符跟练习集不类似,模型的作用仍然会有用。

发现4:

在AbsBigCloneBench数据集上练习的模型在BigCloneBench数据集测验仍然有用。AbsBigCloneBench供给了更全面的办法有用性视图,与在BigCloneBench数据集练习的模型比较,在AbsBigCloneBench数据集练习的模型对标识符称号的依靠程度更低。

3. 三个查看用来验证根据深度学习的代码克隆检测办法的数据集是否合理的评估技能

  • 不同办法在笼统前数据集和笼统后数据集的有用性排序应该一致

  • 同一个办法,在笼统前数据集练习,在笼统后数据集测验的作用应该一致

  • 不合理的办法在笼统后的数据集应该无效

六、总结

咱们首要发现BigCloneBench数据集的语义代码克隆对运用类似的标识符,而非语义代码克隆对的标识符不类似。接着文章提出了一个不合理的模型(Linear-Model),经过只考虑那些标识符在代码克隆片段中呈现来检测代码语义代码克隆。这个不合理的模型可以到达跟其他被验证有用的办法相同的作用。为了减轻这个问题,咱们经过笼统BigCloneBench数据会集的一部分标识符(类型名、变量名以及办法名)得到AbsBigCloneBench数据集。试验成果标明AbsBigCloneBench数据集可以更好的验证语义代码克隆检测办法的有用性。而且运用AbsBigCloneBench数据集练习的模型在BigCloneBench数据集测验仍然有用,而运用BigCloneBench数据集练习的模型在AbsBigCloneBench数据集测验却无效。

作者:于浩、胡星、李戈、李影、王千祥、谢涛; 来自北京大学、华为云PaaS技能创新Lab

PaaS技能创新Lab隶归于华为云(华为内部当前发展最为迅猛的部分之一,目前国内公有云市场份额第二,全球第五),致力于综合利用软件剖析、数据发掘、机器学习等技能,为软件研制人员供给下一代智能研制工具服务的中心引擎和智慧大脑。咱们将聚集软件工程领域硬核能力,不断构筑研制利器,继续交给高价值商业特性!加入咱们,一同开创研制新“境地”!(招聘接口人:guodongshuo@huawei.com; huwei18@huawei.com)

参考文献

  1. Chanchal Kumar Roy and James R Cordy. A Survey on Software Clone Detection Research. Queen’s School of Computing TR 541, 115 (2007), 64–68.

  2. Stefan Bellon, Rainer Koschke, Giulio Antoniol, Jens Krinke, and Ettore Merlo. Comparison and Evaluation of Clone Detection Tools. IEEE Transactions on Software Engineering 33, 9 (2007), 577–591.

  3. Jeffrey Svajlenko, Judith F. Islam, Iman Keivanloo, Chanchal K. Roy, and Mohammad Mamun Mia. Towards a Big Data Curated Benchmark of Inter-Project Code Clones. In Proceedings of the 30th International Conference on Software Maintenance and Evolution (ICSME), 2017, 476–480.

  4. Hui-Hui Wei and Ming Li. Positive and Unlabeled Learning for Detecting Software Functional Clones with Adversarial Training. In Proceedings of the 27th International Joint Conference on Artificial Intelligence (IJCAI), 2018, 2840–2846.

  5. Hao Yu, Wing Lam, Long Chen, Ge Li, Tao Xie, and Qianxiang Wang. Neural Detection of Semantic Code Clones Via Tree-Based Convolution. In Proceedings of the 27th IEEE International Conference on Program Comprehension (ICPC), 2019, 70–80.

  6. Hao Yu, Xing Hu, Ge Li, Ying Li, Qianxiang Wang, Tao Xie. Assessing and Improving an Evaluation Dataset for Detecting Semantic Code Clones via Deep Learning. TOSEM, 2022, Accepted.

  7. IJaDataset2.0. January 2013. Ambient Software Evoluton Group. secold.org/projects/se….

  8. github.com/c2nes/javal…

  9. Jian Zhang, Xu Wang, Hongyu Zhang, Hailong Sun, Kaixuan Wang, and Xudong Liu. A Novel Neural Source Code Representation Based on Abstract Syntax Tree. In Proceedings of the 41st IEEE/ACM International Conference on Software Engineering (ICSE), 2019, 783–794.

  10. Wenhan Wang, Ge Li, Bo Ma, Xin Xia, and Zhi Jin. Detecting Code Clones with Graph Neural Network and Flow-Augmented Abstract Syntax Tree. In Proceedings of the 27th IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER), 2020, 261–271.

  11. Lili Mou, Ge Li, Lu Zhang, Tao Wang, and Zhi Jin. Convolutional Neural Networks over Tree Structures for Programming Language Processing. In Proceedings of the 30th AAAI Conference on Artificial Intelligence (AAAI), 2016, 1287–1293.

​​​​​点击重视,第一时间了解华为云新鲜技能~