一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于事件嵌入和事件依赖图的代码克隆检测方法

2022-07-02 11:14:32 来源:中国专利 TAG:


1.本发明属于代码检测技术领域,具体涉及一种基于事件嵌入和事件依赖图的代码克隆检测方法。


背景技术:

2.代码克隆(code clone)就是指代码库中存在两个或两个以上重复或者相似的源代码片段。开发人员经常会对已有的代码进行复制、粘贴等快捷操作或者进行细微的修改以便快速地完成开发任务。除此之外,现有的一些框架也能够自动地生成代码,这也加重了代码克隆现象的产生。但是代码克隆在提高开发效率的同时也会带来一定的风险,研究表明代码克隆不利于软件开发后期的维护。
3.代码克隆检测技术在软件工程领域扮演着非常重要的角色。这些代码克隆检测方法在程序理解、抄袭检测、版权保护、代码压缩、软件进化分析、代码质量分析、漏洞检测以及防范病毒等方面都发挥着重要的作用。
4.现有技术存在的问题:
5.现有技术的基于相似代码片段的检测方法没有考虑程序的动态特征,限制了检测语义相似的能力,缺乏较为准确高效的检测能力。


技术实现要素:

6.为了解决现有技术存在的没有考虑程序的动态特征,限制了检测语义相似的能力,缺乏较为准确高效的检测能力的问题,提出一种基于事件嵌入和事件依赖图的代码克隆检测方法。
7.本发明所采用的技术方案为:
8.一种基于事件嵌入和事件依赖图的代码克隆检测方法,包括如下步骤:
9.基于事件嵌入、事件依赖图以及神经网络,建立代码克隆检测模型;
10.将目标源代码输入代码克隆检测模型进行检测,得到克隆检测结果。
11.进一步地,建立代码克隆检测模型,包括如下步骤:
12.获取源代码样本集,并将源代码样本集分为训练样本集和测试样本集;
13.将训练样本集输入基于事件嵌入和事件依赖图的神经网络进行训练,建立初始的代码克隆检测模型;
14.将测试样本集输入初始的代码克隆检测模型进行优化,得到最优的代码克隆检测模型以及候选代码数据库。
15.进一步地,候选代码数据库中存储有候选代码及其对应的程序语义向量。
16.进一步地,将训练样本集输入神经网络并使用随事件反向传播算法进行训练。
17.进一步地,代码克隆检测模型包括依次连接的事件依赖分析器、事件依赖执行引擎、还原层、压缩层以及分类器。
18.进一步地,事件依赖执行引擎设置有事件转换器,事件转换器设置有事件单元。
19.进一步地,将目标源代码输入代码克隆检测模型进行检测,包括如下步骤:
20.将目标源代码输入代码克隆检测模型;
21.使用事件依赖分析器将目标源代码转化为事件依赖图;
22.使用事件依赖执行引擎获取事件依赖图的事件依赖语义矩阵;
23.使用还原层对事件依赖语义矩阵进行信息提取,得到程序语义矩阵;
24.使用压缩层对程序语义矩阵进行压缩,得到目标源代码的程序语义向量;
25.将候选源代码的程序语义向量和目标源代码的程序语义向量一同输入分类器,根据程序语义向量的余弦相似度判断候选源代码和目标源代码是否为克隆代码对,并输出对应的克隆检测结果。
26.进一步地,若候选代码数据库没有与目标源代码进行代码克隆检测的候选源代码的程序语义向量,则将候选源代码输入代码克隆检测模型,获取候选源代码的程序语义向量。
27.进一步地,使用事件依赖分析器根据目标源代码中单条程序语句内的事件依赖和多条程序语句间的事件依赖生成事件依赖图。
28.进一步地,使用事件依赖执行引擎获取事件依赖图的事件依赖语义矩阵,包括如下步骤:
29.使用事件依赖执行引擎将事件依赖图进行拆分和编排,得到排序后的事件嵌入任务;
30.获取当前的事件嵌入任务的被依赖节点和依赖节点;
31.根据当前的被依赖节点和依赖节点的依赖关系进行事件嵌入任务,得到当前的事件嵌入向量;
32.遍历所有的事件嵌入任务和对应的节点,并根据所有的事件嵌入向量生成事件依赖语义矩阵。
33.本发明的有益效果为:
34.本发明提供的代码克隆检测方法,基于事件嵌入和事件依赖图建立代码克隆检测模型,考虑程序的动态特征和事件依赖关系,提高了检测语义相似的能力,并基于程序语义向量的相似度进行判断,提高了检测的准确性和效率。
35.本发明的其他有益效果将在具体实施方式中进一步进行说明。
附图说明
36.图1是本发明中基于事件嵌入和事件依赖图的代码克隆检测方法的流程图。
37.图2是本发明中代码克隆检测模型的结构框图。
具体实施方式
38.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
39.实施例1:
40.如图1所示,本实施例提供一种基于事件嵌入和事件依赖图的代码克隆检测方法,包括如下步骤:
41.基于事件嵌入、事件依赖图以及神经网络,建立代码克隆检测模型,包括如下步骤:
42.获取源代码样本集,并将源代码样本集分为训练样本集和测试样本集;
43.将训练样本集输入基于事件嵌入和事件依赖图的神经网络并使用随事件反向传播算法进行训练,建立初始的代码克隆检测模型;
44.将测试样本集输入初始的代码克隆检测模型进行优化,得到最优的代码克隆检测模型以及候选代码数据库;
45.如图2所示,代码克隆检测模型包括依次连接的事件依赖分析器、事件依赖执行引擎、还原层、压缩层以及分类器,代码克隆检测模型的损失函数为:
[0046][0047]
式中,et(*)、conv(*)分别为事件转换器函数和压缩层的卷积层函数;g(xi)、g(xj)分别为样本xi、xj的程序嵌入向量;(xk,xm)、别为正样本对和负样本对;loss为损失函数;i、j均为指示量;
[0048]
候选代码数据库中存储有候选代码及其对应的程序语义向量;
[0049]
将目标源代码输入代码克隆检测模型进行检测,得到克隆检测结果,包括如下步骤:
[0050]
将目标源代码输入代码克隆检测模型;
[0051]
事件依赖不仅存在于单条程序语句中,还存在于多条程序语句之间,事件依赖图中的每个节点代表一个事件,从a到b的每条边代表事件b依赖于事件a,使用事件依赖分析器根据目标源代码中单条程序语句内的事件依赖和多条程序语句间的事件依赖将目标源代码转化为事件依赖图;
[0052]
使用事件依赖执行引擎获取由事件依赖图中每个节点的事件嵌入向量组成的事件依赖语义矩阵,包括如下步骤:
[0053]
使用事件依赖执行引擎将事件依赖图进行拆分和编排,得到排序后的事件嵌入任务;
[0054]
使用事件转换器获取当前的事件嵌入任务的被依赖节点和依赖节点;
[0055]
根据当前的被依赖节点和依赖节点的依赖关系进行事件嵌入任务,使用事件转换器的事件单元同时接收当前事件的被依赖节点、依赖节点以及依赖关系,保证被依赖节点先于依赖节点执行事件嵌入任务,得到当前的事件嵌入向量;
[0056]
遍历所有的事件嵌入任务和对应的节点,并根据所有的事件嵌入向量生成事件依赖语义矩阵;
[0057]
事件依赖执行引擎设置有事件转换器,事件转换器设置有事件单元;
[0058]
给定一个三元组(a,p,o),使用38个常用运算符在事件三元组(a、p、o)中扮演p的角色,用于描述两个实体a和o之间的关系,并且事件单元负责将事件(a,p,o)转换成相应的事件嵌入向量,公式为:
[0059][0060]
式中,α为事件依赖语义矩阵;ek为事件嵌入向量;vec(*)为映射函数,将不同的变量名和函数名视为不同的实体,例如,printf(a,b,c)包含四个实体printf、a、b和c,给定代码片段中的一组实体n=n1,n2,

