首页> 中国专利> 一种基于图匹配网络的语义类代码克隆检测方法

一种基于图匹配网络的语义类代码克隆检测方法

摘要

本发明公开了一种基于图匹配网络的语义类代码克隆检测方法,目的是解决语义类克隆检测结果不准确的问题。技术方案是:构建由代码补全模块、代码中间表示提取模块、语义图构建模块、代码向量生成模块和向量相似度计算器构成的代码克隆检测系统;使用语义类代码克隆数据集对代码向量生成模块中的深度学习模型进行训练;使用代码克隆检测系统对待检测代码进行代码补全、提取代码中间表示、构建代码语义图,训练后的代码向量生成模块将代码语义图转化为高维向量,再使用向量相似度计算器判断向量的相似度是否超过阈值以判断待检测代码是否是克隆代码。采用本发明可完整获取代码语义信息,有效检测语义类代码克隆,且在代码不可编译时仍能进行检测。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-07-22

    公开

    发明专利申请公布

说明书

技术领域

本发明涉及大型软件维护中的克隆检测技术,具体涉及一种基于图匹配网络的代码克隆检测方法。

背景技术

随着计算机的发展,计算机软件已经在社会各个领域得到了广泛的应用,在现代社会中扮演着举足轻重的角色,发挥了重要的作用。随着各行各业对软件系统的需求日益扩增,现代软件系统的代码规模逐渐扩大,导致现代软件系统的开发往往需要耗费大量的人力以及时间。为了提高现代软件系统开发人员在软件开发中的效率,开发人员在开发软件过程中往往会复用一些已有的代码。复用代码的方法主要包括从代码仓库中搜索满足需求的代码,对代码简要修改和复制到目标软件系统中、使用成熟的开发框架例如Spring、Tensorflow等、针对具体任务使用前人总结的设计模式。上述方法虽然提高了开发人员的软件开发效率,但也催生了代码克隆现象。代码克隆是指代码仓库中两段相同或相似的代码。根据已有的研究工作显示,代码克隆已经广泛的存在于现代软件系统之中。在Linux操作系统内核中包含27%-35%的代码存在代码克隆,在当前最大的代码仓库Github中,超过70%的代码都存在代码克隆。虽然重复使用已有的代码可以显著提升软件开发人员的开发效率,但是重复使用已有代码也有可能引入潜藏的漏洞,如在复用代码时,为根据上下文对代码进行更改,使得引入预期外的控制流或数据流。因此代码克隆检测尤为重要。利用代码克隆检测,软件维护人员可以根据已知的恶意程序代码或含有漏洞的代码检测在软件中其他可能潜藏的恶意软件代码和含有漏洞的代码。

根据两段代码的相似程度的不同,一般将代码克隆分为四类。第一类代码克隆指除了注释和空格不同,其他都相同的两段代码。第二类代码克隆指仅仅函数名或变量名不同的两段代码。第三类代码克隆指在保持语法结构不变的基础上,在代码语句上略有增删的两段代码。第四类代码克隆也叫做语义类代码克隆,指语法结构不同,但是代码语义相同的两段代码。针对代码克隆的种类不同,现有主要有基于匹配和基于深度学习的方法检测代码克隆。基于匹配的代码克隆检测方法,主要通过将代码进行一些转换,再根据代码转换之后的表示形式,利用对应的相似比较算法,判断两段代码是否相似。例如Zu Yue等人在ASE2020会议上发表的文章“CCGraph:a PDG-based code clone detector withapproximate graph matching(一种利用相似图匹配算法的基于程序依赖图的克隆检测方法,简称CCGRAPH)”,将代码转化为包含其数据流信息和控制流信息的程序依赖图。为了比较两段代码的程序依赖图的相似性,他们使用Weisfeiler-Lehman图核算法来比较两个图的相似性,最后根据两个图的相似性是否超过既定阈值来判断两段代码是否是克隆代码。基于匹配的克隆检测方法速度较快,不需要前期准备工作,并且在前三种类型的代码克隆检测中可以取得较好的准确率和召回率。但是在解决语义类代码克隆问题时,基于匹配的克隆检测方法的准确率和召回率都有显著下降,导致开发人员在查找语义类克隆检测时,仍然需要花费大量的人力物力检查匹配的克隆检测方法的输出结果。基于深度学习的代码克隆检测方法是使用深度学习模型将代码转化为可以表示其含义的高维向量,通过训练深度学习模型,可以使克隆代码的向量在高维空间之中更近似。在判断一对代码是否是克隆代码时,使用训练好的深度学习模型将他们转化为高维向量,根据代码向量距离判断两段代码是否是克隆代码。例如Hao Yu等人在ICPC2019会议上发表的文章“Neural detectionof semantic code clones via tree-based convolution(基于树型卷积的语义代码克隆检测方法,简称TBCCD)”,将代码转化为抽象语法树,然后利用树型卷积模型将代码的抽象语法树转化为向量,最后比较代码向量的相似度判断代码是否为克隆代码。基于深度学习的代码克隆方法可以更有效的理解代码的语义,因此可以有效检测出语义类代码克隆。但是目前的基于深度学习的代码克隆检测方法主要使用以LSTM网络为代表的基于文本的深度学习模型,只学习了代码的文本和语法信息,在准确率和召回率仍有待提高。

综上,如何提供一种检测语义类代码克隆的方法,更好地挖掘代码中的信息,更好地使用深度学习模型学习代码语义,使得代码克隆检测更准确,是本领域技术人员正在探讨的热点问题。

发明内容

本发明要解决的技术问题是针对语义类克隆检测结果不准确,代码语义信息获取不全面问题,提供一种基于图匹配网络的代码克隆检测方法。此方法基于深度学习检测代码克隆的方法框架,抽取代码的数据流控制流信息构建代码语义图,更完整的提取代码语义信息。使用图匹配网络,可以更有效地学习代码语义图的语义信息,进而更准更全地查找语义类代码克隆。

为解决上述问题,本发明的技术方案是:首先构建由代码补全模块、代码中间表示提取模块、语义图构建模块、代码向量生成模块和向量相似度计算器构成的代码克隆检测系统。然后使用语义类代码克隆数据集对代码向量生成模块中的深度学习模型进行训练,调整深度学习网络模型参数。最后使用代码克隆检测系统对用户输入的待检测代码进行代码补全、提取代码中间表示、构建代码语义图,训练后的代码向量生成模块将代码语义图转化为对应的高维向量V1和V2,再使用向量相似度计算器判断向量的相似度是否超过既定阈值。

本发明包含以下步骤:

第一步,构建代码克隆检测系统。代码克隆检测系统由代码补全模块、代码中间表示提取模块、语义图构建模块、代码向量生成模块和向量相似度计算器构成。

代码补全模块与代码中间表示提取模块相连,使用JCoffee-1.0工具(见P Gupta等人在ICSME会议上发表的文献“JCoffee:Using Compiler Feedback to Make PartialCode Snippets Compilable”使用编译器反馈来使代码片段可编译,下载地址:https://github.com/piyush69/JCoffee)对输入的代码对C

代码中间表示提取模块与代码补全模块、语义图构建模块相连,将从代码补全模块接收的C‘

语义图构建模块与代码中间表示提取模块、代码向量生成模块相连,从代码中间表示提取模块接收R

代码向量生成模块与语义图构建模块、向量相似度计算器相连,从代码向量生成模块接收G

向量相似度计算器与代码向量生成模块相连,计算V

第二步,代码补全模块采用代码补全方法补全数据集中的代码。方法为:

2.1使用BigCloneBench数据集作为训练代码,BigCloneBench数据集来自JSvajlenko等人发表在ICSME2015会议上的文献“Evaluating clone detection toolswith bigclonebench”:使用Bigclonebench检验代码克隆检测工具。其中BigCloneBench数据集包含44种功能的代码,共8961段代码。在构建克隆代码对时,从BigCloneBench数据集中任意抽取两段代码可以构成一个代码对,若抽取的两段代码功能相同,则为克隆代码对,否则为非克隆代码对。从BigCloneBench数据集中总共可以构建11,241,933对克隆代码以及69,057,588对非克隆代码。由于从BigCloneBench数据集中构建的代码对数量庞大,使用全部的代码对讲消耗过多的时间和资源,因此在使用时仅仅从所有代码对中选择N(80299521=11,241,933+69,057,588≥N≥10,000)对代码以及对应的标注作为训练集用于模型训练。由于BigCloneBench数据集中存在代码不可编译,无法提取其代码中间表示,因此需要对代码进行补全。

2.2令可编译代码集合Data={};

2.3令变量n=1;

2.4从训练集中抽取第n个代码段CC

2.5将CC

2.6使用JCoffee-1.0工具补全CC

2.7判断CC′

2.8将CC′

2.9若n≥N,说明Bigclonebench数据集中的所有代码均已经过补全,令补全后的Data中数据总数M=n,将补全后的Data发送给代码中间表示提取模块,转第三步;否则转2.4;

第三步,代码中间表示提取模块从代码补全模块接收可编译代码集合Data,采用代码中间表示提取方法从Data中提取代码中间表示,构建代码中间表示集合IR。具体方法为:

3.1令代码中间表示集合IR={};

3.2令变量m=1;

3.3从Data中抽取第m个代码CC

3.4提取JAVA代码的代码中间表示,方法为:

3.4.1使用JavaC编译代码CC

3.4.2根据二进制文件Class

3.5利用LLVM-9.0工具(见C Lattner等人在CGO2004会议上发表的文献“LLVM:Acompilation framework for lifelong program analysis&transformation”LLVM:一个程序分析和转化的编译器框架,下载地址:https://releases.llvm.org/download.html)编译代码CC

3.6若m>M,说明已为所有可编译代码提取代码中间表示,将代码中间表示集合IR发送至语义图构建模块,转第四步;若m≤M,转3.3。

第四步,语义图构建模块从代码表示提取模块接收代码中间表示集合IR,采用语义图集合构建方法根据IR构建语义图集合SG,方法为:

4.1令语义图集合SG={};

4.2令变量p=0;

4.3从IR中抽取第p个代码中间表示R

4.3.1初始化关键语义表示信息队列S

4.3.2初始化变量a=1,初始化标识flag=0;

4.3.3判断R

4.3.4令a=a+1,若a≤R

4.3.5将

4.3.6由于根据代码生成的指令在“{}”符号的范围内,因此根据判断

4.3.7令flag=1,表示开始存储中间表示关键指令信息,转4.3.10;

4.3.8若flag=1,将

4.3.9令flag=0,表示停止存储中间表示关键指令信息,转4.3.11;

4.3.10令a=a+1,转4.3.6;

4.3.11令a=a+1,若a小于R

4.3.12得到关键语义表示信息队列S

4.4语义图构建模块采用语义图构建方法根据S

4.4.1初始化语义图G

4.4.2语义图构建模块为G

4.4.2.1初始化变量k=1;

4.4.2.2判断S

4.4.2.3利用正则表达式从

4.4.2.4令k=k+1,若k大于S

4.4.3语义图构建模块为G

4.4.3.1初始化变量k=1;

4.4.3.2判断S

4.4.3.3利用正则表达式从

4.4.3.4令k=k+1,若k大于S

4.4.4语义图构建模块为语义图G

4.4.4.1初始化变量k=1;

4.4.4.2初始化变量u=1;

4.4.4.3判断S

4.4.4.4利用正则表达式从

4.4.4.5判断

4.4.4.6使用正则表达式从

4.4.4.7判断S

4.4.4.8使用正则表达式从

4.4.4.9判断S

4.4.4.10使用正则表达式从

4.4.4.11判断S

4.4.4.12使用正则表达式从

4.4.4.13判断S

4.4.4.14使用正则表达式从

4.4.4.15令k=k+1,若k大于S

4.5若p大于代码中间表示数据集IR的大小,则得到语义图集合SG,转第五步;否则令p=p+1,转4.3;

第五步,根据语义图集合SG制作代码向量生成模块所需的训练数据集。方法为:

5.1令变量i=1;

5.2初始化训练数据集TrainingSet={};

5.3随机从语义图集合SG中任意抽取两个语义图,令第i次抽取的语义图为

5.4令i=i+1,若i>10,000,则训练集制作完成,将训练数据集TrainingSet发送到代码向量生成模块,转第六步;否则转5.3;

第六步:采用TrainingSet训练代码向量生成模块,得到可以表示语义图信息的图匹配网络。具体方法是:

6.1设置训练图匹配网络所需参数。方法是:

6.1.1设置图匹配网络包含网络层数T=4;

6.1.2设置图匹配网络学习率ir=0.001;

6.1.3设置训练轮数num_epochs=50;

6.1.4初始化训练轮数epochs=0;

6.2令变量i=1;

6.3从训练数据集TrainingSet中抽取第i个数据D

6.4采用第一初始化方法初始化

6.4.1使用Word2vec模型(见T Mikolov等人2013年发表在arxiv网站的文献“Efficient Estimation of Word Representations in Vector Space”,有效的表示文字在向量空间)初始化

6.4.2令

6.4.3令

6.5采用第二初始化方法初始化

6.5.1使用Word2vec模型初始化

6.5.2令

6.5.3令

6.6采用迭代更新方法更新第一语义图

6.6.1初始化变量t=1;

6.6.2从

6.6.3计算在第t次迭代时,

6.6.3.1从

6.6.3.2计算x与z的相似度α

6.6.3.3计算在第t次迭代时x与

6.6.4计算在第t次迭代时,第一语义图

6.6.4.1在

6.6.4.2判断边e

6.6.4.3计算

6.6.4.4计算在第t次迭代时,第一语义图

6.6.5更新

6.6.6令t=t+1。若t小于T,转6.6.2;否则说明迭代更新完毕,得到第一最终语义图

6.7采用6.6所述迭代更新方法更新

6.8计算

6.9计算

6.10利用余弦相似度函数比较V

6.11若Label

6.12若Label

6.13计算模型调整值Loss=-(1-SIM)×ir,将Loss输入word2vec模型,word2vec模型自动更新模型中的参数,转6.15;

6.14设置向量调整值Loss=(1-SIM)×ir,将Loss输入word2vec模型,word2vec模型自动更新模型中的参数,转6.15;

6.15令i=i+1,若i大于语义图数据集SG的大小,说明已训练完一轮,转6.16;否则转6.3;

6.16令epochs=epochs+1,若epochs等于num_epochs,说明训练完毕,得到了可以表示语义图信息的图匹配网络,也即得到了训练后的代码向量生成模块,转第七步;否则转6.2,开始新一轮训练;

第七步:使用代码克隆系统检测用户输入的一对待检测代码C

7.1令待检测代码集合Test={C

7.2代码补全模块采用第二步所述代码补全方法对待检测代码集合Test进行代码补全,得到补全后可编译的待检测代码集合Test_Data={C‘

7.3代码中间表示提取模块采用第三步所述代码中间表示提取方法从对Test_Data提取代码中间表示,构建待检测代码集合的代码中间表示集合Test_IR,Test_IR={R

7.4语义图生成模块采用第四步所述语义图集合构建方法根据Test_IR构建待检测代码集合的语义图集合Test_SG={G

7.5训练好的代码向量生成模块根据Test_SG中的第一语义图G

7.5.1采用6.4所述第一初始化方法初始化G

7.5.2采用6.6所述迭代更新方法迭代更新初始化语义图IG

7.5.3计算FG

7.5.4计算FG

7.6训练好的向量生成模块利用余弦相似度函数比较V

采用本发明可以达到以下技术效果:

1、采用本发明可以有效的检测语义类代码克隆。采用本发明在BigCloneBench数据集上对本文方法在检测克隆代码的效果进行测试。经过12小时的模型训练,可以有效检测到BigCloneBench中超过44%的代码克隆,并且保证58%的准确率。而已有方法“Neuraldetection of semantic code clones via tree-based convolution”(基于树型卷积的代码克隆语义检测)在检测到37%代码克隆时,仅能取得31%的准确度。

2、本发明第三步中利用编译器在编译代码过程中,对代码的中间表示信息,更准确完整地挖掘到代码中的语义信息(即有效信息),在第四步中根据挖掘出的代码关键语义信息,构建语义图,可以更好的表达代码中间表示中的语义信息。在第六步中使用图匹配网络更好的挖掘代码语义特征。相比于基于字符或者基于语法的克隆检测方法,本发明基于图匹配网络的方法可以更准确的提取代码的实际语义,因此本发明也取得了超过其他方法的代码克隆检测效果。

3、本发明在第二步对输入代码克隆检测系统的代检测代码进行了补全,使其在不可编译时,仍能使用本发明进行代码克隆检测,具有良好的泛用性。

附图说明:

图1为本发明整体流程图。

图2为本发明第一步构建的代码克隆检测系统逻辑结构图。

具体实施方式

下面结合附图对本发明进行说明。图1是本发明整体流程图。如图1所示,本发明包括以下步骤:

第一步,构建代码克隆检测系统。代码克隆检测系统如图2所示,由代码补全模块、代码中间表示提取模块、语义图构建模块、代码向量生成模块和向量相似度计算器构成。

代码补全模块与代码中间表示提取模块相连,使用JCoffee-1.0工具对输入的代码对C

代码中间表示提取模块与代码补全模块、语义图构建模块相连,将从代码补全模块接收的C‘

语义图构建模块与代码中间表示提取模块、代码向量生成模块相连,从代码中间表示提取模块接收R

代码向量生成模块与语义图构建模块、向量相似度计算器相连,从代码向量生成模块接收G

向量相似度计算器与代码向量生成模块相连,计算V

第二步,代码补全模块采用代码补全方法补全数据集中的代码。方法为:

2.1使用BigCloneBench数据集作为训练代码,BigCloneBench数据集包含44种功能的代码,共8961段代码。在构建克隆代码对时,从BigCloneBench数据集中任意抽取两段代码可以构成一个代码对,若抽取的两段代码功能相同,则为克隆代码对,否则为非克隆代码对。从BigCloneBench数据集中总共可以构建11,241,933对克隆代码以及69,057,588对非克隆代码。从所有代码对中选择N(80299521=11,241,933+69,057,588≥N≥10,000)对代码以及对应的标注作为训练集用于模型训练。由于BigCloneBench数据集中存在代码不可编译,无法提取其代码中间表示,因此需要对代码进行补全。

2.2令可编译代码集合Data={};

2.3令变量n=1;

2.4从训练集中抽取第n个代码段CC

2.5将CC

2.6使用JCoffee-1.0工具补全CC

2.7判断CC′

2.8将CC′

2.9若n≥N,说明Bigclonebench数据集中的所有代码均已经过补全,令补全后的Data中数据总数M=n,将补全后的Data发送给代码中间表示提取模块,转第三步;否则转2.4;

第三步,代码中间表示提取模块从代码补全模块接收可编译代码集合Data,采用代码中间表示提取方法从Data中提取代码中间表示,构建代码中间表示集合IR。具体方法为:

3.1令代码中间表示集合IR={};

3.2令变量m=1;

3.3从Data中抽取第m个代码CC

3.4提取JAVA代码的代码中间表示,方法为:

3.4.1使用JavaC编译代码CC

3.4.2根据二进制文件Class

3.5利用LLVM-9.0工具编译代码CC

3.6若m>M,说明已为所有可编译代码提取代码中间表示,将代码中间表示集合IR发送至语义图构建模块,转第四步;若m≤M,转3.3。

第四步,语义图构建模块从代码表示提取模块接收代码中间表示集合IR,采用语义图集合构建方法根据IR构建语义图集合SG,方法为:

4.1令语义图集合SG={};

4.2令变量p=0;

4.3从IR中抽取第p个代码中间表示R

4.3.1初始化关键语义表示信息队列S

4.3.2初始化变量a=1,初始化标识flag=0;

4.3.3判断R

4.3.4令a=a+1,若a≤R

4.3.5将

4.3.6若

4.3.7令flag=1,表示开始存储中间表示关键指令信息,转4.3.10;

4.3.8若flag=1,将

4.3.9令flag=0,表示停止存储中间表示关键指令信息,转4.3.11;

4.3.10令a=a+1,转4.3.6;

4.3.11令a=a+1,若a小于R

4.3.12得到关键语义表示信息队列S

4.4语义图构建模块采用语义图构建方法根据S

4.4.1初始化语义图G

4.4.2语义图构建模块为G

4.4.2.1初始化变量k=1;

4.4.2.2判断S

4.4.2.3利用正则表达式从

4.4.2.4令k=k+1,若k大于S

4.4.3语义图构建模块为G

4.4.3.1初始化变量k=1;

4.4.3.2判断S

4.4.3.3利用正则表达式从

4.4.3.4令k=k+1,若k大于S

4.4.4语义图构建模块为语义图G

4.4.4.1初始化变量k=1;

4.4.4.2初始化变量u=1;

4.4.4.3判断S

4.4.4.4利用正则表达式从

4.4.4.5判断

4.4.4.6使用正则表达式从

4.4.4.7判断S

4.4.4.8使用正则表达式从

4.4.4.9判断S

4.4.4.10使用正则表达式从

4.4.4.11判断S

4.4.4.12使用正则表达式从

4.4.4.13判断S

4.4.4.14使用正则表达式从

4.4.4.15令k=k+1,若k大于S

4.5若p大于代码中间表示数据集IR的大小,则得到语义图集合SG,转第五步;否则令p=p+1,转4.3;

第五步,根据语义图集合SG制作代码向量生成模块所需的训练数据集。方法为:

5.1令变量i=1;

5.2初始化训练数据集TrainingSet={};

5.3随机从语义图集合SG中任意抽取两个语义图,令第i次抽取的语义图为

5.4令i=i+1,若i>10,000,则训练集制作完成,将训练数据集TrainingSet发送到代码向量生成模块,转第六步;否则转5.3;

第六步:采用TrainingSet训练代码向量生成模块,得到可以表示语义图信息的图匹配网络。具体方法是:

6.1设置训练图匹配网络所需参数。方法是:

6.1.1设置图匹配网络包含网络层数T=4;

6.1.2设置图匹配网络学习率ir=0.001;

6.1.3设置训练轮数num_epochs=50;

6.1.4初始化训练轮数epochs=0;

6.2令变量i=1;

6.3从训练数据集TrainingSet中抽取第i个数据D

6.4采用第一初始化方法初始化

6.4.1使用Word2vec模型初始化

6.4.2令

6.4.3令

6.5采用第二初始化方法初始化

6.5.1使用Word2vec模型初始化

6.5.2令

6.5.3令

6.6采用迭代更新方法更新第一语义图

6.6.1初始化变量t=1;

6.6.2从

6.6.3计算在第t次迭代时,

6.6.3.1从

6.6.3.2计算x与z的相似度α

6.6.3.3计算在第t次迭代时x与

6.6.4计算在第t次迭代时,第一语义图

6.6.4.1在

6.6.4.2判断边e

6.6.4.3计算

6.6.4.4计算在第t次迭代时,第一语义图

6.6.5更新

6.6.6令t=t+1。若t小于T,转6.6.2;否则说明迭代更新完毕,得到第一最终语义图

6.7采用6.6所述迭代更新方法更新

6.8计算

6.9计算

6.10利用余弦相似度函数比较V

6.11若Label

6.12若Label

6.13计算模型调整值Loss=-(1-SIM)×ir,将Loss输入word2vec模型,word2vec模型自动更新模型中的参数,转6.15;

6.14设置向量调整值Loss=(1-SIM)×ir,将Loss输入word2vec模型,word2vec模型自动更新模型中的参数,转6.15;

6.15令i=i+1,若i大于语义图数据集SG的大小,说明已训练完一轮,转6.16;否则转6.3;

6.16令epochs=epochs+1,若epochs等于num_epochs,说明训练完毕,得到了可以表示语义图信息的图匹配网络,也即得到了训练后的代码向量生成模块,转第七步;否则转6.2,开始新一轮训练;

第七步:使用代码克隆系统检测用户输入的一对待检测代码C

7.1令待检测代码集合Test={C

7.2代码补全模块采用第二步所述代码补全方法对待检测代码集合Test进行代码补全,得到补全后可编译的待检测代码集合Test_Data={C‘

7.3代码中间表示提取模块采用第三步所述代码中间表示提取方法从对Test_Data提取代码中间表示,构建待检测代码集合的代码中间表示集合Test_IR,Test_IR={R

7.4语义图生成模块采用第四步所述语义图集合构建方法根据Test_IR构建待检测代码集合的语义图集合Test_SG={G

7.5训练好的代码向量生成模块根据Test_SG中的第一语义图G

7.5.1采用6.4所述第一初始化方法初始化G

7.5.2采用6.6所述迭代更新方法迭代更新初始化语义图IG

7.5.3计算FG

7.5.4计算FG

7.6训练好的向量生成模块利用余弦相似度函数比较V

表1是本发明与其他代码克隆检测方法在BigCloneBench数据集上训练与测试结果的对比表。

表1

所有实验基于一台Ubuntu16.04操作系统,搭载2080TiGPU,主要编码语言为Python。在第四步主要利用python中Networkx库实现构建语义图,第五步中从Bigclonebench数据集中抽取10,000对代码作为训练集,在训练集中,克隆代码对与非克隆代码对比例为1:1,第六步中利用Pytorch库实现图匹配网络。

为了更高的评估本发明与背景技术之间的效果,选用准确率、召回率和F1值作为评估指标。准确率为克隆检测工具报告的克隆代码对中,判断正确的比例,召回率为克隆检测工具正确判断的克隆代码对,在所有克隆对中的占比。由于相似度阈值α的调节会导致召回率和准确率无法兼顾,例如调高相似度阈值α,会导致准确率提高,召回率下降。F1指标的计算为(准确率+召回率)/2×准确率×召回率,可以综合评估准确率和召回率。

根据实验结果显示,经过12小时的模型训练,可以有效的检测到BigCloneBench中超过44%的代码克隆(即可以找出44%占比的克隆代码对),并且保证58%的准确率(即找到的克隆代码对中有58%是真正的克隆代码对),F1值为0.50。而已有最优方法TBCCD在同等实验时,只能检测到37%代码克隆,且仅能取得31%的准确度,F1值仅为0.35。另一个常用克隆检测方法CCGRAPH只能检测到39%代码克隆,且仅能取得28%的准确度,F1值仅为0.32。因此本发明相比现有方法对代码克隆的检测准确率有较大提高。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号