CN116225526A - 一种基于图表示学习的代码克隆检测方法 - Google Patents

一种基于图表示学习的代码克隆检测方法 Download PDF

Info

Publication number
CN116225526A
CN116225526A CN202211605460.8A CN202211605460A CN116225526A CN 116225526 A CN116225526 A CN 116225526A CN 202211605460 A CN202211605460 A CN 202211605460A CN 116225526 A CN116225526 A CN 116225526A
Authority
CN
China
Prior art keywords
graph
code
network
edge
encoder
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202211605460.8A
Other languages
English (en)
Inventor
俞东进
杨全鑫
陈信
陈洁
徐忆航
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hangzhou Bindian Information Technology Co ltd
Hangzhou Dianzi University
Original Assignee
Hangzhou Bindian Information Technology Co ltd
Hangzhou Dianzi University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hangzhou Bindian Information Technology Co ltd, Hangzhou Dianzi University filed Critical Hangzhou Bindian Information Technology Co ltd
Priority to CN202211605460.8A priority Critical patent/CN116225526A/zh
Publication of CN116225526A publication Critical patent/CN116225526A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • G06F8/751Code clone detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Artificial Intelligence (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Biophysics (AREA)
  • Computational Linguistics (AREA)
  • Data Mining & Analysis (AREA)
  • Evolutionary Computation (AREA)
  • General Health & Medical Sciences (AREA)
  • Molecular Biology (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Abstract

本发明提供一种基于图表示学习的代码克隆检测方法。本发明针对代码语义克隆,即Type‑IV克隆,设计了一种基于图的代码克隆检测模型,该模型结合了图注意力网络GAT和边收缩池化EdgePool,同时,本发明构造出一种并行节点内部注意力机制PNIAT,将源代码中解析出的控制流图CFG或程序依赖图PDG转换为标准的图神经网络GNN输入数据,然后将其输入由图注意力网络GAT和边收缩池化EdgePool构建的图神经网络中,输出对应的图嵌入表示,最后采用基于双向长短期记忆网络BiLSTM构建的解码器将成对的图嵌入表示并行解码,得到代码克隆检测的批量检测结果。

Description

一种基于图表示学习的代码克隆检测方法
技术领域
本发明涉及一种基于图表示学习的代码克隆检测方法,属于软件工程中的代码克隆检测技术领域。
背景技术
代码克隆检测是软件工程领域的一项基础任务,尽管基于各种代码表示的大量算法被提出来,但是现存的大多数方法的代码表示没有将代码的语义和结构信息充分表达出来,只是利用了其中的部分有用信息。
代码克隆是指存在于代码库中两个及两个以上相同或者相似的源代码片段,是软件开发中的常见现象。代码克隆能够提高开发效率,但也可能意外引入外部漏洞,降低软件稳定性,造成代码库冗余和软件缺陷传播等。一旦代码需要修改,所有相关的克隆片段必须得到统一的修改。但是,随着应用程序规模的不断扩大,代码克隆的普及性也随之增长,使得维护成本越来越高,因此,亟待寻找到可以精确高效检测代码克隆的自动化方法。
代码克隆的类型主要分为两大类,句法克隆和语义克隆。句法克隆指文本相似的代码片段,语义克隆则是指功能相似的代码片段。基于这两大类,代码克隆可以被进一步划分为四小类。Type-1:两个完全相同的代码段,除了空格、空格和注释。Type-2:除了变量名、类型名、文字名和函数名之外,其他代码段相同。Type-3:除了添加或删除的几个语句之外,其他代码段相同。Type-4:两个相同功能但具有不同代码结构或语法的异构代码段。其中前三种为句法克隆,第四种为语义克隆。当前,工业界和学术界对句法克隆的检测已相当成熟,而语义克隆检测技术尚未达到工业要求。
随着深度学习算法的进步和计算设备算力的增加,代码表示方式逐渐从文本、词汇向语法、语义发展,相应的代码克隆检测模型也有从基于序列向基于树和基于图发展的趋势。其中基于语法和语义的代码表示相比于文本和词汇对源代码的信息利用程度更高,因此其检测结果也一般更加精确。抽象语法树、控制流图和程序依赖图是基于语法和语义的代码表示中经常被用到的,本发明将利用控制流图和程序依赖图来设计一种基于图表示学习的代码克隆检测方法。
发明内容
本发明目的在于发明一种通过学习代码片段的控制流图或程序依赖图的语义信息来检测代码克隆的方法,并达到并行检测代码语义克隆的效果。
本发明提供一种基于图表示学习的代码克隆检测方法,包括以下步骤:
S1获取代码片段的语义信息,所述语义信息是通过代码解析工具从代码片段中提取出包含代码语义的代码表示;
S2对所述语义信息进行词向量化,得到向量化后的语义表示;
S3将所述语义表示输入并行节点内部注意力机制层,得到标准的图神经网络的输入数据;
S4将所述标准的图神经网络的输入数据输入由图注意力网络和边收缩池化构成的孪生图神经网络编码器中,得到代码片段的图嵌入表示;
S5将所述代码片段的图嵌入表示成对输入基于双向长短期记忆网络的解码器中进行解码,得到代码克隆检测结果;
S6将所述孪生图神经网络编码器和基于双向长短期记忆网络的解码器共同组成孪生图匹配网络模型,通过构造损失函数并对孪生图匹配网络模型进行训练,得到训练好的孪生图匹配网络模型;
S7将所述训练好的孪生图匹配网络模型拆分为解码器和编码器,所述编码器用于为代码片段生成图向量表示,所述解码器用于并行检测代码克隆;向所述编码器中输入待检测的代码,所述解码器输出代码克隆的检测结果。
作为优选,所述S1中,包含代码语义的所述代码表示,是通过将源代码预处理为代码图的方式得到的,所述代码图包括代码片段的控制流图或程序依赖图;
所述S2中,所述词向量化包括以下步骤:
将控制流图或程序依赖图的所有节点和边的文本用词向量代替,得到节点和边的词向量表示;
将节点和边的所述词向量表示保存在JSON格式文件中,所述JSON格式文件的内容包括:节点特征、边表和边特征,
所述节点特征包含一个完整的代码语句的词向量,所述边表包括控制流图或程序依赖图中的所有有向边,所述边特征则是由表示边属性的单个词向量来表示,所述边属性包括控制流边属性和数据流边属性,所述控制流边属性的值包括代表条件判断语句中条件为真时的“True”、代表条件判断语句中条件为假时的“False”和代表语句跳转的“Jump”;所述数据流边属性的值包括代码中的变量名。
作为优选,所述S3中,将所述控制流图或程序依赖图中不同尺寸的节点特征通过零向量进行填充,得到统一尺寸的节点特征;
使用所述并行节点内部注意力机制层对填充后的所述节点特征进行并行注意力计算,获得所述节点中的关键信息以提取更精确的代码语义。
作为优选,所述S4中,所述标准的图神经网络的输入数据包含节点特征、边表和边特征,所述节点特征和所述边特征均由一个词向量表示,所述边表包含控制流图或程序依赖图的所有有向边;
所述孪生图神经网络编码器包括两个结构一致,参数共享的编码器,每个所述编码器由两个图注意力网络层组成,其中第一个图注意力网络层为16头注意力机制,第二个图注意力网络层为单头注意力机制,并在所述图注意力网络层的计算公式中考虑了有向边的特征;每个所述图注意力网络层后接一个边收缩池化层,同样,在进行边收缩池化的时候考虑了有向边的特征;
得到所述代码片段的图嵌入表示的过程,包括:使用全局注意力池化作为所述孪生图神经网络编码器的读出操作,将三次读出结果进行融合,输出代码片段的图嵌入表示。
作为优选,所述S5中,所述基于双向长短期记忆网络构成的解码器由两层基于双向长短期记忆网络层和一个全连接层构成,所述双向长短期记忆网络由一个前向长短期记忆网络和一个反向长短期记忆网络堆叠而成,将所述前向长短期记忆网络末端的隐藏层状态和所述反向前向长短期记忆网络末端的隐藏层状态的特征融合后输入所述全连接层,输出代码克隆检测的结果用于根据输入的代码图嵌入对来输出代码克隆检测的结果。
作为优选,所述S6中,所述损失函数为优化后的交叉墒损失函数;所述训练的过程包括:获取软件代码数据集,所述软件代码数据集中,方法克隆对和方法非克隆对的数量大于源代码中方法的数量,对所述软件代码数据集中的软件代码进行所述预处理,以避免重复计算,经过所述预处理的所述软件代码保存在JSON格式的文件中作为输入数据,训练时,将所述预处理过程生成的所有JSON文件以字典格式读入到内存中,然后根据训练集中方法克隆对和方法非克隆对所对应的JSON文件编号从内存中读取训练数据。
作为优选,所述S7中,待检测的所述代码为经过所述预处理后的以JSON格式保存的文件,将以JSON格式保存的所述文件以字典格式加载到内存中作为编码器的输入;
所述编码器输出与编码器的所述输入一一对应的图嵌入表示,以字典的格式保存在内存中;所述并行检测包括:将所述图嵌入表示两两组合成对后并行输入所述基于双向长短期记忆网络构成的解码器中进行代码克隆并行检测,得到代码克隆检测的批量检测结果。
本发明的有益效果:
1、相对于现有技术,本发明提供的代码图表示学习模型更有效,它考虑的代码图的语义信息更全面,因此,得到的代码图嵌入表示更精确;
2、相对于现有技术,本发明提供的代码图表示学习模型可以捕获代码图中的各种关键信息,例如,并行节点内部注意力机制可以捕获代码图节点中的关键信息,图注意力网络和边收缩池化分别捕获代码图中的重要节点和边;
3、相对于现有技术,本发明提供的代码克隆检测方法检测速度更快,它将模型拆分为两个独立的功能模块,编码器和解码器,使得克隆检测可以并行执行,极大地提高了检测效率。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单介绍,后文将参照附图以示例性而非限制性的方式详细描述本发明的一些具体实施例。附图中相同的附图标记标示了相同或类似的部件或部分。本领域技术人员应该理解,这些附图未必是按比例绘制的。附图中:
图1为本发明实施例所提供的基于图表示学习的代码克隆检测方法流程图。
图2为本发明实施例所提供的基于图注意力网络、边收缩池化和双向长短期记忆网络设计的孪生图匹配网络。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅用以解释本申请,并不用于限定本申请。
为了更好的理解本发明的技术方案,下面结合附图对本发明实施例进行详细描述。应当明确,所描述的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
本发明提供了一种基于图表示学习的代码克隆检测方法,设计了一个并行节点内多头注意力机制,并结合图注意力网络、边收缩池化和双向长短期记忆网络设计了一个孪生图匹配网络模型,通过学习代码的图结构表示,控制流图或程序依赖图,获得代码语义信息用于检测代码语义克隆。本发明首先获取代码片段的语义信息,通过代码解析工具从代码片段中提取出包含代码语义的代码表示,然后,对代码表示进行词向量化,得到向量化后的语义表示,之后,将向量化后的语义表示输入并行节点内部注意力机制层,得到标准的图神经网络的输入数据,接着,将标准的图神经网络的输入数据输入由图注意力网络和边收缩池化构成的孪生图神经网络编码器中,得到代码片段的图嵌入表示,最后,将代码片段的图嵌入表示成对输入基于双向长短期记忆网络构成的解码器中进行解码,得到代码克隆检测结果。此外,本发明中的孪生图神经网络编码器和基于双向长短期记忆网络构成的解码器共同组成孪生图匹配网络,通过构造损失函数和进行训练得到训练好的模型,在检测克隆时将训练好的模型拆分为解码器和编码器,其中解码器用于统一为代码片段生成图向量表示,解码器用于并行检测代码克隆。
本发明所提供方案的过程为:1)获取代码片段的语义信息,通过代码解析工具从代码片段中提取出包含代码语义的代码表示,即控制流图或程序依赖图;2)对代码表示进行词向量化,得到向量化后的代码表示;3)将节点和边的向量表示组成的代码控制流图或程序依赖图信息保存在JSON格式的文件中,作为模型的输入数据;4)将向量化后的语义表示输入并行节点内部注意力机制层,得到标准的图神经网络的输入数据;5)将标准的图神经网络的输入数据输入由图注意力网络和边收缩池化构成的孪生图神经网络编码器中,得到代码片段的图嵌入表示;6)将代码片段的图嵌入表示成对输入基于双向长短期记忆网络构成的解码器中进行解码,得到代码克隆检测结果;7)模型训练,孪生图神经网络编码器和基于双向长短期记忆网络构成的解码器共同组成孪生图匹配网络,通过构造损失函数和进行训练得到训练好的模型;8)并行检测,将训练好的模型拆分为解码器和编码器,其中解码器用于统一为代码片段生成图向量表示,解码器用于并行检测代码克隆。
以下,对本申请实施例中涉及的名词进行简要介绍:
抽象语法树(Abstract Syntax Tree,AST):一种基于代码语法的树结构的代码表示,其非终端节点(内部节点)表示操作符(算术或赋值),终端节点(叶节点)表示操作数(常量或标识符)。
控制流图(Control Flow Graph,CFG):一种基于代码语义的图结构的代码表示,其节点通常表示一个完整的代码语句,控制流边指示每个语句的执行顺序。
程序依赖图(Program Dependency Graph,PDG):一种基于代码语义的图结构的代码表示,其节点通常表示一个完整的代码语句,有三种类型的边,分别指代数据依赖关系、控件依赖关系和执行依赖关系。
并行节点内部注意力机制(Parallel Node Internal multi-head AttenTion,PNIAT):一种本发明设计的模型输入端的数据预处理层,主要有两个目的:1)用于将不规则码图数据转换为规则图数据,方便使用图神经网络进行计算;2)基于注意机制,可以为节点内部的每个标记分配权重,更好地捕捉语句语义,便于使用注意可视化技术研究我们模型的合理性。
图注意力网络(Graph Attention Network,GAT):一种基于自注意力机制的图神经网络,通过堆叠网络层,获取每个节点的邻域特征,为邻域中的不同节点分配不同的权重。这样做的好处是不需要高成本的矩阵运算,也不用事先知道图结构信息。通过这种方式,图注意力网络可以解决谱图方法存在的问题,同时也能应用于归纳学习和直推学习问题。
图神经网络(Graph Neural Network,GNN):一种利用深度学习直接对图结构数据进行学习的框架,其优异的性能引起了学者高度的关注和深入的探索。通过在图中的节点和边上制定一定的策略,GNN将图结构数据转化为规范而标准的表示,并输入到多种不同的神经网络中进行训练,在节点分类、边信息传播和图聚类等任务上取得优良的效果。
边收缩池化(Edge Contraction Pooling,EdgePool):一种基于边收缩的池化机制,它能够学习一个局部、稀疏的硬池化变换,并能自然地考虑到图结构,确保不会完全删除节点,它优于其他的池化方法,可以很容易地集成到大多数图神经网络模型中,并且在节点分类和图分类方面都提高了性能。
孪生神经网络(Siamese neural network):又名双生神经网络,是基于两个人工神经网络建立的耦合构架。孪生神经网络以两个样本为输入,输出其嵌入高维度空间的表征,以比较两个样本的相似程度。狭义的孪生神经网络由两个结构相同,且权重共享的神经网络拼接而成。广义的孪生神经网络可由任意两个神经网拼接而成。孪生神经网络通常具有深度结构,可由卷积神经网络、循环神经网络等组成。
双向长短期记忆网络(Bi-directional Long Short-Term Memory,BiLSTM):由前向LSTM与后向LSTM组合而成。两者在自然语言处理任务中都常被用来建模上下文信息。
长短期记忆网络(Long Short-Term Memory,LSTM):一种时间循环神经网络,是为了解决一般的循环神经网络存在的长期依赖问题而专门设计出来的,所有的循环神经网络都具有一种重复神经网络模块的链式形式。
本发明实施例给出一种基于图表示学习的代码克隆检测方法,图1为本发明实施例所提供的检测方法的流程示意图。如图1所示,该方法包括以下步骤:
步骤101,获取代码片段的语义信息,通过代码解析工具从代码片段中提取出包含代码语义的代码表示,即控制流图或程序依赖图,将所有源代码预处理为代码图的形式。
步骤102,在实施步骤101的过程中,根据一定规则收集所有节点和边的文本信息作为训练词向量的语料库,获得源代码片段向量化后的语义表示将控制流图或程序依赖图的所有节点和边的文本用一系列词向量代替。
步骤103,为了得到更精确的代码图嵌入表示,保留充分的代码图语义信息。具体地,将节点和边的词向量表示保存在JSON格式文件中,其内容包含节点特征、边表和边特征,作为模型的输入数据,其中每个节点特征包含一个完整的代码语句的一系列词向量,边表包含了控制流图或程序依赖图中的所有有向边,边特征由表示边属性的单个词向量来表示,边属性如控制流边的含义True、False、Jump和数据流边指代的变量名。
步骤104,将向量化后的语义表示输入并行节点内部注意力机制层,得到标准的图神经网络的输入数据,并捕获代码图节点中的关键信息。具体地,首先将一个控制流图或程序依赖图中不同尺寸的节点特征使用零向量填充为统一尺寸以便于并行计算,并行节点内部注意力机制层对填充后的节点特征进行并行注意力计算,获得所有节点中的关键信息以提取更精确的代码语义。以单个节点为例,
Figure BDA0003998654300000071
其中N表示第j个节点的向量数量(即节点内的token数量),F表示向量的维度。本发明设置两个可训练参数W和
Figure BDA0003998654300000075
来构造一个简单的注意力机制ei,定义为
Figure BDA0003998654300000072
则注意力系数αi可表示为
Figure BDA0003998654300000073
为了充分提取节点特征,并将特征数量不同的节点统一输出为一个单向量,本发明设置K个独立的注意力机制,构造出PNIAT层,其输出定义为
hj=LeakyReLU(concatk=1~Ki kviWk)Wo),
其中
Figure BDA0003998654300000074
为可训练参数,将节点信息统一规范化为维度为F的单向量,hj表示第j个节点的特征向量,concat表示拼接操作,LeakyReLU表示激活函数。至此就获得了图神经网络的标准输入数据格式,作为由图注意力网络和边收缩池化构成的孪生网络的输入。标准的图神经网络的输入数据包含节点特征、边表和边特征,所述每个节点的特征和每条边的特征均由一个词向量表示,所述边表包含控制流图或程序依赖图中所有的有向边。
步骤105,将标准的图神经网络的输入数据输入由图注意力网络和边收缩池化构成的孪生图神经网络编码器中,捕获代码图中的重要节点和边信息,得到代码片段的图嵌入表示。孪生神经网络的特点是结构一致,参数共享,以便于对不同分支的输入进行统一编码,以保证模型训练的合理性和准确性。
步骤106,由图注意力网络和边收缩池化构成的孪生图神经网络编码器包括两个结构一致,参数共享的编码器,所述每个编码器由两个图注意力网络层组成,其中第一个图注意力网络层为多头注意力机制,第二图注意力网络层为一个单头注意力机制,并在所述图注意力网络层的计算过程中添加了有向边的信息。所述每个图注意力网络层后接一个边收缩池化层,同样,在进行边收缩池化的时候本考虑了有向边的特征。本发明在图注意力网络的计算过程中添加了有向边的信息,则其注意力机制定义为
Figure BDA0003998654300000081
其中
Figure BDA0003998654300000082
表示节点i的特征向量,
Figure BDA0003998654300000083
表示节点i到节点j的有向边的特征向量,W为可训练参数,则注意力系数αij可表示为
Figure BDA0003998654300000084
其中
Figure BDA0003998654300000085
Figure BDA0003998654300000086
均为可训练参数,
Figure BDA0003998654300000087
则图注意力网络层的节点信息更新公式可表示为
Figure BDA0003998654300000088
其中,
Figure BDA0003998654300000089
表示节点j的特征向量,
Figure BDA00039986543000000810
表示节点i的邻居节点的集合,σ表示激活函数,
Figure BDA00039986543000000811
代表节点信息更新后的节点i的特征向量。
为了稳定化自注意力机制的学习过程,图注意力网络采用了多头注意力机制(即K个独立的自注意力机制),并将其结果进行拼接输出,其公式为
Figure BDA00039986543000000812
其中concat表示拼接操作,即将K个独立的自注意力机制的输出拼接后作为更新后的节点特征,即
Figure BDA00039986543000000813
每个图注意力网络层后接一个边收缩池化层,同样,在进行边收缩的时候本发明考虑了有向边的特征。对于从节点i到节点j的边,其分数计算公式为
r(eij)=W·(ni||nj||fij)+b
Figure BDA0003998654300000091
其中ni表示节点i的特征向量,fij表示节点i到节点j的边的特征向量,||表示拼接操作,W和b均为可训练参数,r(eij)或rij表示计算出的初始的边的分数,sij为标准化后的节点i到节点j的边的分数。
本发明只在计算边分数的时候使用边信息,边的合并采用简单的特征求和,即两个节点合并后产生的新节点特征向量为
Figure BDA0003998654300000092
步骤107,将步骤106中各个图注意力网络层后接一个读出操作,采用全局注意力池化层进行读出操作,如图2所示,三次读出操作拼接融合后作为代码图的图嵌入表示。具体地,使用全局注意力池化层作为编码器的读出操作,将三次读出结果进行拼接融合,输出代码片段的图嵌入表示,作为编码器的输出和解码器的输入。
步骤108,将代码片段的图嵌入表示成对输入基于双向长短期记忆网络构成的解码器中进行解码,得到代码克隆检测结果。基于双向长短期记忆网络构成的解码器由两层基于双向长短期记忆网络层和一个全连接层构成,用于根据输入的代码图嵌入对来输出代码克隆检测的结果。双向长短期记忆网络可以捕捉双向的语义关系,且有利于并行检测代码克隆。
步骤109,使用全连接网络将解码器的输出用于检测代码克隆检测,接在步骤108之后,用于将代码克隆检测任务转换为一个二分类任务。
步骤110,模型输出,在模型训练阶段输出一对代码片段为克隆代码对的概率,计算出与真实值的误差进而进行反向传播以更新模型参数,在测试阶段直接输出0或1,其中0表示代码对为非克隆代码对,1表示代码对为克隆代码对。
步骤111,模型训练,孪生图神经网络编码器和基于双向长短期记忆网络构成的解码器共同组成孪生图匹配网络,通过构造损失函数和进行训练得到训练好的模型。在数据集或者在真实的软件代码中,方法克隆对和方法非克隆对的数量要远大于源代码中方法的数量,为了避免重复计算,本发明首先将所有源代码片段进行数据预处理,并保存在JSON格式的文件中作为输入数据,训练时,将数据预处理阶段生成的所有JSON文件以字典格式读入到内存中,然后根据训练集中克隆对和非克隆对所对应的JSON文件编号从内存中读取训练数据。
步骤112,并行检测,将所述训练好的模型拆分为解码器和编码器,并分配到图嵌入和并行检测两个阶段的子模型中,使用训练好的模型参数为它们按需分配。解码器用于统一为代码片段生成图向量表示,将预处理后的JSON文件以字典格式加载到内存中,将它们输入编码器中,输出与输入文件一一对应的图嵌入表示,以字典的格式保存在内存中。解码器用于并行检测代码克隆,将图嵌入表示两两组合成对后并行输入基于双向长短期记忆网络构成的解码器中进行代码克隆并行批量检测,得到代码克隆检测的批量检测结果。
以上所述,仅为本发明部分具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本领域的人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