,nd,vec函数计算每个实体在代码片段中出现的次数并进行排序,之后vec函数将不同排序的实体初始化为一个随机实体向量;concat(*)为连接函数;均为张量,负责将实体向量映射到多个高维向量空间,提高实体向量的语义表达能力;a、o均为实体;k为维度;
[0061]
事件转换器的门机制可以增强模型记住早期事件的能力,前向计算过程公式为:
[0062][0063]
式中,a
t-1
、a
t
分别为事件嵌入计算链中第t-1、t个时间步的计算结果;wr、wz分别为重置门和更新门的权重;ec为事件单元函数;r
t
、z
t
分别为重置门和更新门的输出;σ(*)为神经元函数;为事件单元的计算结果;o
t
、p
t
为当前时间步长的输入和对应的算子;
[0064]
使用还原层根据目标源代码的结构对事件依赖语义矩阵进行信息提取,得到程序语义矩阵,程序语义矩阵中每一行向量对应目标源代码中对应行的代码语义;
[0065]
使用多个卷积核和池化层组成的压缩层对程序语义矩阵进行压缩,得到目标源代码的程序语义向量,公式为:
[0066][0067]
式中,x、分别为填充前、后的程序嵌入矩阵,由于不同事件依赖图中的节点数不一致,我们需要在进行下一次计算之前填充x,维数为(bz,no,ln),其中,bz为每批训练数据中的样本数,no为每个程序嵌入矩阵中的节点数,ln为事件依赖图的每个节点向量的长度;padding(*)为填充函数;w
conv
为多个一维卷积核组成的矩阵,形状为(nk,lk),其中,nk为一维卷积核的个数,lk为每个卷积核的长度;pool(*)为在z的最后一个维度上的平均池化操作函数;q为卷积层输出的程序嵌入向量,其形状为(bz,nk);z为卷积层输出;
[0068]
将候选源代码的程序语义向量和目标源代码的程序语义向量一同输入分类器,根据程序语义向量的余弦相似度判断候选源代码和目标源代码是否为克隆代码对,若余弦相似度大于相似度阈值,则目标源代码与候选源代码是克隆代码对,否则为非克隆代码对,并输出对应的克隆检测结果;
[0069]
若候选代码数据库没有与目标源代码进行代码克隆检测的候选源代码的程序语义向量,则将候选源代码输入代码克隆检测模型,获取候选源代码的程序语义向量。
[0070]
本发明提供的代码克隆检测方法,基于事件嵌入和事件依赖图建立代码克隆检测模型,考虑程序的动态特征和事件依赖关系,提高了检测语义相似的能力,并基于程序语义向量的相似度进行判断,提高了检测的准确性和效率。
[0071]
本发明不局限于上述可选的实施方式,任何人在本发明的启示下都可得出其他各种形式的产品。上述具体实施方式不应理解成对本发明的保护范围的限制,本发明的保护范围应当以权利要求书中界定的为准,并且说明书可以用于解释权利要求书。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献