本发明涉及人工智能与语言处理,具体而言,涉及一种基于分层解析的代码克隆检测方法、装置、设备及介质。
背景技术:
1、代码克隆旨在识别软件系统内部或软件系统之间语法或功能相似的代码片段,以提高软件的可维护性与便利性。代码克隆检测主要是在软件系统中发现相似或重复的代码片段,以进行代码维护、重构及性能优化,从而提升软件质量。
2、现有代码克隆检测技术包括文本匹配、语义分析技术和抽象语法树(ast,abstract syntax tree)匹配。文本匹配是最简单的代码克隆检测方法,通过直接比较代码文本来发现相似片段,但容易受到代码格式变化(如注释、空格)的影响,导致误报或漏报。语义分析技术通过理解代码的语义信息来进行克隆检测,能够识别不同语法但语义相同的代码片段,但其计算复杂度较高,对处理大规模代码库的性能有一定影响。ast匹配技术通过比较代码的ast结构来检测克隆代码片段,能更好地捕获代码的结构和逻辑关系,减少因格式变化导致的误报,但由于ast过大过深,导致语义信息捕获不完整。
3、在现有代码克隆检测技术中,循环神经网络(rnn)和长短期记忆网络(lstm)模型被广泛应用于处理代码序列数据。这些模型通过将代码序列编码为固定长度的表示形式来进行处理,在编码和解码过程中使用循环单元来处理代码的时序信息,试图捕捉代码片段之间的相似性。虽然它们在代码克隆检测中显示出一定的效果,但存在以下缺点:
4、(1)效率低下。rnn和lstm模型由于受循环结构的限制,不能很好地实施并行处理,导致训练和推理成本昂贵,特别是在处理大型代码库时,低效率问题更加明显。
5、(2)梯度消失。在长序列数据中,rnn和lstm容易出现梯度消失问题,难以捕捉长距离依赖关系,导致模型难以学习到代码片段之间的复杂关系。
6、(3)语法结构破坏。现有基于ast的神经模型在处理大型且深度嵌套的ast时,大部分现有处理方式会破坏源代码的语法结构,削弱了模型捕捉真实语义的能力。
7、(4)高计算开销。现有生成代码技术使用程序依赖图(pdg)和控制流图(cfg)来表征函数,这样既耗时又复杂,导致运行时开销较高,特别是对于不可编译或不完整的代码片段,这种方法并不适用。
8、有鉴于此,申请人在研究了现有的技术后特提出本技术。
技术实现思路
1、本发明旨在提供一种基于分层解析的代码克隆检测方法及装置,以解决上述问题中的至少一个。
2、为解决上述技术问题,本发明通过以下技术方案实现:
3、一种基于分层解析的代码克隆检测方法,包括:
4、s1,获取待克隆检测的两份源代码片段;
5、s2,对所述两份源代码片段分别进行解析转换成对应的抽象语法树ast;其中,所述抽象语法树ast的每个节点代表源代码的一个语法元素;
6、s3,对所述两份源代码片段对应的抽象语法树ast分别进行分层提取,分解为可管理的层,得到对应的分层ast;
7、s4,遍历对应的分层ast的每个节点,依次计算每个节点到另一个节点之间的相对距离,得到相对位置嵌入矩阵,并将相对位置嵌入矩阵融入到分层ast对应的节点表示中,得到相对位置分层ast;其中,所述相对位置嵌入矩阵记录了每个节点在树结构中的层间节点位置信息与层内节点位置信息;相对位置分层ast的每个节点包含节点本身的内容信息与节点的相对位置嵌入信息;
8、s5,根据相对位置分层ast,利用解耦注意力机制处理相对位置分层ast的每个节点,得到每个节点的内容向量与位置嵌入向量,并分别计算内容向量对内容向量、内容向量对位置嵌入向量以及位置嵌入向量对内容向量的注意力权重,从而得到相对位置分层ast的注意力矩阵;
9、s6,将所述两份源代码片段的相对位置分层ast与对应的注意力矩阵输入暹罗网络进行克隆检测,计算相似度,根据所述相似度得到所述两份源代码片段的克隆检测结果。
10、优选地,在对抽象语法树ast进行分层提取时,根据源代码的结构依次提取出源代码文件的语法元素;所述语法元素包括函数方法名、局部变量声明、控制流结构与返回语句。
11、优选地,在依次计算每个节点到另一个节点之间的相对距离时,所述相对距离的表达式为:
12、=;
13、其中,表示分层ast中节点到节点的距离,i和j分别表示节点在路径中的索引。
14、优选地,在相对位置分层ast的每个节点,将节点本身的内容信息与节点的相对位置嵌入信息进行融合,以将相对位置嵌入信息融入到分层ast对应的节点表示中;其中,所述融合包括加法或拼接方式。
15、优选地,所述内容向量用于记录分层ast中节点的内容信息;所述位置嵌入向量用于记录分层ast中节点的相对位置信息;分层ast的注意力矩阵通过分别计算两个节点的内容向量的点积、内容向量与位置嵌入向量的点积、位置嵌入向量与内容向量的点积得到,计算公式为:
16、=+;
17、其中,表示第i个节点与第j个节点的注意力权重,即注意力矩阵中的第i行第j列的值;和分别表示第i个节点与第j个节点的内容向量;表示第i个节点与第j个节点的相对位置的嵌入向量;表示第j个节点与第i个节点的相对位置的嵌入向量;t表示转置矩阵。
18、优选地,在判断克隆检测结果时,当所述相似度大于设定的阈值时,则所述两份源代码片段判定为一对克隆代码。
19、优选地,所述层间节点位置信息指在整个树结构中不同层级之间的相对位置关系,体现节点在整个树结构中的全局层次;所述层内节点位置信息指在树结构中同一层级内各个节点之间的相对位置关系,体现局部结构的相互依赖性。
20、本发明还提供了一种基于分层解析的代码克隆检测装置,包括:
21、获取单元,用于获取待克隆检测的两份源代码片段;
22、ast解析单元,用于对所述两份源代码片段分别进行解析转换成对应的抽象语法树ast;其中,所述抽象语法树ast的每个节点代表源代码的一个语法元素;
23、ast分层单元,用于对所述两份源代码片段对应的抽象语法树ast分别进行分层提取,分解为可管理的层,得到对应的分层ast;
24、相对位置嵌入单元,用于遍历对应的分层ast的每个节点,依次计算每个节点到另一个节点之间的相对距离,得到相对位置嵌入矩阵,并将相对位置嵌入矩阵融入到分层ast对应的节点表示中,得到相对位置分层ast;其中,所述相对位置嵌入矩阵记录了每个节点在树结构中的层间节点位置信息与层内节点位置信息;相对位置分层ast的每个节点包含节点本身的内容信息与节点的相对位置嵌入信息;
25、注意力计算单元,用于根据相对位置分层ast,利用解耦注意力机制处理相对位置分层ast的每个节点,得到每个节点的内容向量与位置嵌入向量,并分别计算内容向量对内容向量、内容向量对位置嵌入向量以及位置嵌入向量对内容向量的注意力权重,从而得到相对位置分层ast的注意力矩阵;
26、克隆检测单元,用于将所述两份源代码片段的相对位置分层ast与对应的注意力矩阵输入暹罗网络进行克隆检测,计算相似度,根据所述相似度得到所述两份源代码片段的克隆检测结果。
27、本发明还提供了一种基于分层解析的代码克隆检测设备,包括处理器以及存储器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如上所述的一种基于分层解析的代码克隆检测方法。
28、本发明还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机可读指令,所述计算机可读指令被计算机可读存储介质所在设备的处理器执行时实现如上所述的一种基于分层解析的代码克隆检测方法。
29、综上所述,与现有技术相比,本发明具有如下有益效果:
30、本发明提出的基于分层解析的代码克隆检测方法,通过将两份源代码片段的抽象语法树ast分别分解为可管理的层,使得能够顺序且更准确地处理每一层。通过ast层次化和顺序化的提取,将代码解析成分层次的ast,模型可以更有效地捕获源代码中函数的结构和逻辑信息,分层ast中的每一层只包含特定类型的节点,从而降低单层的复杂度。通过逐层处理,可以有效地减少模型每一次处理的节点数量,从而提高处理大型ast的效率和准确性。
31、此外,本发明通过相对位置嵌入矩阵记录ast节点的相对位置关系,以全面理解ast的结构位置信息和内容信息。同时,本发明结合解耦注意力机制,通过独立的注意力头分别处理节点的内容信息和位置信息,使得模型能够以更细粒度的方式学习内容和位置之间的复杂关系,从而提高代码克隆检测的效率和准确性,解决了梯度消失问题,提高了模型的可解释性,保持了代码语法结构的完整性,降低了计算开销,从而为大规模代码克隆检测提供了一种高效、可扩展的解决方案。
1.一种基于分层解析的代码克隆检测方法,其特征在于,包括:
2.根据权利要求1所述的一种基于分层解析的代码克隆检测方法,其特征在于,在对抽象语法树ast进行分层提取时,根据源代码的结构依次提取出源代码文件的语法元素;所述语法元素包括函数方法名、局部变量声明、控制流结构与返回语句。
3.根据权利要求1所述的一种基于分层解析的代码克隆检测方法,其特征在于,在依次计算每个节点到另一个节点之间的相对距离时,所述相对距离的表达式为:
4.根据权利要求1所述的一种基于分层解析的代码克隆检测方法,其特征在于,在相对位置分层ast的每个节点,将节点本身的内容信息与节点的相对位置嵌入信息进行融合,以将相对位置嵌入信息融入到分层ast对应的节点表示中;其中,所述融合包括加法或拼接方式。
5.根据权利要求3所述的一种基于分层解析的代码克隆检测方法,其特征在于,所述内容向量用于记录分层ast中节点的内容信息;所述位置嵌入向量用于记录分层ast中节点的相对位置信息;分层ast的注意力矩阵通过分别计算两个节点的内容向量的点积、内容向量与位置嵌入向量的点积、位置嵌入向量与内容向量的点积得到,计算公式为:
6.根据权利要求1所述的一种基于分层解析的代码克隆检测方法,其特征在于,在判断克隆检测结果时,当所述相似度大于设定的阈值时,则所述两份源代码片段判定为一对克隆代码。
7.根据权利要求1所述的一种基于分层解析的代码克隆检测方法,其特征在于,所述层间节点位置信息指在整个树结构中不同层级之间的相对位置关系,体现节点在整个树结构中的全局层次;所述层内节点位置信息指在树结构中同一层级内各个节点之间的相对位置关系,体现局部结构的相互依赖性。
8.一种基于分层解析的代码克隆检测装置,其特征在于,包括:
9.一种基于分层解析的代码克隆检测设备,其特征在于,包括处理器以及存储器,所述存储器内存储有计算机程序,所述计算机程序能够被所述处理器执行,以实现如权利要求1-7任意一项所述的一种基于分层解析的代码克隆检测方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机可读指令,所述计算机可读指令被计算机可读存储介质所在设备的处理器执行时实现如权利要求1-7任意一项所述的一种基于分层解析的代码克隆检测方法。
