【技术实现步骤摘要】
一种代码克隆检测方法、存储介质及设备
[0001]本专利技术涉及代码克隆检测
,特别是涉及一种代码克隆检测方法、存储介质及设备。
技术介绍
[0002]在软件开发中,复制或修改现有的代码片段并将它们粘贴到代码的其他部分中是一种常见的行为,称为代码克隆(code clone)。代码克隆能够加速软件开发效率,但当原始代码存在缺陷时,克隆的代码通常也存在相同缺陷,会使得缺陷在软件系统中散播开来,增加软件维护成本。现有研究表明,20%
–
50%的大型软件系统中都包含代码克隆。因此,如何对软件系统中存在的代码克隆现象进行有效检测,成为了软件工程领域的一个重要问题,并且随着软件应用广泛应用于社会的各个生产生活领域,这个问题的重要性日趋明显。
[0003]现有研究将代码克隆根据克隆程度大致分为4类:类型1的代码克隆是指两段代码除了在空格、布局和注释方面不同外,其他部分完全相同;类型2的代码克隆是指两段代码除了变量、类型、文字和函数的名称有所不同外,其余代码片段相同;类型3的代码克隆是指在类型2的基础上,对部分语句做添加、删除、修改等操作,但仍然保持代码功能相同;类型4的代码克隆是指两段代码实现了相同功能,但是实现的方式却不同。
[0004]目前,代码克隆检测方法主要分为以下5类:基于文本的检测方法、基于词法的检测方法、基于语法的检测方法、基于语义的检测方法和基于度量值的检测方法。类型1、类型2、类型3的代码克隆可以被许多现有方法很好的检测到,但这些方法对类型4的克隆检测上往往效果不佳,此外, ...
【技术保护点】
【技术特征摘要】
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的节点信息;然后通过一个由平均池化和最大值池化组成...
【专利技术属性】
技术研发人员:苏庆,列志毅,黄剑锋,林志毅,
申请(专利权)人:广东工业大学,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。