Claims (7)

1.一种基于图表示学习的代码克隆检测方法,其特征在于,包括以下步骤:
S1获取代码片段的语义信息,所述语义信息是通过代码解析工具从代码片段中提取出包含代码语义的代码表示;
S2对所述语义信息进行词向量化,得到向量化后的语义表示;
S3将所述语义表示输入并行节点内部注意力机制层,得到标准的图神经网络的输入数据;
S4将所述标准的图神经网络的输入数据输入由图注意力网络和边收缩池化构成的孪生图神经网络编码器中,得到代码片段的图嵌入表示;
S5将所述代码片段的图嵌入表示成对输入基于双向长短期记忆网络的解码器中进行解码,得到代码克隆检测结果;
S6将所述孪生图神经网络编码器和基于双向长短期记忆网络的解码器共同组成孪生图匹配网络模型,通过构造损失函数并对孪生图匹配网络模型进行训练,得到训练好的孪生图匹配网络模型;
S7将所述训练好的孪生图匹配网络模型拆分为解码器和编码器,所述编码器用于为代码片段生成图向量表示,所述解码器用于并行检测代码克隆;向所述编码器中输入待检测的代码,所述解码器输出代码克隆的检测结果。
2.根据权利要求1所述的方法,其特征在于,
所述S1中,包含代码语义的所述代码表示,是通过将源代码预处理为代码图的方式得到的,所述代码图包括代码片段的控制流图或程序依赖图;
所述S2中,所述词向量化包括以下步骤:
将控制流图或程序依赖图的所有节点和边的文本用词向量代替,得到节点和边的词向量表示;
将节点和边的所述词向量表示保存在JSON格式文件中,所述JSON格式文件的内容包括:节点特征、边表和边特征,
所述节点特征包含一个完整的代码语句的词向量,所述边表包括控制流图或程序依赖图中的所有有向边,所述边特征则是由表示边属性的单个词向量来表示,所述边属性包括控制流边属性和数据流边属性,所述控制流边属性的值包括代表条件判断语句中条件为真时的“True”、代表条件判断语句中条件为假时的“False”和代表语句跳转的“Jump”;所述数据流边属性的值包括代码中的变量名。
3.根据权利要求2所述的方法,其特征在于,所述S3中,将所述控制流图或程序依赖图中不同尺寸的节点特征通过零向量进行填充,得到统一尺寸的节点特征;
使用所述并行节点内部注意力机制层对填充后的所述节点特征进行并行注意力计算,获得所述节点中的关键信息以提取更精确的代码语义。
4.根据权利要求3所述的方法,其特征在于,所述S4中,所述标准的图神经网络的输入数据包含节点特征、边表和边特征,所述节点特征和所述边特征均由一个词向量表示,所述边表包含控制流图或程序依赖图的所有有向边;
所述孪生图神经网络编码器包括两个结构一致,参数共享的编码器,每个所述编码器由两个图注意力网络层组成,其中第一个图注意力网络层为16头注意力机制,第二个图注意力网络层为单头注意力机制,并在所述图注意力网络层的计算公式中考虑了有向边的特征;每个所述图注意力网络层后接一个边收缩池化层,同样,在进行边收缩池化的时候考虑了有向边的特征;
得到所述代码片段的图嵌入表示的过程,包括:使用全局注意力池化作为所述孪生图神经网络编码器的读出操作,将三次读出结果进行融合,输出代码片段的图嵌入表示。
5.根据权利要求1所述的方法,其特征在于,所述S5中,所述基于双向长短期记忆网络构成的解码器由两层基于双向长短期记忆网络层和一个全连接层构成,所述双向长短期记忆网络由一个前向长短期记忆网络和一个反向长短期记忆网络堆叠而成,将所述前向长短期记忆网络末端的隐藏层状态和所述反向前向长短期记忆网络末端的隐藏层状态的特征融合后输入所述全连接层,输出代码克隆检测的结果。
6.根据权利要求2所述的方法,其特征在于,所述S6中,所述损失函数为优化后的交叉墒损失函数;
所述训练的过程包括:获取软件代码数据集,所述软件代码数据集中,方法克隆对和方法非克隆对的数量大于源代码中方法的数量,对所述软件代码数据集中的软件代码进行所述预处理,以避免重复计算,经过所述预处理的所述软件代码保存在JSON格式的文件中作为输入数据,训练时,将所述预处理过程生成的所有JSON文件以字典格式读入到内存中,然后根据训练集中方法克隆对和方法非克隆对所对应的JSON文件编号从内存中读取训练数据。
7.根据权利要求2所述的方法,其特征在于,所述S7中,待检测的所述代码为经过所述预处理后的以JSON格式保存的文件,将以JSON格式保存的所述文件以字典格式加载到内存中作为编码器的输入;
所述编码器输出与编码器的所述输入一一对应的图嵌入表示,以字典的格式保存在内存中;所述并行检测包括:,将所述图嵌入表示两两组合成对后并行输入所述基于双向长短期记忆网络构成的解码器中进行代码克隆并行批量检测,得到代码克隆检测的批量检测结果。
CN202211605460.8A 2022-12-14 2022-12-14 一种基于图表示学习的代码克隆检测方法 Pending CN116225526A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211605460.8A CN116225526A (zh) 2022-12-14 2022-12-14 一种基于图表示学习的代码克隆检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211605460.8A CN116225526A (zh) 2022-12-14 2022-12-14 一种基于图表示学习的代码克隆检测方法

