CN113961241A - 一种基于gat图神经网络模型的代码克隆检测方法 - Google Patents
一种基于gat图神经网络模型的代码克隆检测方法 Download PDFInfo
- Publication number
- CN113961241A CN113961241A CN202111291169.3A CN202111291169A CN113961241A CN 113961241 A CN113961241 A CN 113961241A CN 202111291169 A CN202111291169 A CN 202111291169A CN 113961241 A CN113961241 A CN 113961241A
- Authority
- CN
- China
- Prior art keywords
- code
- clone
- graph
- representation
- gat
- 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
Links
- 238000001514 detection method Methods 0.000 title claims abstract description 36
- 238000003062 neural network model Methods 0.000 title claims abstract description 29
- 239000000427 antigen Substances 0.000 title description 2
- 102000036639 antigens Human genes 0.000 title description 2
- 108091007433 antigens Proteins 0.000 title description 2
- 239000013598 vector Substances 0.000 claims abstract description 61
- 238000012549 training Methods 0.000 claims abstract description 34
- 238000012512 characterization method Methods 0.000 claims abstract description 11
- 238000000034 method Methods 0.000 claims description 72
- 238000013528 artificial neural network Methods 0.000 claims description 13
- 238000010586 diagram Methods 0.000 claims description 11
- 230000008569 process Effects 0.000 claims description 11
- 230000006870 function Effects 0.000 claims description 10
- 230000000694 effects Effects 0.000 description 8
- 230000007246 mechanism Effects 0.000 description 8
- 238000000547 structure data Methods 0.000 description 8
- 238000010367 cloning Methods 0.000 description 7
- 230000007547 defect Effects 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 5
- 239000012634 fragment Substances 0.000 description 5
- 238000013527 convolutional neural network Methods 0.000 description 4
- 238000013135 deep learning Methods 0.000 description 4
- 238000011156 evaluation Methods 0.000 description 4
- 238000000605 extraction Methods 0.000 description 3
- 230000009466 transformation Effects 0.000 description 3
- 238000004364 calculation method Methods 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 230000001788 irregular Effects 0.000 description 2
- 239000011159 matrix material Substances 0.000 description 2
- 238000011160 research Methods 0.000 description 2
- 238000013473 artificial intelligence Methods 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 230000001939 inductive effect Effects 0.000 description 1
- 238000003058 natural language processing Methods 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 230000000306 recurrent effect Effects 0.000 description 1
- 238000010561 standard procedure Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
- G06F8/751—Code clone detection
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/21—Design or setup of recognition systems or techniques; Extraction of features in feature space; Blind source separation
- G06F18/214—Generating training patterns; Bootstrap methods, e.g. bagging or boosting
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/24—Classification techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Data Mining & Analysis (AREA)
- General Physics & Mathematics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Artificial Intelligence (AREA)
- Software Systems (AREA)
- Evolutionary Computation (AREA)
- Bioinformatics & Computational Biology (AREA)
- Evolutionary Biology (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Health & Medical Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Machine Translation (AREA)
Abstract
本发明公开了一种基于GAT图神经网络模型的代码克隆检测方法,包括以下步骤:根据克隆代码的定义,从编程竞赛网站和现有代码克隆数据集提取生成相应定义的克隆代码数据;解析代码文本生成AST抽象语法树;在AST抽象语法树的基础上增加人工定义的附加边生成表示图;将代码表示图输入GAT网络模型训练获得图表征向量;拼接克隆代码对的表征向量输入二分类网络;判别输出代码克隆预测结果。本发明解决了代码克隆检测领域对代码语义型克隆检测能力不足的问题,通过将代码文本转换为图结构表示,从语义与结构层面表征了克隆代码信息,能准确获得学习克隆代码的内在联系并进行克隆代码判别预测,提高了代码克隆检测的准确性。
Description
技术领域
本发明涉及一种代码克隆检测方法,具体涉及一种基于GAT图神经网络模型的代码克隆检测方法,属于人工智能的自然语言处理和图神经网络技术领域。
背景技术
代码克隆问题在软件开发过程中非常常见,对代码克隆进行检测的方法也是软件工程领域一个非常经典的问题。通常来说,代码克隆有两种成因,第一个原因是开发人员通过一些网上的问答网站搜索相关代码,如StackOverflow等,进而对他人编写的代码直接进行复制粘贴导致的;第二个原因是一些设计良好的代码片段被直接进行了复用。因此可以看到,代码克隆的影响是双向的,既有好的一面,也有坏的一面。好的影响是优秀的代码组件得到了良好的复用,从而避免了重复实现相同功能的不必要工作;坏处是它可能导致原本就具有内部缺陷的代码片段被广泛传播,并且引发其他一系列问题,如不一致更改等。
为了更好的研究代码克隆问题,已有的主流研究工作将代码克隆根据其相似性分为了四类。Type-1的代码克隆是指除去注释和空白字符以外完全相同的代码片段,也被称为Identical clone。Type-2的代码克隆指的是只在标识符的名字和类型上有改变的copy-paste代码,有时被称为Renamed clone。Type-3的代码克隆是在Type-1和Type-2的基础上对代码结构进行了更大更改的克隆,即在语句层级上进行了更改,被称为Gapped clone。Type-4的克隆与前三种完全不同,它代表了使用不同代码结构却实现了相同功能的代码片段,这种克隆被称为语义克隆。一个非常典型的语义克隆例子就是对于排序算法的不同实现,如冒泡排序和快速排序。在实际软件中最常出现的是Type-4的克隆。
为了检测现有软件中的代码克隆,已有的研究文献已经提出了很多方法。一般来说,一个典型的代码克隆检测方法通常包含预处理,代码表示和相似度评估三个步骤,现有的方法均是在后两个步骤上使用了不同的方法和技术进行改进得到的。根据各自方法的特点,我们可以得到几种常见的代码克隆检测方法分类。Text-based方法将代码视为纯文本,进而通过字符串特征来比较代码对。这类方法是早期使用的克隆检测方法,它通常只能检测出Type-1的克隆。Token-based方法将代码文本切割成token序列,进而通过不同的技术方法比较代码对的token序列来检测克隆。Tree-based方法首先将代码片段转换为树状结构,如解析树或抽象语法树(AST),然后使用树匹配算法来检测克隆。Graph-based方法将代码解析为图的形式,如程序依赖图(PDG)和控制流图(CFG)等,然后使用图匹配算法比较代码对的图表示形式,判断其是否为克隆。Metric-based方法根据不同的视角从代码块中提取metric集合,然后根据metric值的相似程度来检测代码克隆。随着近年来深度学习的兴起,也出现了一些基于深度学习的方法,他们有的使用神经网络来获取代码片段的表征,有的将深度学习应用于相似度检测上。
然而,现有的方法虽然能够在检测Type-1、Type-2和Type-3这类句法克隆上具有很好的效果,但对于Type-4这种语义克隆检测却常常效果不佳。这通常是由于现有方法对于代码片段的表征没有同时充分利用代码具有的结构和语义信息。此外,一些方法虽然能够检测语义克隆,但不能同时在句法克隆和语义克隆上达到比较好的效果。
在深度学习领域,卷积神经网络(CNN),如AlexNet,VGG和GoogleNet等,在近年来成功的解决了诸多计算机视觉领域的问题,它将局部过滤器进行了高效的重用,并将它们运用到了所有输入位置上。然而CNN只能用于网状结构的输入数据上,即在欧式空间上的规则数据,这极大限制了其在非常规输入数据领域的应用,典型的非常规数据如图结构数据。解决这一问题最为成功的网络结构为图卷积神经网络(GCN),它被广泛应用于图结构数据上。虽然GCN可以有效地对图中的节点的一阶邻居进行处理,而且还可以避免复杂地矩阵运算,但该模型严重依赖于图的结构。因此,在特定图结构上训练得到的模型往往不可以被直接使用到其他图结构上。注意力机制几乎已经成为基于序列任务的一个标准技术。它允许在处理变长输入数据的过程中,聚焦于输入中与决策最相关的部分。当将其用于单个序列的任务中时,又将其称为自注意力机制,它可以生成序列的良好表征。
图注意力网络(GAT)是一种新型的操作于图结构数据上的神经网络架构,它在图卷积神经网络的基础上,充分利用了自注意力机制,解决了图卷积神经网络的一系列缺点。它根据每个节点与其邻居节点的注意力权重系数,对节点表示进行更新。GAT具有以下几个特点:(1)计算速度快,可以在不同的节点上进行并行计算;(2)可以同时对拥有不同度的节点进行处理;(3)可以被直接用于解决归纳学习问题,即可以对从未见过的图结构进行处理。由于代码文本可以通过一定处理转换为图表示结构数据,因此使用图神经网络技术获取代码的表征信息是可能的。因此本发明以图神经网络算法为基础,克隆代码库为数据源,着重研究了一种基于GAT图神经网络模型的代码克隆检测方法。
发明内容
本发明是一种基于GAT图神经网络模型的代码克隆检测方法,提供一种代码文本的图结构数据生成方法,包括将代码文本转换为抽象语法树AST和人工定义附加边并生成图结构数据的过程,并针对克隆代码对的特点设计和训练图神经网络模型,通过拼接训练得到的代码文本的图表征向量,获得用于判别克隆的代码对语义向量,基于权重共享的深度网络进行训练获得隐向量,最终通过二分类浅层神经网络进行克隆判别预测。该方法能有效关注克隆代码的关键信息,降低模型训练的复杂度,该方法利用代码的图结构数据进行模型训练,从结构和语义两个层面获取代码的特征信息,能准确学习克隆代码对的内在关联信息,弥补了现有方法对语义型克隆检测能力的不足。
本发明所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于包含以下步骤:
步骤(1)根据克隆代码的定义,从编程竞赛网站和现有代码克隆数据集提取生成相应定义的克隆代码数据;
步骤(2)解析代码文本生成AST抽象语法树;
步骤(3)在AST抽象语法树的基础上增加人工定义边生成表示图;
步骤(4)将代码表示图输入GAT网络模型训练获得图表征向量;
步骤(5)拼接克隆代码对的表征向量输入二分类网络;
步骤(6)输出代码克隆预测结果。
2.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(1)中根据克隆代码的定义,从编程竞赛网站和现有代码克隆数据集提取生成相应定义的克隆代码数据,继而构建数据集。
3.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(2)中解析代码文本生成AST抽象语法树。
4.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(3)中在AST抽象语法树的基础上增加人工定义边生成表示图,具体子步骤包括:
步骤(3.1)人工定义附加边。根据编程语言的代码结构信息和数据依赖信息人工定义划分了两大类边的类型:结构型边和语义型边。其中,结构型边主要用于表示代码内部的结构特征信息,它基于AST的原有结构以及Java的语法规则进行定义。具体的,又可以分为四个种类:AST结构边、循环结构边、条件分支结构边以及其他结构型边。语义型边,也可称作依赖型边,它主要表示代码中数据流的依赖关系。根据不同的依赖关系相应的也可将其继续划分为两个种类:赋值语义边和变量使用链边;
步骤(3.2)构建生成图结构。在原有AST结构基础上增加人工定义边构建有向图用以表征原代码的图结构信息。
5.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(4)中将代码表示图输入GAT网络模型训练获得图表征向量。具体子步骤包括:
步骤(4.1)设计GAT图神经网络模型结构。使用图注意力网络GAT来构建图神经网络模型,并在模型每一层基础上增加残差连接,然后在模型的最后部分增加一个readout函数模型层用以获得图表示向量;
步骤(4.2)利用克隆代码数据训练模型。将输入的克隆代码对中各自代码的表征图输入上一步设计的网络模型结构中,并且对于输入的一对代码的图表示结构使用参数权重共享的图网络模型进行训练,得到代码的图表征向量;
6.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(5)中根据上一步骤中得到的克隆代码对的图表征向量,拼接向量形成二分类任务输入向量,输入二分类网络进行训练。具体子步骤包括:
步骤(5.1)拼接图表征向量。对于输入的克隆代码对获得的图表征向量,以不同的顺序进行拼接获得输入向量;
步骤(5.2)输入权重共享的深度隐层网络进行训练;
步骤(5.3)使用Average pooling层处理得到判别隐向量;
步骤(5.4)使用二分类浅层神经网络进行训练预测。
7根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(6)输出代码克隆预测结果。代码克隆预测结果的效果采用准确率、召回率和F1分数进行评估。
本发明与现有技术相比,其显著优点是:对代码片段的抽象语法树AST增加人工定义的附加边得到了图表示结构,这种表示形式相比已有的代码图表示形式如PDG或CFG等,粒度更细致并且包含的信息也更丰富;使用图神经网络模型能够学习代码文本图表示信息数据的内在信息,其中使用的注意力机制能够更加关注代码图结构的重点部分信息,结合权重参数共享技术,获得了代码对的内在联系信息,大大提升了模型对克隆代码对的信息特征提取能力,并且结合残差连接结构,有效提升了训练效率,提高了网络模型训练的效果;通过混合拼接代码图表征向量并输入权重共享的深度隐层网络训练,模型能进一步获得代码对向量整体的表征信息,从而准确表达代码对的结构和语义内容,之后使用浅层二分类网络进行判别预测,也弥补了传统方法对向量内非线性关系利用的不足。当利用一定数量的克隆代码对训练了模型后,GAT图神经网络模型的代码克隆检测方法无需重新训练模型,只需要使用原有模型处理预测新的代码对,即可在代码克隆检测时将新的代码对输入进行判别预测。
附图说明
图1基于GAT图神经网络模型的代码克隆检测方法流程图
图2“给定一个参数N,求1-N范围内所有数的和”的函数代码文本
图3函数代码文本解析附加边生成的图结构示例
图4全局模型结构图
图5二分类浅层神经网络模型结构图
图6基于GAT图神经网络模型的代码克隆检测方法与4种主流方法在GCJ数据集上的实验对比图
图7基于GAT图神经网络模型的代码克隆检测方法与6种主流方法在BigCloneBench数据集上的实验对比图
具体实施方式
为使本发明的目的、技术方案和优点更加清晰,下面将结合附图及具体实施例对本发明进行详细描述。
本发明的目的在于解决代码克隆检测问题,提出一种基于GAT图神经网络模型的代码克隆检测方法。对代码片段的抽象语法树AST增加人工定义的附加边得到了图表示结构,这种表示形式相比已有的代码图表示形式如PDG或CFG等,粒度更细致并且包含的信息也更丰富;使用图神经网络模型能够学习代码文本图表示信息数据的内在信息,其中使用的注意力机制能够更加关注代码图结构的重点部分信息,结合权重参数共享技术,获得了代码对的内在联系信息,大大提升了模型对克隆代码对的信息特征提取能力,并且结合残差连接结构,有效提升了训练效率,提高了网络模型训练的效果;通过混合拼接代码图表征向量并输入权重共享的深度隐层网络训练,模型能进一步获得代码对向量整体的表征信息,从而准确表达代码对的结构和语义内容,之后使用浅层二分类网络进行判别预测,也弥补了传统方法对向量内非线性关系利用的不足。本发明概括来说主要包括以下步骤:
步骤(1)根据克隆代码的定义,从编程竞赛网站和现有代码克隆数据集提取生成相应定义的克隆代码数据;
步骤(2)解析代码文本生成AST抽象语法树;
步骤(3)在AST抽象语法树的基础上增加人工定义边生成表示图;
步骤(4)将代码表示图输入GAT网络模型训练获得图表征向量;
步骤(5)拼接克隆代码对的表征向量输入二分类网络;
步骤(6)输出代码克隆预测结果。
上述一种基于GAT图神经网络模型的代码克隆检测方法的详细工作流程如图1所示。这里将对上述步骤进行详细描述。
1.由于克隆代码数据通常难以获得,因此考虑使用编程竞赛网站的代码数据,将对同一问题的不同解答视为克隆代码对,将对不同问题间的解答视为非克隆代码对,构建数据集。此外,使用传统主流的代码克隆检测公开数据集作为额外数据集。
2.为了将代码文本转换为可以结构化处理的数据,并且表达更加丰富的语义信息,提升表征效果,在步骤2中将代码文本进行解析生成AST抽象语法树。
3.对代码文本的结构和语义信息进行分析,定义两大类附加边,并在代码解析成的抽象语法树AST基础上进行补充生成代码的图表示形式。具体步骤包括:
步骤(3.1)人工定义附加边。根据编程语言的代码结构信息和数据依赖信息人工定义划分了两大类边的类型:结构型边和语义型边。
结构型边主要用于表示代码内部的结构特征信息,它基于AST的原有结构以及Java的语法规则进行定义。为了系统地阐述定义的结构型边,可以将其细分为了4类。
1)AST结构边:该种结构边主要基于AST原有的结构信息进行定义。对于AST中的每一个节点,AST的原有结构都使用了边来将其与它的父亲节点和孩子节点进行连接。为了扩充AST的特征语义,对于具有同一个父节点的兄弟节点,定义了边来表示这种相互关系。此外,为了包含代码关键字和标识符的语义信息,在原有AST的基础上保留了token名称作为叶子节点,并且对于每个叶子节点,还使用边将其进行连接串联。最终生成的图结构中,除了AST原本的边以外,绝大多数边都是这种边类型。
2)循环结构边:表示循环结构的语句通常包括for、while和do-while语句,在AST中该类语句的循环条件和循环体常常处于不同的分支,为了更好的表示循环过程,我们针对不同的循环结构增加边来连接它们的循环条件和循环体分支。
3)条件分支结构边:与循环结构类似,对于表示控制结构的if-else和switch语句,它们的控制条件和执行体也往往位于不同的位置,因此我们根据不同的控制语句在AST中的特定结构设计了连接这种控制流跳转信息的边来进行完善。
4)其他结构边:代码中方法的参数列表信息和返回语句也通常具有一定意义的结构特征。我们使用边连接了返回语句和方法定义。而对于参数列表信息,其顺序和参数类型对于方法功能接口的描述也具有一定影响,因此我们将参数列表中的每一个参数类型节点使用边进行串联。
语义型边,也可称作依赖型边,它主要表示代码中数据流的依赖关系。为了更好的突出代码中的流式语义依赖性,我们定义了2种类型的边来进行表征。
1)赋值语义边:在一个赋值语句中,数据通常会从赋值运算符的右侧向左侧流动,我们使用边来连接AST中的对应节点以表示这种语义信息。
2)变量使用链边:为了表示更丰富的语义信息,我们搜索了每一个变量的引用和调用位置,然后连接变量引用节点和变量声明节点来表示变量的引用语义信息,连接变量调用节点和声明节点来表示变量的方法调用语义。同时,因为变量的引用和调用本身在代码中具有序列顺序,因此我们也用边将其连接成链。
以“给定一个参数N,求1-N范围内所有数的和”的函数代码为例,如图2所示,将其代码文本解析成抽象语法树,增加人工定义附加边,生成图表示结构。生成的代码的图表示结构如图3所示。
步骤(3.2)构建生成图结构。在原有AST结构基础上增加人工定义边构建有向图用以表征原代码的图结构信息。
4.为了更好的学习克隆代码对的图表示结构数据的表征信息,我们使用了带有注意力机制的图神经网络GAT图注意力网络来构建模型进行训练,获得代码的表征向量。具体步骤包括:
步骤(4.1)设计GAT图神经网络模型结构。使用图注意力网络GAT来构建图神经网络模型,并在模型每一层基础上增加残差连接,然后在模型的最后部分增加一个readout函数模型层用以获得图表示向量,整体模型结构如图4所示;
图注意力网络由多个堆叠的图注意力层组成,GAT层仅仅关注于基于目标节点的直接邻居来获取一个节点表示。给定输入的一个节点特征集合h={y1,y2,...,yn},hi∈Rd,这里n为节点数,d为每个节点特征的维度,它首先应用一个线性变换Whi,W表示节点特征向量的权重矩阵,W∈Rd′×d。然后对节点应用一个共享的注意力机制a来计算注意力系数,该注意力系数决定了节点i到节点j的重要程度eij,eij=a(Whi,Whj),a实现了R2d′→R的转换。由于图结构的多种多样,每个节点都有不同数量的邻居。为了对所有邻居实现一个共同的缩放,注意力系数需要做归一化处理。
对于一对图表示形式的代码片段输入<G1,G2>,模型的传播过程如下:
为了根据图中各节点的向量得到整个图的向量表示,我们使用如下的readout函数:
其中g(.)代表非线性变换函数,也可以被表示为恒等变换,fgate(.)和ffeat(.)可以使用简单的多层感知机(MLP)。
步骤(4.2)利用克隆代码数据训练模型。将输入的克隆代码对中各自代码的表征图输入上一步设计的网络模型结构中,并且对于输入的一对代码的图表示结构使用参数权重共享的图网络模型进行训练,得到代码的图表征向量;
5.拼接克隆代码对的表征向量输入二分类网络。在通过将代码文本转换为图结构数据以及经过图注意力网络模型训练后获得了代码文本的表征向量,之后拼接克隆代码对的表征向量后输入到深度网络模型中进行判别预测。根据克隆代码对的表征向量进行判别预测的方法具体子步骤包括:
步骤(5.1)拼接图表征向量。对于输入的克隆代码对获得的图表征向量,以不同的顺序进行拼接获得输入向量;
步骤(5.2)输入权重共享的深度隐层网络进行训练;
步骤(5.3)使用Average pooling层处理得到判别隐向量;
步骤(5.4)使用二分类浅层神经网络进行训练预测。
如图5所示,对于给定的代码对的图表示<G1,G2>,经过GAT网络后,得到了图向量表示对我们将其按照不同的顺序进行拼接,得到和然后将两个拼接后的向量输入一个权重参数共享的全连接网络,得到两个隐层向量,再对它们施加一个Average pooling操作后得到一个用于最终判别的隐向量表示。之后该向量经过一个浅层网络后使用一个具有两个节点的输出层网络进行分类预测。这么设计是为了降低需要训练的数据量,从而提高模型的训练速度,同时因为对称性,两种拼接向量的信息都被很好的保留下来。例如,对于一个具有n个代码片段的代码库,其包含了n×(n-1)个代码对,而该模型可以将输入数据量降为n×(n-1)/2个,极大节省训练时间。
对于二分类问题,我们使用交叉熵作为损失函数:
6.输出代码克隆预测结果。
由于克隆代码本身定义的模糊性,不同的定义标准可能会判别同一对代码为不同的结果,我们使用代码竞赛网站的代码数据和现有公开的克隆代码数据集来进行训练与评估。公开的克隆代码标准数据集将克隆代码进行了划分。在代码克隆检测的场景下,好的检测算法应做到既准确又能覆盖到足够多的真实克隆代码。因此,本发明采用准确率、召回率和F1-评估分数来对代码克隆检测的效果进行评估。在实验评估时,本发明与6个业界流行的方法进行了对比,在代码竞赛数据集GCJ和公开的克隆代码标准数据集上分布进行评估,实验结果如图6和图7所示。其中Deckard代表一个流行的基于AST的克隆检测工具,RtvNN代表使用Recurrent Neural Networks(RNN)来学习源代码标识符嵌入向量的方法模型,CDLH代表一个使用Tree-LSTM的功能性克隆检测器,DeepSim代表一个基于语义的方法并应用了深度网络来评估功能性代码相似度的方法,TBCCD代表一个使用tree-based卷积来检测语义型克隆的方法,FA-AST+GMN是第一个将图神经网络应用于代码克隆检测的方法,DCC-GAT和DCC-GAT+Residual代表本发明提出的基于GAT图神经网络模型的代码克隆检测方法。由实验结果可见,本发明对克隆代码的检测效果都优于其他方法。
上面已经参考附图对根据本发明实施的一种基于GAT图神经网络模型的代码克隆检测方法进行了详细描述。本发明具有如下优点:对代码片段的抽象语法树AST增加人工定义的附加边得到了图表示结构,这种表示形式相比已有的代码图表示形式如PDG或CFG等,粒度更细致并且包含的信息也更丰富;使用图神经网络模型能够学习代码文本图表示信息数据的内在信息,其中使用的注意力机制能够更加关注代码图结构的重点部分信息,结合权重参数共享技术,获得了代码对的内在联系信息,大大提升了模型对克隆代码对的信息特征提取能力,并且结合残差连接结构,有效提升了训练效率,提高了网络模型训练的效果;通过混合拼接代码图表征向量并输入权重共享的深度隐层网络训练,模型能进一步获得代码对向量整体的表征信息,从而准确表达代码对的结构和语义内容,之后使用浅层二分类网络进行判别预测,也弥补了传统方法对向量内非线性关系利用的不足。当利用一定数量的克隆代码对训练了模型后,GAT图神经网络模型的代码克隆检测方法无需重新训练模型,只需要使用原有模型处理预测新的代码对,即可在代码克隆检测时将新的代码对输入进行判别预测。
需要明确,本发明并不局限于上文所描述并在图中示出的特定配置和处理。并且,为了简明起见,这里省略对已知方法技术的详细描述。当前的实施例在所有方面都被看作是示例性的而非限定性的,本发明的范围由所附权利要求而非上述描述定义,并且,落入权利要求的含义和等同物的范围内的全部改变从而都被包括在本发明的范围之中。
Claims (7)
1.一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于包含以下步骤:
步骤(1)根据克隆代码的定义,从编程竞赛网站和现有代码克隆数据集提取生成相应定义的克隆代码数据;
步骤(2)解析代码文本生成AST抽象语法树;
步骤(3)在AST抽象语法树的基础上增加人工定义边生成表示图;
步骤(4)将代码表示图输入GAT网络模型训练获得图表征向量;
步骤(5)拼接克隆代码对的表征向量输入二分类网络;
步骤(6)输出代码克隆预测结果。
2.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(1)中根据克隆代码的定义,从编程竞赛网站和现有代码克隆数据集提取生成相应定义的克隆代码数据,继而构建数据集。
3.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(2)中解析代码文本生成AST抽象语法树。
4.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(3)中在AST抽象语法树的基础上增加人工定义边生成表示图,具体子步骤包括:
步骤(3.1)人工定义附加边。根据编程语言的代码结构信息和数据依赖信息人工定义划分了两大类边的类型:结构型边和语义型边。其中,结构型边主要用于表示代码内部的结构特征信息,它基于AST的原有结构以及Java的语法规则进行定义。具体的,又可以分为四个种类:AST结构边、循环结构边、条件分支结构边以及其他结构型边。语义型边,也可称作依赖型边,它主要表示代码中数据流的依赖关系。根据不同的依赖关系相应的也可将其继续划分为两个种类:赋值语义边和变量使用链边;
步骤(3.2)构建生成图结构。在原有AST结构基础上增加人工定义边构建有向图用以表征原代码的图结构信息。
5.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(4)中将代码表示图输入GAT网络模型训练获得图表征向量。具体子步骤包括:
步骤(4.1)设计GAT图神经网络模型结构。使用图注意力网络GAT来构建图神经网络模型,并在模型每一层基础上增加残差连接,然后在模型的最后部分增加一个readout函数模型层用以获得图表示向量;
步骤(4.2)利用克隆代码数据训练模型。将输入的克隆代码对中各自代码的表征图输入上一步设计的网络模型结构中,并且对于输入的一对代码的图表示结构使用参数权重共享的图网络模型进行训练,得到代码的图表征向量。
6.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(5)中根据上一步骤中得到的克隆代码对的图表征向量,拼接向量形成二分类任务输入向量,输入二分类网络进行训练。具体子步骤包括:
步骤(5.1)拼接图表征向量。对于输入的克隆代码对获得的图表征向量,以不同的顺序进行拼接获得输入向量;
步骤(5.2)输入权重共享的深度隐层网络进行训练;
步骤(5.3)使用Average pooling层处理得到判别隐向量;
步骤(5.4)使用二分类浅层神经网络进行训练预测。
7.根据权利要求1所述的一种基于GAT图神经网络模型的代码克隆检测方法,其特征在于步骤(6)输出代码克隆预测结果。代码克隆预测结果的效果采用准确率、召回率和F1分数进行评估。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111291169.3A CN113961241A (zh) | 2021-11-02 | 2021-11-02 | 一种基于gat图神经网络模型的代码克隆检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111291169.3A CN113961241A (zh) | 2021-11-02 | 2021-11-02 | 一种基于gat图神经网络模型的代码克隆检测方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113961241A true CN113961241A (zh) | 2022-01-21 |
Family
ID=79469113
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111291169.3A Pending CN113961241A (zh) | 2021-11-02 | 2021-11-02 | 一种基于gat图神经网络模型的代码克隆检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113961241A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114780103A (zh) * | 2022-04-26 | 2022-07-22 | 中国人民解放军国防科技大学 | 一种基于图匹配网络的语义类代码克隆检测方法 |
CN115129364A (zh) * | 2022-07-05 | 2022-09-30 | 四川大学 | 基于抽象语法树和图神经网络的指纹身份识别方法和系统 |
CN115268994A (zh) * | 2022-07-26 | 2022-11-01 | 中国海洋大学 | 一种基于tbcnn和多头自注意力机制的代码特征提取方法 |
CN115373737A (zh) * | 2022-07-06 | 2022-11-22 | 云南恒于科技有限公司 | 一种基于特征融合的代码克隆检测方法 |
CN116302088A (zh) * | 2023-01-05 | 2023-06-23 | 广东工业大学 | 一种代码克隆检测方法、存储介质及设备 |
CN117609005A (zh) * | 2023-10-19 | 2024-02-27 | 广东工业大学 | 一种代码相似度检测方法 |
-
2021
- 2021-11-02 CN CN202111291169.3A patent/CN113961241A/zh active Pending
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114780103A (zh) * | 2022-04-26 | 2022-07-22 | 中国人民解放军国防科技大学 | 一种基于图匹配网络的语义类代码克隆检测方法 |
CN114780103B (zh) * | 2022-04-26 | 2022-12-20 | 中国人民解放军国防科技大学 | 一种基于图匹配网络的语义类代码克隆检测方法 |
CN115129364A (zh) * | 2022-07-05 | 2022-09-30 | 四川大学 | 基于抽象语法树和图神经网络的指纹身份识别方法和系统 |
CN115129364B (zh) * | 2022-07-05 | 2023-04-18 | 四川大学 | 基于抽象语法树和图神经网络的指纹身份识别方法和系统 |
CN115373737A (zh) * | 2022-07-06 | 2022-11-22 | 云南恒于科技有限公司 | 一种基于特征融合的代码克隆检测方法 |
CN115373737B (zh) * | 2022-07-06 | 2023-05-26 | 武汉大学 | 一种基于特征融合的代码克隆检测方法 |
CN115268994A (zh) * | 2022-07-26 | 2022-11-01 | 中国海洋大学 | 一种基于tbcnn和多头自注意力机制的代码特征提取方法 |
CN116302088A (zh) * | 2023-01-05 | 2023-06-23 | 广东工业大学 | 一种代码克隆检测方法、存储介质及设备 |
CN116302088B (zh) * | 2023-01-05 | 2023-09-08 | 广东工业大学 | 一种代码克隆检测方法、存储介质及设备 |
CN117609005A (zh) * | 2023-10-19 | 2024-02-27 | 广东工业大学 | 一种代码相似度检测方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113961241A (zh) | 一种基于gat图神经网络模型的代码克隆检测方法 | |
Huang et al. | Graphlime: Local interpretable model explanations for graph neural networks | |
Xiaomeng et al. | CPGVA: code property graph based vulnerability analysis by deep learning | |
Cai et al. | An abstract syntax tree encoding method for cross-project defect prediction | |
CN113761893B (zh) | 一种基于模式预训练的关系抽取方法 | |
CN113591465B (zh) | 基于关联增强的网络威胁情报多维IoC实体识别方法及装置 | |
CN118296150B (zh) | 一种基于多对抗网络改进的评论情感识别方法 | |
CN115438709A (zh) | 基于代码属性图的代码相似性检测方法 | |
Wen et al. | A cross-project defect prediction model based on deep learning with self-attention | |
Kim | Enhancing code clone detection using control flow graphs. | |
CN113742396A (zh) | 一种对象学习行为模式的挖掘方法及装置 | |
CN117725592A (zh) | 一种基于有向图注意力网络的智能合约漏洞检测方法 | |
Tang et al. | An attention-based automatic vulnerability detection approach with GGNN | |
Gu et al. | Hierarchical attention network for interpretable and fine-grained vulnerability detection | |
CN117235216A (zh) | 一种基于异构知识融合的知识推理方法 | |
CN117056226A (zh) | 基于迁移学习的跨项目软件缺陷数量预测方法 | |
CN112015890A (zh) | 电影剧本摘要的生成方法和装置 | |
CN116662991A (zh) | 基于人工智能的智能合约意图检测方法 | |
Loyola et al. | Learning feature representations from change dependency graphs for defect prediction | |
CN115221045A (zh) | 一种基于多任务多视角学习的多目标软件缺陷预测方法 | |
CN111897932A (zh) | 一种文本大数据的查询处理方法及系统 | |
CN117435246B (zh) | 一种基于马尔可夫链模型的代码克隆检测方法 | |
Jiang et al. | Software vulnerability detection method based on code attribute graph presentation and Bi-LSTM neural network extraction | |
Li et al. | ACAGNN: Source Code Representation Based on Fine-Grained Multi-view Program Features | |
Xue et al. | VulSAT: Source Code Vulnerability Detection Scheme Based on SAT Structure |
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 |