一种基于特征对齐的克隆代码检测方法

文档序号:1845540 发布日期:2021-11-16 浏览:16次 >En<

阅读说明:本技术 一种基于特征对齐的克隆代码检测方法 (Clone code detection method based on feature alignment ) 是由 方黎明 张爱平 于 2021-08-16 设计创作,主要内容包括:本发明公开了一种基于特征对齐的克隆代码检测方法,将源代码解析成抽象语法树,并分割为语句树序列,然后进行词嵌入和语义树编码;接着,利用双向因果卷积神经网络,提取具有丰富结构和语义信息的代码片段的特征表示;在特征提取之后,通过稀疏重建,以数据驱动的方式,学习表示两个代码片段之间对应关系的对齐矩阵,从而对齐两个代码片段,得到两个代码的相似度。与现有技术相比,本发明能够提取更丰富的特征,并解决功能相似的代码因语句位置不同而导致的结构差异问题,获得更高的检测精度。(The invention discloses a clone code detection method based on feature alignment, which comprises the steps of analyzing a source code into an abstract syntax tree, dividing the abstract syntax tree into a sentence tree sequence, and then carrying out word embedding and semantic tree coding; secondly, extracting feature representation of code segments with rich structure and semantic information by using a bidirectional causal convolutional neural network; after feature extraction, an alignment matrix representing the corresponding relation between the two code segments is learned in a data-driven mode through sparse reconstruction, so that the two code segments are aligned, and the similarity of the two codes is obtained. Compared with the prior art, the method can extract more abundant features, solve the problem of structural difference of codes with similar functions due to different statement positions and obtain higher detection precision.)

一种基于特征对齐的克隆代码检测方法

技术领域

本发明属于软件代码分析技术领域。

背景技术

代码克隆检测的目的,是通过度量两个代码片段的相似性来做出决策。在整个软件开发生命周期中,代码克隆检测已经被证明是有价值的。识别文本、语法或功能上相似的代码片段是许多软件工程任务的基础,如代码分类、代码重构、bug检测和恶意代码检测等。近年来,深度学习技术在代码克隆检测中取得了很好的结果,尤其是解决功能相似的代码克隆检测。

然而,现有的技术仅仅关注如何从源代码中提取更多的区别性特征,而一些问题,如功能相似的代码的结构差异,并没有明确解决。软件开发过程中,当程序员复制一个代码段时,经常添加或删除几个语句,或者使用更灵活的语法结构来实现同样功能,这导致复制前后的代码语句错位,产生结构差异。

代码片段通常被转换为抽象语法树或程序依赖图,后续采用CNN或RNN学习特征表示,计算特征之间的相似度,来决策是否为相似代码。学习到的特征通常是二维张量,为了生成计算相似度的向量,通常采用全局池化操作。然而,全局池化在解决代码错位方面本质上很薄弱,特征的错位依然存在。计算结构不同、而功能相似代码对的相似度时,特征错位会导致其相似度变低,从而可能导致决策错误。对代码特征进行对齐操作,可以帮助弥合功能相似代码存在的结构不同的鸿沟。

发明内容

发明目的:为了解决上述现有技术存在的问题,本发明提供了一种基于特征对齐的克隆代码检测方法。

技术方案:本发明提供了一种基于特征对齐的克隆代码检测方法,具体为:将目标代码x和代码y输入至训练好的克隆代码检测模型中;所述训练好的克隆代码检测模型输出代码x和代码y的相似度,根据代码x和代码y的相似度判断代码x和代码y是否为相似的代码;所述克隆代码检测模型对输入的代码x和代码y做如下处理:

步骤1:利用代码解析工具生成代码x的抽象语法树Tx和代码y的抽象语法树Ty

步骤2:根据抽象语法树Tx的状态节点,将Tx划分为多个语句树,并按照原抽象语法树Tx先序遍历的顺序,将该多个语句树组成语句树序列STx;根据抽象语法树Ty的状态节点,将Ty划分为多个语句树,并按照原抽象语法树Tx先序遍历的顺序,将该多个语句树组成语句树序列STy

步骤3:构建语句向量矩阵:对每个语句树序列中每个语句树的节点实体进行词嵌入,采用编码器将词嵌入后的语句树编码成语句向量,根据该语句树序列将与该语句树序列对应的语句向量构成语句向量矩阵;

步骤4:采用双向因果卷积网络对代码x的语句向量矩阵Xx和代码y的语句向量矩阵Xy分别进行特征提取,从而得到代码x的代码特征Fx,代码y的代码特征Fy

步骤5:采用稀疏重建的方法计算代码特征Fy对于代码特征Fx的对齐特征以及代码特征Fx对于代码特征Fy的对齐特征

步骤6:计算并分别对Rxy和Ryx进行最大池化操作得到相似度特征向量Vxy和Vyx

步骤7:将Vxy和Vyx在特征维度上进行连接,再将连接后的向量输入至全连接层,将全连接层的输出输入至sigmoid函数层,sigmoid函数层输出代码x和代码y的相似度S。

进一步的,所述步骤4中双向因果卷积网络包括相互连接的第一双向因果卷积模块和第二双向因果卷积模块,所述第一、二双向因果卷积模块结构相同,均包括1×1卷积层,第一双向因果卷积层和第二双向因果卷积层;将1×1卷积层、第一双向因果卷积层和第二双向因果卷积层输出的结果相加作为双向因果卷积模块的输出;所述第一双向因果卷积层为卷积核为3×1的双向因果卷积层,第二双向因果卷积层为卷积核为3×1且步长为2的双向因果卷积层。

进一步的,所述双向因果卷积层对输入的特征进行如下操作:

其中,为双向因果卷积层的输入特征中第t个特征向量,t=0,1,2,…,T’;当对代码x进行特征提取时,T’为语句树序列STx的长度;当对代码y进行特征提取时,T’为语句树序列STy的长度;k为双向因果卷积层的卷积核大小,为卷积核,f和b分别代表前向和后向,*=f或b;为双向因果卷积层中前向卷积操作输出的第t个特征向量,为双向因果卷积层中后向卷积操作输出的第t个特征向量,concat表示连接,将双向特征向量连接起来,得到双向因果卷积层的第t个输出特征向量Ft

进一步的,所述步骤5具体为:

计算代码特征Fy对于代码特征Fx的对齐特征具体方法为:

通过稀疏重建,构建代码特征Fy对齐到代码特征Fx的目标函数:

其中Wyx为稀疏重建系数;β为平衡系数;

采用最小二乘法求解目标函数得到Iy为大小为 的单位矩阵,T为转置,为语句树序列STy的长度;从而得到

计算代码特征Fx对于代码特征Fy的对齐特征具体方法为:

通过稀疏重建,构建代码特征Fx对齐到代码特征Fy的目标函数:

其中,Wxy为稀疏重建系数;

采用最小二乘法求解目标函数得到从而得到 其中Ix为大小为的单位矩阵,为语句树序列STx的长度。

进一步的,所述克隆代码检测模型的损失函数为:

其中,N为训练集中样本的总个数,所述一个样本中包括两个代码,yj为第j个样本的标签,Sj为第j个样本中两个代码之间的相似度。

有益效果:本发明通过双向因果卷积网络对代码进行特征提取,可以双向捕获上下文信息,提高代码的表示能力,比其他方法采用的双向RNN网络参数更少,克隆代码检测的速度更快,准确率更高。通过稀疏重建对代码特征进行对齐操作,可以有效消除代码特征错位带来的影响。对于更加困难的克隆代码类型,即存在增加、删除、修改语句的相似代码,以及语义相同、语法结构差异很大的相似代码,本发明能够显著提高检测准确率和召回率。

附图说明

图1是本发明的方法流程图;

图2是代码对齐的方法示意图;

图3是双向因果卷积网络示意图,其中图(a)为双向因果卷积网络的结构示意图,图(b)为双向因果卷积模块的结构示意图。

具体实施方式

构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。

本实施例提供了一种基于特征对齐的克隆代码检测方法,具体为:将代码x和代码y输入至训练好的克隆代码检测模型中;所述训练好的克隆代码检测模型输出代码x和代码y的相似度,根据代码x和代码y的相似度判断代码x和代码y是否为相似的代码;所述克隆代码检测模型将原代码片段对转换为抽象语法树后,将所述抽象语法树分割,生成由若干个语句树组成的语句树序列,并构建语句向量矩阵,利用双向因果卷积网络提取特征,利用所提出的稀疏重建特征对齐方法将特征对齐,计算对齐后的代码特征相似度。

如图1和2所示,具体的克隆代码检测模型对代码x和代码y做如下处理:

(1)将代码x和代码y作为代码对,对于代码本,利用现有代码解析工具生成代码x和代码y的抽象语法树Tx和Ty

(2)根据抽象语法树的状态节点,将Tx划分为多个语句树,并将该多个语句树按照原抽象语法树先序遍历的顺序组成语句树序列STx;将Ty划分为多个语句树,并将这些多个语句树按照原抽象语法树先序遍历的顺序组成语句树序列STy;该步骤的目的是为了保持固定的顺序尽量不丢失原代码的结构信息,二是构成序列之后才能进行后续的特征提取;