Publications (1)

Publication Number Publication Date
CN116225526A true CN116225526A (zh) 2023-06-06

Family

ID=86570508

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211605460.8A Pending CN116225526A (zh) 2022-12-14 2022-12-14 一种基于图表示学习的代码克隆检测方法

Country Status (1)

Country Link
CN (1) CN116225526A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117609005A (zh) * 2023-10-19 2024-02-27 广东工业大学 一种代码相似度检测方法
CN117707501A (zh) * 2023-12-18 2024-03-15 广州擎勤网络科技有限公司 基于ai与大数据的代码自动生成方法及系统

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117609005A (zh) * 2023-10-19 2024-02-27 广东工业大学 一种代码相似度检测方法
CN117609005B (zh) * 2023-10-19 2024-08-13 广东工业大学 一种代码相似度检测方法
CN117707501A (zh) * 2023-12-18 2024-03-15 广州擎勤网络科技有限公司 基于ai与大数据的代码自动生成方法及系统

Similar Documents

Publication Publication Date Title
CN116225526A (zh) 一种基于图表示学习的代码克隆检测方法
CN111124487B (zh) 代码克隆检测方法、装置以及电子设备
CN116821168B (zh) 一种改进的基于生成式大语言模型的nl2sql方法
CN111931506A (zh) 一种基于图信息增强的实体关系抽取方法
JP2022073981A (ja) ソースコード取得
CN110442880B (zh) 一种机器翻译译文的翻译方法、装置及存储介质
CN112100401B (zh) 面向科技服务的知识图谱构建方法、装置、设备及存储介质
CN114547619B (zh) 一种基于树的漏洞修复系统及修复方法
CN111831624A (zh) 数据表创建方法、装置、计算机设备及存储介质
CN116258147A (zh) 一种基于异构图卷积的多模态评论情感分析方法及系统
CN116661852A (zh) 一种基于程序依赖图的代码搜索方法
CN115658846A (zh) 一种适用于开源软件供应链的智能搜索方法及装置
CN117633194A (zh) 大模型提示数据处理方法、装置、电子设备及存储介质
WO2023103914A1 (zh) 文本情感分析方法、装置及计算机可读存储介质
CN115203438B (zh) 一种实体链接方法及存储介质
CN117390130A (zh) 一种基于多模态表示的代码搜索方法
CN113886520A (zh) 一种基于图神经网络的代码检索方法、系统及计算机可读存储介质
CN115358227A (zh) 一种基于短语增强的开放域关系联合抽取方法及系统
Ramesh et al. Natural Language Generation Using Link Grammar for General Conversational Intelligence
Zhang et al. Research and application of machine learning in automatic program generation
CN115146618B (zh) 一种基于对比表示学习的复杂因果关系抽取方法
CN117575026B (zh) 基于外部知识增强的大模型推理分析方法、系统及产品
CN118673923B (zh) 一种基于大语言模型的实体关系抽取方法
CN117435246B (zh) 一种基于马尔可夫链模型的代码克隆检测方法
CN117891460A (zh) 深度学习驱动的语义语法交互代码注释生成方法及装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination