1.一种代码克隆检测方法,其特征在于,包括:
S1、构建代码数据集,所述代码数据集由源代码对及克隆标签组成;
S2、从代码数据集中获取数据,对数据中的源代码对进行解析并且生成每个源代码的抽象语法树AST和控制流程图CFG,访问AST和CFG中的所有节点,若当前访问的节点中,其节点属性中的源代码信息和行号信息在序列中,则标记该节点为Method_call节点,将Method_call节点的父母节点指向被调用函数的AST的根节点,生成M‑AST,将Method_call节点的上一个节点指向被调用函数的CFG的入口节点,然后将被调用函数的CFG的出口节点指向Method_call节点所指向的下一个节点,生成M‑CFG;
S3、从M‑AST和 M‑CFG的节点信息中生成语法特征向量和语义特征向量,然后将语法特征向量和语义特征向量融合生成特征向量 ;
S4、源代码对融合生成两个特征向量分别为 和 ,然后通过二分类神经网络完成分类预测;
S5、通过步骤S2‑S4构建代码克隆检测模型,将步骤S1中的代码克隆数据集分为训练集和测试集,通过训练集和测试集不断更新代码克隆检测模型的参数权重,直到迭代结束,得到训练好的代码克隆检测模型;
S6、将待检测的代码输入训练好的代码克隆检测模型,获得检测结果;
在步骤S2中,生成M‑AST和M‑CFG的过程如下:
S2‑1、对源代码进行解析,生成每个函数的AST和CFG;
S2‑2、解析源代码,得到每个函数的调用图,根据调用图,构造函数的调用关系序列 ;
S2‑3、访问AST和CFG中的所有节点,若当前访问的节点中,其节点属性中的源代码信息和行号信息在序列 中,则标记该节点为Method_call节点;
S2‑4、将Method_call节点的父母节点指向被调用函数的AST的根节点生成M‑AST,所述M‑AST为模块级抽象语法树,将Method_call节点的上一个节点指向被调用函数的CFG的入口节点,然后将被调用函数的CFG的出口节点指向Method_call节点所指向的下一个节点生成M‑CFG,所述M‑CFG为模块级控制流程图;
在步骤S3中获得特征向量 的过程如下:
S3‑1、对获取到的M‑AST进行先序遍历,得到M‑AST的节点信息序列 ,然后将所有的节点信息序列 输入到词向量方法中进行训练,得到词向量模型;
S3‑2、将M‑AST和M‑CFG的每个节点信息通过词向量模型转化为16维的向量,然后将转化为16维向量后的M‑AST和M‑CFG转化为图数据结构;
S3‑3、使用由多个图注意力层堆叠组成的GAT来提取转化为图数据结构后的M‑AST的语法特征,更新M‑AST的节点信息;然后通过一个由平均池化和最大值池化组成的混合池化层来聚合M‑AST的所有节点信息,以获得M‑AST的语法特征向量 ;
S3‑4、使用由多个图卷积层堆叠组成的GCN来提取转化为图数据结构后的M‑CFG的语义特征,更新M‑CFG的节点信息,然后通过平均池化层来聚合M‑CFG的所有节点信息,以获得M‑CFG的语义特征向量 ;
S3‑5、采用自适应特征融合策略,调节语法特征向量 和语义特征向量 的权重,进行融合从而得到特征向量 。
2.根据权利要求1所述的一种代码克隆检测方法,其特征在于,在步骤S3‑1中所述的词向量方法为gensim.models.Word2Vec。
3.根据权利要求1所述的一种代码克隆检测方法,其特征在于,在步骤S3‑3中,所述语法特征向量 计算公式如下:参数 表示为M‑AST上所有节点特征向量的特征矩阵, 表示最大池化函数, 表示平均池化函数。
4.根据权利要求2所述的一种代码克隆检测方法,其特征在于,在步骤S3‑4中,所述语义特征向量 计算公式如下:参数 为表示M‑CFG上所有节点特征向量的特征矩阵, 表示平均池化函数。
5.根据权利要求4所述的一种代码克隆检测方法,其特征在于,在步骤S3‑5中,所述特征向量 计算公式如下:其中 是可学习的权重参数。
6.一种计算机存储介质,其特征在于,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行权利要求1~5任意一项所述的一种代码克隆检测方法。
7.一种计算机设备,其特征在于,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行权利要求1~5任意一项所述的一种代码克隆检测方法。