代码克隆检测(Kamiya等人,2002年;Roy等人,2009年)用于识别功能相似的代码片段,是许多软件工程任务的基础,包括重构、错误传播分析、抄袭检测、软件维护、质量保证和代码重用优化。现有研究从多个角度探讨了代码克隆检测。早期方法主要依赖于词汇或令牌级别的相似性,而后续工作则结合了树结构、控制流和程序依赖图等结构信息。最近的研究进一步引入了神经表示学习来提高泛化和语义建模能力(张等人,2025年)。实际上,这些方向并不相互排斥,因为许多现代方法将结构表示与学习到的嵌入相结合。然而,这一进展凸显了一个重要挑战:现有方法仍然难以以统一且计算高效的方式联合建模代码的互补性语法、控制流和数据依赖特性。
基于词汇和令牌的方法将代码视为连续的令牌流(Sajnani等人,2016年),主要捕获表面层次的词汇信息,而忽略了更丰富的程序结构。这种局限性使得它们无法识别结构相似但语义不同的代码对。例如,这类方法可能无法识别int c = a + b和int c = b + a之间的结构相似性。
结构感知方法将代码片段表示为树或图(Jiang等人,2007年;Liu等人,2006年),从而在单纯的令牌序列之外融入了语法或语义结构。这些方法通常使用抽象语法树(ASTs)(Zhang等人,2019b年;Wang等人,2020年)来编码程序结构,尽管仅靠ASTs无法完全捕捉语义含义。为了解决这一问题,研究人员将代码转换为更具表现力的图结构,如控制流图(CFGs)(Y. Wu等人,2020年)和程序依赖图(PDGs),这些结构能更好地表示执行路径和依赖关系。然而,结构感知方法往往依赖于子图匹配技术,而这对于大规模应用来说在计算上是不可行的。
神经表示学习方法利用神经网络学习代码嵌入(Chen和Monperrus,2019年),相较于纯手工构建的相似性度量方法,提供了更好的可扩展性和泛化能力。早期方法如DeepSim(Zhao和Huang,2018年)采用语义特征学习,而ASTNN(Zhang等人,2019b年)则利用语句级别的AST嵌入。最近的基于图卷积网络(GCN)的方法显示出特别的前景(Qiao等人,2024年)。Node2vec(Grover和Leskovec,2016年)使用基于随机游走的矩阵,GraphSAGE(Hamilton等人,2017年)通过邻域采样和聚合引入归纳学习,GAT(Veli?kovi?等人,2018年)结合注意力机制来区分邻居的贡献。FA-AST(Wang等人,2020年)利用带门的图卷积网络(GGCNs)和稀疏结构进行特征生成。预训练模型如CodeBERT(Feng等人,2020年)联合建模自然语言和代码,而GraphCodeBERT(Guo等人,2020年)在预训练阶段进一步融入了代码结构。
尽管这些方法具有潜力,但现有的神经表示学习方法在应用于代码分析时仍存在关键局限性(Z. Wu等人,2020年)。它们未能考虑代码派生图的异构性,这些图中包含不同类型的顶点(如操作符、变量、函数调用)以及不同的属性和重要性级别。此外,它们通常假设图结构是均匀的,而实际上代码图表现出不同的模式——控制流顶点与数据依赖顶点有本质区别,它们之间的交互需要专门的处理方式,而通用框架无法提供这种支持。
在本文中,我们提出了GraphClone,这是一种基于GCN的新架构,通过三项关键创新解决了现有方法的局限性。
首先,我们开发了一种多视图图表示,能够同时捕捉代码语义和结构的不同方面。GraphClone不是依赖单一的图表示,而是构建了包含ASTs的语法关系、CFGs的控制流依赖关系以及PDGs的数据依赖关系的并行视图。每个视图提供互补的信息:AST视图保留了层次化的代码结构,CFG视图捕捉执行路径,PDG视图编码数据和控制依赖关系。我们的专用GCN架构通过特定的拉普拉斯过滤器分别处理这些视图,然后通过可学习的融合机制结合它们的嵌入。
其次,我们引入了自适应拉普拉斯平滑(ALS)过滤器,能够动态适应代码派生图的异构性。与标准GCN方法应用统一转换不同,我们的过滤器根据局部图拓扑和顶点类型调整平滑参数,从而在聚合过程中实现更细致的特征传播。这些过滤器生成专门的权重矩阵,保留了重要的结构差异,同时抑制了无关连接的噪声。
第三,我们实施了自适应采样策略,显著提高了准确性和效率。该策略根据代码复杂性动态调整深度和广度——对于简单代码模式使用浅层网络,而对于复杂片段则使用更深层次的架构。我们的方法在生成小批量数据时优先处理结构上重要的顶点,确保关键代码元素得到充分表示,同时减少计算开销。
我们在两个知名的基准测试OJClone(Mou等人,2016年)和BigCloneBench(Svajlenko等人,2014年)上评估了GraphClone。在代表性的词汇、结构和神经基线测试中,GraphClone表现出强大的检测性能和良好的效率。特别是其多视图表示和自适应过滤策略改善了语义相似但结构多样代码片段的建模。
本文的其余部分安排如下:第2节介绍了背景知识,包括代码克隆的定义、相关工作和现有方法的局限性。第3节详细介绍了我们提出的方法。第4节描述了实验设置和评估结果。最后,第5节总结了本文。