(3)将所述语句树中的节点实体,利用Word2Vec进行词嵌入;通过语句编码器,将词嵌入后的语句树编码成语句向量,按照所述语句树序列的顺序,构建语句向量矩阵;则得到语句树序列STx的语句向量矩阵和语句树序列STy的语句向量矩阵;

(4)将所述语句向量矩阵输入双向因果卷积网络中进行特征提取,从而得到代码x的代码特征Fx,代码y的代码特征Fy

(5)将代码样本对的代码特征,利用稀疏重建生成对齐特征,也既代码特征Fy对于代码特征Fx的对齐特征以及代码特征Fx对于代码特征Fy的对齐特征

(6)将对齐特征和原始特征相减并求绝对值,并沿语句树数量维进行最大池化,得到单个代码与另一个代码的相似度特征向量;

(7)将两个相似度特征向量在特征维度上进行连接,再将连接后的向量输入至连接层,将全连接层的输出输入至sigmoid函数层,sigmoid函数层输出代码x和代码y的相似度S。

本发明的一个实施例,在步骤4中,如图3所示,双向因果卷积网络中由两个双向因果卷积模块串联堆叠而成。双向因果卷积模块,由一个1×1卷积层与两个双向因果卷积层组成,捕获不同尺度的信息。其中两个双向因果卷积层的卷积核大小均为3*1,步长分别为1,2。

双向因果卷积层可表示为:

其中,为双向因果卷积层的输入特征中第t个特征向量,t=0,1,2,…,T’;当对代码x进行特征提取时,T’为语句树序列STx的长度;当对代码y进行特征提取时,T’为语句树序列STy的长度;k为双向因果卷积层的卷积核大小,为卷积核,f和b分别代表前向和后向,*=f或b;为双向因果卷积层中前向卷积操作输出的第t个特征向量,为双向因果卷积层中后向卷积操作输出的第t个特征向量,concat表示连接,将双向特征向量连接起来,得到双向因果卷积层的第t个输出特征向量Ft

双向因果卷积模块的输出由1×1卷积层与两个双向因果卷积层的输出相加获得。语句向量矩阵Xx与Xy经过双向因果卷积网络得到的特征分别为 为代码x的语句树长度,为代码y的语句树长度,D表示特征的维度。

本发明的一个实施例,在步骤5具体为:

计算代码特征Fy对于代码特征Fx的对齐特征具体方法为:

通过稀疏重建,构建代码特征Fy对齐到代码特征Fx的目标函数:

其中,为稀疏重建系数,即对齐矩阵。β为平衡系数。采用最小二乘法可以解得:

其中为矩阵Wyx的转置,为求逆矩阵。为单位矩阵。由此可以获得代码y对于代码x的对齐特征为:

计算代码特征Fx对于代码特征Fy的对齐特征具体方法为:

通过稀疏重建,构建代码特征Fx对齐到代码特征Fy的目标函数:

其中,为稀疏重建系数,采用最小二乘法可以解得:

其中为矩阵Wxy的转置,为求逆矩阵。为单位矩阵,由此可以获得代码x对于代码y的对齐特征为:

本发明的一个实施例,在步骤6中,代码x的特征为Fx,代码y对于代码x的对齐特征为对两个特征求差,并求绝对值对其做最大值池化得到向量Vxy。代码y的特征为Fy,代码x对于代码y的对齐特征为对两个特征求差,并求绝对值对其做最大值池化得到向量Vyx

本发明的一个实施例,在步骤7中,将向量Vxy与Vyx在特征维度上进行连接,得到向量V,然后输入到全连接层FC中,经过sigmoid函数,得到相似度S。

克隆代码检测模型采用二值交叉熵损失函数,如下:

其中,N为训练集中样本的总个数,所述一个样本中包括两个代码,yj为第j个样本的标签(人工设置,若一个样本中两个代码为相似代码也即克隆代码则标签1,否则标签0),Sj为第j个样本中两个代码之间的相似度(相似度的值为0~1);训练过程,通过计算并反向传播梯度,利用梯度下降来更新模型的参数,从而使减小,迭代一定的次数或者小于给定的值时结束,得到最终的克隆代码检测模型。

另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合。为了避免不必要的重复,本发明对各种可能的组合方式不再另行说明。

12页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种RISCV架构多核CPU CoSim比对方法及系统

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!