当前位置: 首页 > 专利查询>海南大学专利>正文

一种基于事件嵌入树及GAT网络的代码克隆检测方法和装置制造方法及图纸

技术编号:25345702 阅读:35 留言:0更新日期:2020-08-21 17:04
本发明专利技术涉及一种基于事件嵌入树及GAT网络的代码克隆检测方法和装置。本发明专利技术的基于事件嵌入树及GAT网络的代码克隆检测方法将源代码转换为其对应的流程图,并使用自定义的IR中间表示文本对该流程图进行描述;通过事件嵌入层(Event Embeddinhg)对IR中每一个节点的语句进行事件嵌入计算,得到节点向量矩阵(Node Vector Matrix);通过GAT图注意力网络对节点向量矩阵每一节点的事件嵌入向量进行调整融合,使其感知上下文节点的事件嵌入语义,得到节点上下文矩阵(Node Context Vector Matrix);使用卷积层对节点上下文矩阵中每个节点进行卷积计算,从而提取该程序流程图最终的向量表示;使用该向量表示通过分类器(classifier)判断两个代码片段是否为克隆代码对。

【技术实现步骤摘要】
一种基于事件嵌入树及GAT网络的代码克隆检测方法和装置
本专利技术涉及软件代码分析
,特别是涉及一种基于事件嵌入树及GAT网络的代码克隆检测方法和装置。
技术介绍
如果一个软件的源程序中的一个代码段和同一程序中另一个代码段在结构或语义上类似,这些代码段便成了代码克隆,代码克隆的存在增加了软件维护的困难,如果对源程序中进行修改的部分有克隆的代码段,这些克隆代码段也常常需要修改。代码克隆检测在软件工程任务中通常发挥重要作用。例如,在程序理解,抄袭检测,版权保护,代码压缩,软件演化分析,代码质量分析,bug检测和病毒检测的场景中,可能需要分辨出具有文本相似性,句法相似性或语义相似性的代码块,这时边需要进行代码克隆检测。传统的代码克隆检测方法,核心思想在于通过人为定义,提取代码片段中的某一类别的信息,之后通过这类信息的来进行代码克隆的判断,但这一代码克隆的检测方法的检测不够全面,也不够准确。
技术实现思路
基于此,本专利技术的目的在于,提供一种基于事件嵌入树及GAT网络的代码克隆检测方法和装置,通过对每个语句的执行语义以及各个语句之间的执行上下文语义进行建模,所得到的克隆代码判断结果更加全面和准确。第一方面,本申请实施例提供了一种基于事件嵌入树及GAT网络的代码克隆检测方法,包括如下步骤:针对每个代码片段,将该代码片段转换为程序流程图,所述程序流程图为包含控制流和数据流的中间表达形式;将所述程序流程图输入事件嵌入层,对所述程序流程图中每个节点的语句进行事件嵌入计算,得到节点向量矩阵,其中,所述节点向量矩阵中的第i行表示所述程序流程图第i个节点的嵌入结果;将所述节点向量矩阵输入图注意力网络层,使每个节点向量学习其上下文临近节点的特征,得到节点上下文向量矩阵;将所述节点上下文向量矩阵输入卷积网络层,对所述节点上下文向量矩阵进行特征提取,得到该代码片段的特征向量;将待检测的一组特征向量输入至分类器中,得到该组特征向量所对应的不同代码片段的克隆检测结果。可选的,将所述程序流程图输入事件嵌入层,对所述程序流程图中每个节点的语句进行时间嵌入计算,得到节点向量矩阵,包括:针对该代码片段中的单一事件,将该单一事件输入至第一事件嵌入层,其中,所述第一事件嵌入层的计算公式如下:a=concat(e1,e2,…,ek)o=Dense(a)其中,ek为每个所述单一事件的向量表示,a为所有单一事件向量表示的连接,o为所述第一事件嵌入层的输出;Tp1,Tp2为针对指定运算符的两个张量,用于将该运算符对应的两个实体的向量表示映射到多个高维向量空间;Vec函数用于将输入的实体转换为实体的向量表示;Dense函数为全连接层。可选的,所述Vec函数将出现次数最多的k个实体映射为k个不同的向量,并将剩余n-k个实体映射为一个相同的向量;或者,所述Vec函数将每个实体转换为其对应的实体类型后,根据所述实体类型将每个实体映射为不同的向量。可选的,将所述程序流程图输入事件嵌入层,对所述程序流程图中每个节点的语句进行时间嵌入计算,得到节点向量矩阵,包括:针对该代码片段中的多层嵌套事件,将该多层嵌套输入至第二事件嵌入层,其中,所述第二事件嵌入层的计算公式如下:rt=σ(Wr·[At-1,Ot])zt=σ(Wz·[At-1,Ot])其中,rt为重置门,zt为更新门,Wr为重置门参数,Wz为更新门参数,At-1为原始事件或中间事件,所述第一事件嵌入层,Ec为第一事件嵌入层参数,At为中间事件嵌入或最终嵌入,Pt为该操作对应的运算符。可选的,所述分类器为余弦相似度分类模型。可选的,所述卷积网络模块包括一维卷积层,用于将所述节点上下文向量矩阵压缩为一维向量。可选的,所述事件嵌入层、所述图注意力网络层和所述卷积网络层的训练过程包括:根据如下损失函数,训练所述事件嵌入层、所述图注意力网络层和所述卷积网络层:g(xi)=Conv(GAT(Et(xi)))Loss=max(1-distance(x1,x2′)+distance(x1,x2))其中,g(xi)样本的输出,为x1和x2为正样本,x1和x2为负样本,Et为第二事件嵌入层,GAT为图卷积注意力层,Conv为卷积网络层,distance为计算两个样本相似度的函数,Loss根据样本计算的损失。可选的,所述第二事件嵌入层的反向传播公式为:其中,Et为第t步时的误差,N为某一运算符出现在嵌入链中的位置,Wo为所述第一事件嵌入层中属于该运算符的参数,Ak为第k个实体的嵌入。第二方面,本申请实施例提供了一种基于事件嵌入树及GAT网络的代码克隆检测装置,所述装置包括:程序流程图转换模块,用于针对每个代码片段,将该代码片段转换为程序流程图,所述程序流程图为包含控制流和数据流的中间表达形式;事件嵌入模块,用于将所述程序流程图输入事件嵌入层,对所述程序流程图中每个节点的语句进行事件嵌入计算,得到节点向量矩阵,其中,所述节点向量矩阵中的第i行表示所述程序流程图第i个节点的嵌入结果;图注意力网络层模块,用于将所述节点向量矩阵输入图注意力网络层,使每个节点向量学习其上下文临近节点的特征,得到节点上下文向量矩阵;卷积模块,用于将所述节点上下文向量矩阵输入卷积网络层,对所述节点上下文向量矩阵进行特征提取,得到该代码片段的特征向量;分类模块,用于将待检测的一组特征向量输入至分类器中,得到该组特征向量所对应的不同代码片段的克隆检测结果。第三方面,本申请实施例提供了一种电子设备,包括:存储器以及处理器;所述存储器,用于存储一个或多个程序;当所述一个或多个程序被所述处理器执行,使得所述处理器实现如本申请实施例第一方面所述的基于事件嵌入树及GAT网络的代码克隆检测方法。在本申请实施例中,将每段代码片段转换为描述了程序流程图的结构和内容的中间表达形式后,对该中间表达形式进行时间嵌入计算,得到包括时间嵌入语义的每个向量所组成的节点向量矩阵,通过图注意力网络层得到的能反应每个节点向量以及其上下文节点特征的节点上下文矩阵,并对所述节点上下文矩阵进行特征提取后,通过所提取的特征识别不同的代码片段是否为克隆样本对,相比于现有技术,本申请通过对每个语句的执行语义以及各个语句之间的执行上下文语义进行建模,所得到的克隆代码判断结果更加全面和准确。为了更好地理解和实施,下面结合附图详细说明本专利技术。附图说明图1为本申请一个实施例中的一种基于事件嵌入树及GAT网络的代码克隆检测方法流程图;图2为本申请一个实施例中的第二事件嵌入层(EventTransformer)的模型结构示意图;图3为本申请一个实施例中基于事件嵌入树及GAT网络的代码克隆检测方法所采用的模型结构和方法流程示意图;本文档来自技高网...

【技术保护点】
1.一种基于事件嵌入树及GAT网络的代码克隆检测方法,其特征在于,包括如下步骤:/n针对每个代码片段,将该代码片段转换为程序流程图,所述程序流程图为包含控制流和数据流的中间表达形式;/n将所述程序流程图输入事件嵌入层,对所述程序流程图中每个节点的语句进行事件嵌入计算,得到节点向量矩阵,其中,所述节点向量矩阵中的第i行表示所述程序流程图第i个节点的嵌入结果;/n将所述节点向量矩阵输入图注意力网络层,使每个节点向量学习其上下文临近节点的特征,得到节点上下文向量矩阵;/n将所述节点上下文向量矩阵输入卷积网络层,对所述节点上下文向量矩阵进行特征提取,得到该代码片段的特征向量;/n将待检测的一组特征向量输入至分类器中,得到该组特征向量所对应的不同代码片段的克隆检测结果。/n

【技术特征摘要】
1.一种基于事件嵌入树及GAT网络的代码克隆检测方法,其特征在于,包括如下步骤:
针对每个代码片段,将该代码片段转换为程序流程图,所述程序流程图为包含控制流和数据流的中间表达形式;
将所述程序流程图输入事件嵌入层,对所述程序流程图中每个节点的语句进行事件嵌入计算,得到节点向量矩阵,其中,所述节点向量矩阵中的第i行表示所述程序流程图第i个节点的嵌入结果;
将所述节点向量矩阵输入图注意力网络层,使每个节点向量学习其上下文临近节点的特征,得到节点上下文向量矩阵;
将所述节点上下文向量矩阵输入卷积网络层,对所述节点上下文向量矩阵进行特征提取,得到该代码片段的特征向量;
将待检测的一组特征向量输入至分类器中,得到该组特征向量所对应的不同代码片段的克隆检测结果。


