一种代码克隆检测方法、存储介质及设备技术

技术编号:38032783 阅读:8 留言:0更新日期:2023-06-30 10:59
本发明专利技术涉及代码克隆检测技术领域,公开了一种代码克隆检测方法、存储介质及设备,通过同时提取M

【技术实现步骤摘要】
一种代码克隆检测方法、存储介质及设备


[0001]本专利技术涉及代码克隆检测
,特别是涉及一种代码克隆检测方法、存储介质及设备。

技术介绍

[0002]在软件开发中,复制或修改现有的代码片段并将它们粘贴到代码的其他部分中是一种常见的行为,称为代码克隆(code clone)。代码克隆能够加速软件开发效率,但当原始代码存在缺陷时,克隆的代码通常也存在相同缺陷,会使得缺陷在软件系统中散播开来,增加软件维护成本。现有研究表明,20%

50%的大型软件系统中都包含代码克隆。因此,如何对软件系统中存在的代码克隆现象进行有效检测,成为了软件工程领域的一个重要问题,并且随着软件应用广泛应用于社会的各个生产生活领域,这个问题的重要性日趋明显。
[0003]现有研究将代码克隆根据克隆程度大致分为4类:类型1的代码克隆是指两段代码除了在空格、布局和注释方面不同外,其他部分完全相同;类型2的代码克隆是指两段代码除了变量、类型、文字和函数的名称有所不同外,其余代码片段相同;类型3的代码克隆是指在类型2的基础上,对部分语句做添加、删除、修改等操作,但仍然保持代码功能相同;类型4的代码克隆是指两段代码实现了相同功能,但是实现的方式却不同。
[0004]目前,代码克隆检测方法主要分为以下5类:基于文本的检测方法、基于词法的检测方法、基于语法的检测方法、基于语义的检测方法和基于度量值的检测方法。类型1、类型2、类型3的代码克隆可以被许多现有方法很好的检测到,但这些方法对类型4的克隆检测上往往效果不佳,此外,基于语义的检测方法虽然可以检测到类型4的克隆,但对其它类型的克隆检测不能达到同样好的效果。这是由于现有方法往往只使用单一的语法或语义信息,没有同时充分利用代码的语法信息和语义信息。
[0005]现有技术公开了一种基于GAT图神经网络模型的代码克隆检测方法,包括以下步骤:根据克隆代码的定义,从编程竞赛网站和现有代码克隆数据集提取生成相应定义的克隆代码数据;解析代码文本生成AST抽象语法树;在AST抽象语法树的基础上增加人工定义的附加边生成表示图;将代码表示图输入GAT网络模型训练获得图表征向量;拼接克隆代码对的表征向量输入二分类网络;判别输出代码克隆预测结果,该现有技术只使用基于AST语法特征信息的克隆检测方法,对于某些实现相同功能的不同代码片段,其AST结构可能并不相同,对其提取的结构信息差异较大,存在通用性不高的问题,容易导致克隆检测失效。

技术实现思路

[0006]本专利技术的目的是:提供一种代码克隆检测方法、存储介质及设备,以解决现有技术存在的只使用单一的语法或语义信息,通用性不强,容易导致克隆检测失效的问题。
[0007]为了实现上述目的,本专利技术提供了一种代码克隆检测方法,包括:
[0008]S1、构建代码数据集,所述代码数据集由源代码对及克隆标签组成;
[0009]S2、从代码数据集中获取数据,对数据中的源代码对进行解析并且生成每个源代
码的AST和CFG,访问AST和CFG中的所有节点,若当前访问的节点中,其节点属性中的源代码信息和行号信息在序列中,则标记该节点为Method_call节点,将Method_call节点的父母节点指向被调用函数的AST的根节点,生成M

AST,将Method_call节点的上一个节点指向被调用函数的CFG的入口节点,然后将被调用函数的CFG的出口节点指向Method_call节点所指向的下一个节点,生成M

CFG;
[0010]S3、从M

AST和M

CFG的节点信息中生成语法特征向量和语义特征向量,然后将语法特征向量和语义特征向量融合生成特征向量h;
[0011]S4、源代码对融合生成两个特征向量分别为h1和h2,然后通过二分类神经网络完成分类预测;
[0012]S5、通过步骤S2

S4构建代码克隆检测模型,将步骤S1中的代码克隆数据集分为训练集和测试集,通过训练集和测试集不断更新代码克隆检测模型的参数权重,直到迭代结束,得到训练好的代码克隆检测模型;
[0013]S6、将待检测的代码输入训练好的代码克隆检测模型,获得检测结果。
[0014]优选的,在步骤S2中,生成M

AST和M

CFG的过程如下:
[0015]S2

1、对源代码进行解析,生成每个函数的AST和CFG;
[0016]S2

2、解析源代码,得到每个函数的调用图,根据调用图,构造函数的调用关系序列Q1;
[0017]S2

3、访问AST和CFG中的所有节点,若当前访问的节点中,其节点属性中的源代码信息和行号信息在序列Q1中,则标记该节点为Method_call节点;
[0018]S2

4、将Method_call节点的父母节点指向被调用函数的AST的根节点生成M

AST,所述M

AST为模块级抽象语法树,将Method_call节点的上一个节点指向被调用函数的CFG的入口节点,然后将被调用函数的CFG的出口节点指向Method_call节点所指向的下一个节点生成M

CFG,所述M

CFG为模块级控制流程图。
[0019]优选的,在步骤S3中获得特征向量h的过程如下:
[0020]S3

1、对获取到的M

AST进行先序遍历,得到M

AST的节点信息序列Q2,然后将所有的节点信息序列Q2输入到词向量方法中进行训练,得到词向量模型;
[0021]S3

2、将M

AST和M

CFG的每个节点信息通过词向量模型转化为16维的向量,然后将转化为16维向量后的M

AST和M

CFG转化为图数据结构;
[0022]S3

3、使用由多个图注意力层堆叠组成的GAT来提取转化为图数据结构后的M

AST的语法特征,更新M

AST的节点信息;然后通过由平均池化和最大值池化组成的混合池化层来聚合M

AST的所有节点信息,以获得M

AST的语法特征向量h
g1

[0023]S3

4、使用由多个图卷积层堆叠组成的GCN来提取转化为图数据结构后的M

CFG的语义特征,更新M

CFG的节点信息,然后通过平均池化层来聚合M

CFG的所有节点信息,以获得M

CFG的语义特征向量h
g2

[0024]S3
‑本文档来自技高网
...

【技术保护点】

【技术特征摘要】
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的节点信息中生成语法特征向量和语义特征向量,然后将语法特征向量和语义特征向量融合生成特征向量h;S4、源代码对融合生成两个特征向量分别为h1和h2,然后通过二分类神经网络完成分类预测;S5、通过步骤S2

S4构建代码克隆检测模型,将步骤S1中的代码克隆数据集分为训练集和测试集,通过训练集和测试集不断更新代码克隆检测模型的参数权重,直到迭代结束,得到训练好的代码克隆检测模型;S6、将待检测的代码输入训练好的代码克隆检测模型,获得检测结果。2.根据权利要求1所述的一种代码克隆检测方法,其特征在于,在步骤S2中,生成M

AST和M

CFG的过程如下:S2

1、对源代码进行解析,生成每个函数的AST和CFG;S2

2、解析源代码,得到每个函数的调用图,根据调用图,构造函数的调用关系序列Q1;S2

3、访问AST和CFG中的所有节点,若当前访问的节点中,其节点属性中的源代码信息和行号信息在序列Q1中,则标记该节点为Method_call节点;S2

4、将Method_call节点的父母节点指向被调用函数的AST的根节点生成M

AST,所述M

AST为模块级抽象语法树,将Method_call节点的上一个节点指向被调用函数的CFG的入口节点,然后将被调用函数的CFG的出口节点指向Method_call节点所指向的下一个节点生成M

CFG,所述M

CFG为模块级控制流程图。3.根据权利要求1所述的一种代码克隆检测方法,其特征在于,在步骤S3中获得特征向量h的过程如下:S3

1、对获取到的M

AST进行先序遍历,得到M

AST的节点信息序列Q2,然后将所有的节点信息序列Q2输入到词向量方法中进行训练,得到词向量模型;S3

2、将M

AST和M

CFG的每个节点信息通过词向量模型转化为16维的向量,然后将转化为16维向量后的M

AST和M

CFG转化为图数据结构;S3

3、使用由多个图注意力层堆叠组成的GAT来提取转化为图数据结构后的M

AST的语法特征,更新M

AST的节点信息;然后通过一个由平均池化和最大值池化组成...

【专利技术属性】
技术研发人员:苏庆列志毅黄剑锋林志毅
申请(专利权)人:广东工业大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1