2.根据权利要求1所述的一种基于事件嵌入树及GAT网络的代码克隆检测方法,其特征在于,将所述程序流程图输入事件嵌入层,对所述程序流程图中每个节点的语句进行时间嵌入计算,得到节点向量矩阵,包括:
针对该代码片段中的单一事件,将该单一事件输入至第一事件嵌入层,其中,所述第一事件嵌入层的计算公式如下:



a=concat(e1,e2,…,ek)
o=Dense(a)
其中,ek为每个所述单一事件的向量表示,a为所有单一事件向量表示的连接,o为所述第一事件嵌入层的输出;Tp1,Tp2为针对指定运算符的两个张量,用于将该运算符对应的两个实体的向量表示映射到多个高维向量空间;Vec函数用于将输入的实体转换为实体的向量表示;Dense函数为全连接层。


3.根据权利要求2所述的一种基于事件嵌入树及GAT网络的代码克隆检测方法,其特征在于:
所述Vec函数将出现次数最多的k个实体映射为k个不同的向量,并将剩余n-k个实体映射为一个相同的向量;
或者,
所述Vec函数将每个实体转换为其对应的实体类型后,根据所述实体类型将每个实体映射为不同的向量。


4.根据权利要求2所述的一种基于事件嵌入树及GAT网络的代码克隆检测方法,其特征在于,将所述程序流程图输入事件嵌入层,对所述程序流程图中每个节点的语句进行时间嵌入计算,得到节点向量矩阵,包括:
针对该代码片段中的多层嵌套事件,将该多层嵌套输入至第二事件嵌入层,其中,所述第二事件嵌入层的计算公式如下:
rt=σ(Wr·[At-1,Ot])
zt=σ(Wz·[At-1,Ot])






其中,rt为重置门,zt为更新门,Wr为重置门参数,Wz为更新门参数,At-1为原始事件或中间事件,所述第一事件嵌入层,Ec为第一事件嵌入层参数,At为中间事件嵌入或最终嵌入,Pt为该...

【专利技术属性】
技术研发人员:李秉卓叶春杨管守扬周辉
申请(专利权)人:海南大学
类型:发明
国别省市:海南;46

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

1