代码克隆检测方法、装置以及电子设备转让专利

申请号 : CN201811295180.5

文献号 : CN111124487B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 傅珉杨昕立鄢萌李元平章修琳吴芮杨小虎

申请人 : 浙江大学

摘要 :

本申请公开了一种代码克隆检测方法,包括:获取至少两个版本的源代码组成的源代码集;将所述至少两个版本的源代码分别转换为对应的代码特征向量;将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。所述代码克隆检测方法,通过提取源代码各自的特征信息将其转换为代码特征向量,在代码特征向量的基础上利用集成分类模型实现克隆检测,从而降低了源代码的特征损失,在此基础上实现的代码克隆检测更加精准,同时也更具有效性。

权利要求 :

1.一种代码克隆检测方法,其特征在于,包括:获取至少两个版本的源代码组成的源代码集;

将所述至少两个版本的源代码分别转换为对应的代码特征向量;

将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果;

其中,所述集成分类模型是利用原始训练代码集中至少两个版本的训练源代码对应的训练特征向量进行模型训练获得的;

所述方法还包括:对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:通过比较所述正向训练数据与所述负向训练数据之比和目标比的大小,调整所述原始训练代码集;其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。

2.根据权利要求1所述的代码克隆检测方法,其特征在于,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量,包括:针对所述源代码集中至少两个版本的源代码,执行如下操作:基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;

构建所述代码字符单元的语义向量;

根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;

将所述源代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。

3.根据权利要求1所述的代码克隆检测方法,其特征在于,所述集成分类模型是利用原始训练代码集中至少两个版本的训练源代码对应的训练特征向量进行模型训练获得的,包括:

获取原始训练代码集中至少两个版本的训练源代码;

将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;

利用转换获得的至少两个训练特征向量进行模型训练。

4.根据权利要求1所述的代码克隆检测方法,其特征在于,所述对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:计算所述原始训练代码集中正向训练数据与负向训练数据之比;

若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加入所述原始训练代码集;

若所述正向训练数据与负向训练数据之比大于目标比,则在所述原始训练代码集随机选择正向训练数据加入所述原始训练代码集。

5.根据权利要求3所述的代码克隆检测方法,其特征在于,所述将所述至少两个版本的训练源代码分别转换为对应的训练特征向量,包括:基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库中的代码字符单元;

构建所述代码字符单元的语义向量;

根据所述训练源代码包含的代码字符单元的语义向量,生成所述训练源代码的语义矩阵;

将所述语义矩阵转换成语义向量,作为所述训练源代码对应的训练特征向量。

6.根据权利要求1至5任意一项所述的代码克隆检测方法,其特征在于,所述克隆检测结果携带所述至少两个版本源代码之间的代码克隆类型;

其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语法克隆和语义克隆。

7.根据权利要求6所述的代码克隆检测方法,其特征在于,所述集成分类模型包括:采用集成学习方法训练获得的随机森林分类模型;

其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:决策树、朴素贝叶斯、支持向量机、线性判别分析和k‑近邻分类器;

所述随机森林分类模型的集成方法采用下述至少一项:装袋、增强和堆叠。

8.根据权利要求6所述的代码克隆检测方法,其特征在于,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量步骤,采用词嵌入技术将源代码集中至少两个版本的源代码分别转换为对应的所述代码特征向量;

其中,所述词嵌入技术包括下述至少一项:词向量化和文本向量化。

9.一种代码克隆检测装置,其特征在于,包括:获取源代码集单元,用于获取至少两个版本的源代码组成的源代码集;

代码特征向量转换单元,用于将所述至少两个版本的源代码分别转换为对应的代码特征向量;

克隆检测单元,用于将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果;

其中,所述集成分类模型是利用原始训练代码集中至少两个版本的训练源代码对应的训练特征向量进行模型训练获得的;

所述装置还包括:对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:通过比较所述正向训练数据与所述负向训练数据之比和目标比的大小,调整所述原始训练代码集;其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。

10.一种电子设备,其特征在于,包括:存储器和处理器;

所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:

获取至少两个版本的源代码组成的源代码集;

将所述至少两个版本的源代码分别转换为对应的代码特征向量;

将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果;

其中,所述集成分类模型是利用原始训练代码集中至少两个版本的训练源代码对应的训练特征向量进行模型训练获得的;

所述设备还包括:对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:通过比较所述正向训练数据与所述负向训练数据之比和目标比的大小,调整所述原始训练代码集;其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。

说明书 :

代码克隆检测方法、装置以及电子设备

技术领域

[0001] 本申请涉及软件克隆技术领域,具体涉及一种代码克隆检测方法。本申请同时涉及一种代码克隆检测装置,以及一种电子设备。

背景技术

[0002] 随着软件系统规模的日趋扩大化和复杂化,软件开发工作也越来越繁重,在软件开发过程中,软件开发人员经常参照已有代码来实现类似功能,或者直接通过复制粘贴来
“复用”已有代码,生成许多语义和功能上类似的代码,这就是代码克隆。尽管这种重用代码
的方式在某种程度上能提高软件开发效率,但代码克隆却导致软件Bug(漏洞)的扩散,同时
也导致软件维护难度加大,甚至会触发许可违规的风险;因此,代码克隆检测也随着软件的
维护和发展变得愈加重要。
[0003] 目前,已提出许多代码克隆检测的方法和工具,这些方法和工具主要可分为三类:基于文本的代码克隆检测、基于标记的代码克隆检测以及基于树的代码克隆检测。其中,基
于文本的代码克隆检测工具主要有NiCad Clone Detector,该工具首先对源代码进行了少
量预处理,即格式化和标准化排版,然后通过简单的文本行比较来对潜在克隆代码进行动
态聚类。基于标记的代码克隆检测工具主要有CCFinder和SourcererCC,二者均是在标记的
基础上实现代码克隆检测。基于树的代码克隆检测工具主要有DECKARD,通过识别出AST
(abstract syntax tree,抽象语法树)相似的代码来进行代码克隆检测。
[0004] 上述提供的代码克隆检测工具虽然比较实用,但只能通过检测文本、标记以及树(语法)级别的相似性来检测代码克隆,对于语义相似但语法未必相似的代码,无法实现语
义级别的代码克隆检测,存在较大的缺陷。

发明内容

[0005] 本申请提供一种代码克隆检测方法,以解决现有技术存在的缺陷。本申请同时涉及一种代码克隆检测装置,以及一种电子设备。
[0006] 本申请提供一种代码克隆检测方法,包括:
[0007] 获取至少两个版本的源代码组成的源代码集;
[0008] 将所述至少两个版本的源代码分别转换为对应的代码特征向量;
[0009] 将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
[0010] 可选的,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量,包括:
[0011] 针对所述源代码集中至少两个版本的源代码,执行如下操作:
[0012] 基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;
[0013] 构建所述代码字符单元的语义向量;
[0014] 根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;
[0015] 将所述源代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。
[0016] 可选的,所述集成分类模型,采用如下方式训练获得:
[0017] 获取原始训练代码集中至少两个版本的训练源代码;
[0018] 将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;
[0019] 利用转换获得的至少两个训练特征向量进行模型训练。
[0020] 可选的,所述利用转换获得的至少两个训练特征向量进行模型训练子步骤执行之前,包括:
[0021] 对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理;
[0022] 其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。
[0023] 可选的,所述对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:
[0024] 计算所述原始训练代码集中正向训练数据与负向训练数据之比;
[0025] 若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加入所述原始训练代码集;
[0026] 若所述正向训练数据与负向训练数据之比大于目标比,则在所述原始训练代码集随机选择正向训练数据加入所述原始训练代码集。
[0027] 可选的,所述将所述至少两个版本的训练源代码分别转换为对应的训练特征向量,包括:
[0028] 基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库中的代码字符单元;
[0029] 构建所述代码字符单元的语义向量;
[0030] 根据所述训练源代码包含的代码字符单元的语义向量,生成所述训练源代码的语义矩阵;
[0031] 将所述语义矩阵转换成语义向量,作为所述训练源代码对应的训练特征向量。
[0032] 可选的,所述克隆检测结果携带所述至少两个版本源代码之间的代码克隆类型;
[0033] 其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语法克隆和语义克隆。
[0034] 可选的,所述集成分类模型包括:采用集成学习方法训练获得的随机森林分类模型;
[0035] 其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:决策树、朴素贝叶斯、支持向量机、线性判别分析和k‑近邻分类器;
[0036] 所述随机森林分类模型的集成方法采用下述至少一项:装袋、增强和堆叠。
[0037] 可选的,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量步骤,采用词嵌入技术将源代码集中至少两个版本的源代码分别转换为对应的所述代码特征
向量;
[0038] 其中,所述词嵌入技术包括下述至少一项:词向量化和文本向量化。
[0039] 本申请还提供一种代码克隆检测装置,包括:
[0040] 获取源代码集单元,用于获取至少两个版本的源代码组成的源代码集;
[0041] 代码特征向量转换单元,用于将所述至少两个版本的源代码分别转换为对应的代码特征向量;
[0042] 克隆检测单元,用于将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
[0043] 本申请还提供一种电子设备,包括:
[0044] 存储器和处理器;
[0045] 所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
[0046] 获取至少两个版本的源代码组成的源代码集;
[0047] 将所述至少两个版本的源代码分别转换为对应的代码特征向量;
[0048] 将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
[0049] 与现有技术相比,本申请具有如下优点:
[0050] 本申请提供的所述代码克隆检测方法,包括:获取至少两个版本的源代码组成的源代码集;将所述至少两个版本的源代码分别转换为对应的代码特征向量;将所述至少两
个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结
果。
[0051] 本申请提供的所述代码克隆检测方法,在对至少两个版本的源代码进行克隆检测的过程中,通过提取至少两个版本的源代码各自的特征信息来将源代码转换为各自对应的
代码特征向量,在代码特征向量的基础上利用集成分类模型实现至少两个版本的源代码之
间的克隆检测,从而降低了源代码的特征损失,在此基础上实现的代码克隆检测更加精准,
同时也更具有效性。

附图说明

[0052] 附图1是本申请提供的一种代码克隆检测方法实施例的处理流程图;
[0053] 附图2是本申请提供的一种代码克隆检测框架的示意图;
[0054] 附图3是本申请提供的一种代码克隆检测装置实施例的示意图;
[0055] 附图4是本申请提供的一种电子设备的示意图。

具体实施方式

[0056] 在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其他方式来实施,本领域技术人员可以在不违背本申请内涵的情况
下做类似推广,因此本申请不受下面公开的具体实施的限制。
[0057] 本申请提供一种代码克隆检测方法,本申请还提供一种代码克隆检测装置,以及一种电子设备。以下分别结合本申请提供的实施例的附图逐一进行详细说明,并且对方法
的各个步骤进行说明。
[0058] 本申请提供的一种代码克隆检测方法实施例如下:
[0059] 参照附图1,其示出了本申请提供的一种代码克隆检测方法实施例的处理流程图,参照附图2,其示出了本申请提供的一种代码克隆检测框架的示意图。
[0060] 步骤S101,获取至少两个版本的源代码组成的源代码集。
[0061] 一般而言,代码克隆可根据其相似程度分为4个类型:(1)Type‑1型,该类型的多个版本源代码除了注释和布局之外,多个版本的源代码片段完全相同,可称之为文本克隆类
型;(2)Type‑2型,该类型的多个版本源代码除了上述文本克隆类型的差异之外,多个版本
的源代码片段在标识符名称和字面常量值方面也存在差异,可称之为标记克隆类型;(3)
Type‑3型,该类型的多个版本源代码除了上述标记克隆类型的差异之外,多个版本的源代
码片段还添加、修改和删除了相关的语句,即多个版本的代码片段在语法层面具有相似性,
可称之为语法克隆类型;(4)Type‑4型,该类型的多个版本源代码除了上述语法克隆类型的
差异之外,多个版本的源代码片段虽然实现相同的功能,但在语法上不具相似性,可称之为
语义克隆类型。目前虽然在文本克隆、标记克隆、语法克隆检测层面提出许多代码克隆检测
方法和工具,甚至提出利用深度学习模型用以进行代码克隆检测,但在模型训练、代码克隆
的检测效率以及检测精度方面仍有改进空间,具体体现为对规模稍大的源代码片段没有好
的扩展性,原因在于深度学习模型在模型训练上耗费的时间较长。
[0062] 本申请提供的代码克隆检测方法,不使用复杂的深度学习模型,而是通过集成学习来训练模型,从而使训练获得的集成分类模型更具有效性和扩展性,同时,该方法通过维
护多个版本源代码的原始特征信息,利用词嵌入技术来挖掘源代码中的词法、句法等特征
信息,在提取源代码的特征信息的技术上将其转换为特征向量,并使用训练开销更小的集
成分类模型来学习特征向量中源代码的特征信息,从而降低了源代码的信息损失,保留了
源代码更加完整特征信息,在此基础上实现了更加精准和更加有效的代码克隆检测效果。
[0063] 需要说明的是,本申请提供的代码克隆检测方法,可实现两个版本以及两个版本以上源代码之间的相似性检测,本申请实施例以两个版本源代码的克隆检测为例进行说
明,三个、四个甚至更多版本的源代码克隆检测,具体实现过程与两个版本的源代码克隆检
测类似,参见本申请实施例提供的两个版本源代码的克隆检测即可,本实施例对此不再赘
述。除此之外,具体实施时,还可将三个、四个甚至更多版本的源代码进行两两组合,从而将
三个、四个甚至更多版本的源代码的克隆检测转换为两个版本的克隆检测。
[0064] 实际应用中,本申请实施例提供的所述代码克隆检测方法,包括将至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测这一源代码克隆检测环节,
还包括根据训练数据训练集成分类模型这一集成分类模型训练环节,并且源代码克隆检测
环节和集成分类模型训练环节可交叉进行,在源代码克隆检测过程中不断对集成分类模型
进行训练,从而不断完善集成分类模型对源代码检测的准确度。比如,对于代码克隆检测,
每天可能会提交许多需要进行检测的源代码,这些源代码为进行克隆检测相互之间进行匹
配的数目可能会非常大,因此,模型训练时间和代码克隆检测时间都很重要,模型训练时间
应确保集成分类模型可以每天更新,代码克隆检测时间应确保所有日常提交的源代码对可
及时检测为克隆或非克隆。
[0065] 本实施例中,结合附图2首先对集成分类模型训练环节进行详细说明。在集成分类模型训练环节,目标是通过集成学习来构建集成分类模型,并从已知是否为克隆/非克隆的
源代码样本中训练出有高可信特征的集成分类模型,本申请实施例提供的一种优选实施方
式中,采用如下方式进行集成分类模型的训练:
[0066] (1)获取原始训练代码集中至少两个版本的训练源代码;
[0067] 所述原始训练代码集即是指集成分类模型的训练样本集合,该原始训练代码集中每一组至少两个版本的训练源代码即为模型训练的一个训练样本,并且需要指出的是,原
始训练代码集中每一组至少两个版本的训练源代码是否为克隆/非克隆是已知的,从而利
用原始训练代码集中已知的训练样本进行模型训练。
[0068] 例如,原始训练代码集中源代码两两成对,并且每一个源代码对被标记为克隆/非克隆,可将每一个已知克隆/非克隆的源代码对视为模型训练的一个训练样本。
[0069] 优选的,本申请实施例所述集成分类模型,是指采用集成学习方法训练获得的随机森林分类模型;其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:
决策树、朴素贝叶斯、支持向量机、线性判别分析和k‑近邻分类器;所述随机森林分类模型
的集成方法采用下述至少一项:装袋、增强和堆叠。
[0070] 例如,将决策树和装袋法(Bagging)结合起来构建随机森林分类模型,其中,决策树使用一组特征进行分层决策,以树状结构排列,同时在树构建过程中能够快速找到最能
区分不同类别的特征变量作为分支属性。此外,决策树还可以为不同的类生成相应的显式
规则。为避免应对所有情况需构建非常大的决策树,节省时间和空间成本,利用集成学习,
期望建立一些中等规模的决策树来取代一个巨大的决策树,具体是使用装袋法(Bagging)
来建立随机森林。随机森林是一种基于决策树的先进集成技术,随机森林通过将随机性引
入每个决策树的模型构建过程,从而使决策树具有较少的相关性,在此基础上利用装袋法
(Bagging)实现的集成性能更好。
[0071] (2)将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;
[0072] 优选的,将所述至少两个版本的训练源代码分别转换为对应的训练特征向量,采用如下方式实现:基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库
中的代码字符单元;构建所述代码字符单元的语义向量;根据所述训练源代码包含的代码
字符单元的语义向量,生成所述训练源代码的语义矩阵;将所述语义矩阵转换成语义向量,
作为所述训练源代码对应的训练特征向量。
[0073] 需要说明的是,此处集成分类模型训练过程中将至少两个版本的训练源代码分别转换为对应的训练特征向量,与下述步骤S102将所述至少两个版本的源代码分别转换为对
应的代码特征向量,优选可采用同一词嵌入技术实现,其中,所述词嵌入技术包括下述至少
一项:词向量化(Word2Vec)和文本向量化(Doc2Vec)。
[0074] 例如,利用词嵌入技术并结合词向量化(Word2Vec)中的一个模型(skip‑gram模型)将每个源代码转换为其对应的代码特征向量,具体实现如下:
[0075] 给定源代码中的标记t(例如,源代码中的字符),将标记t的周围标记(例如,给定标记的相邻单词)的集合表示为Ct。skip‑gram模型的目标函数J(需要最大化)是在给定标
记条件下周围标记出现的概率对数的总和,目标函数J可表示为:
[0076]
[0077] 其中,n表示标记序列的整个长度。此外,p(tj|ti)为使用下述softmax函数定义的条件概率:
[0078]
[0079] 其中,vt为标记t的向量表示,T为所有标记的词汇表。
[0080] 对于代码字符语料库中的每个字符,均可以表示为d维向量其中d是可变参数,并且通常设置为整数(比如100)。利用skip‑gram模型,每个标记都被转换为固定长度的向量
(即d维向量),在此基础上,可将源代码表示为矩阵,其中每行代表一个标记。由于不同的源
代码具有不同数量的标记,因而难以将表示源代码的矩阵直接输入到集成分类模型中,通
过对源代码包含的所有标记向量取平均值,将表示源代码的矩阵转换为向量。
[0081] 平均值基于向量中每个维度的数值计算获得,具体的,给定总共n行的源代码矩阵,将矩阵的第i行表示为ri,并且按如下方式生成变换后的源代码的向量vd:
[0082]
[0083] 通过上述方式,可将每个源代码表示为向量,即字符特征向量,通过该符特征向量表示源代码的特征。
[0084] (3)利用转换获得的至少两个训练特征向量进行模型训练。
[0085] 使用上述转换获得的源代码对应的训练特征向量可以构建集成分类模型,但在集成分类模型构建过程中,如果原始训练代码集中的训练样本不平衡(存在克隆代码的训练
样本数目和不存在克隆代码的训练样本数目差距较大,比如实际中),将会直接影响训练获
得的集成分类模型的检测精度和准确性。因此,在构建集成分类模型之前,需要对原始训练
代码集中的训练样本进行平衡处理,以此训练出更准确的集成分类模型。
[0086] 本申请实施例提供的一种优选实施方式中,在构建集成分类模型之前,对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理;其中,所述正向训练数据是
指所述至少两个版本的训练源代码存在克隆代码(例如,两个版本的源代码对为克隆代
码),所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码(例如,两个
版本的源代码对不是克隆代码)。
[0087] 优选的,所述对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,采用如下方式实现:
[0088] 计算所述原始训练代码集中正向训练数据与负向训练数据之比;若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加
入所述原始训练代码集;若所述正向训练数据与负向训练数据之比大于目标比,则在所述
原始训练代码集随机选择正向训练数据加入所述原始训练代码集。
[0089] 例如,采用过采样平衡原始训练代码集中的正向训练数据和负向训练数据,首先设置目标比p,目标比p的定义是少数类的训练数据占总训练数据量的目标比例。然后重复
下述两个步骤,直至少数类的训练数据与总训练数据量比率增加至目标比p:
[0090] 步骤一:随机选择原始训练代码集中属于少数类的训练数据;
[0091] 步骤二:将步骤一选择的训练数据添加到原始训练代码集中。
[0092] 步骤S102,将所述至少两个版本的源代码分别转换为对应的代码特征向量。
[0093] 本申请实施例提供的一种优选实施方式中,将所述至少两个版本的源代码分别转换为对应的代码特征向量,采用如下方式实现:
[0094] 针对所述源代码集中至少两个版本的源代码,执行如下操作:基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;构建所述代码字符单
元的语义向量;根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;将所述源
代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。
[0095] 需要说明的是,本步骤将所述至少两个版本的源代码分别转换为对应的代码特征向量,与上述集成分类模型训练过程中将至少两个版本的训练源代码分别转换为对应的训
练特征向量所采用的词嵌入技术一致,所述至少两个版本的源代码分别转换为对应的代码
特征向量的具体实现过程参见上述集成分类模型训练过程中将至少两个版本的训练源代
码分别转换为对应的训练特征向量的具体说明即可,此处不再赘述。
[0096] 步骤S103,将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
[0097] 如上所述,在上述步骤S102转换获得的所述至少两个版本的源代码对应的代码特征向量的基础上,将代码特征向量输入上述训练获得的集成分类模型进行克隆检测,即检
测所述至少两个版本的源代码之间是否存在代码克隆,集成分类模型在检测完毕后输出所
述至少两个版本的源代码之间是否存在代码克隆的克隆检测结果。
[0098] 优选的,所述集成分类模型输出的克隆检测结果还携带所述至少两个版本源代码之间的代码克隆类型;其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语
法克隆和语义克隆。
[0099] 例如,将待检测的两个版本的源代码对各自对应的代码特征向量输入随机森林分类模型,若经随机森林分类模型检测后这两个版本的源代码的代码相似度在[0.7,1]之间,
则随机森林分类模型输出这两个版本的源代码的克隆检测结果为文本克隆;若经随机森林
分类模型检测后这两个版本的源代码的代码相似度在[0.5,0.7]之间,则随机森林分类模
型输出这两个版本的源代码的克隆检测结果为标记克隆;若经随机森林分类模型检测后这
两个版本的源代码的代码相似度在[0,0.5]之间,则随机森林分类模型输出这两个版本的
源代码的克隆检测结果为语法克隆或者语义克隆。
[0100] 综上所述,所述代码克隆检测方法,在对至少两个版本的源代码进行克隆检测的过程中,通过提取至少两个版本的源代码各自的特征信息来将源代码转换为各自对应的代
码特征向量,在代码特征向量的基础上利用集成分类模型实现至少两个版本的源代码之间
的克隆检测,从而降低了源代码的特征信息损失,在此基础上实现的代码克隆检测更加精
准,同时也更具有效性。
[0101] 本申请提供的一种代码克隆检测装置实施例如下:
[0102] 在上述的实施例中,提供了一种代码克隆检测方法,与之相对应的,本申请还提供了一种代码克隆检测装置,下面结合附图进行说明。
[0103] 参照附图3,其示出了本申请提供的一种代码克隆检测装置实施例的示意图。
[0104] 由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关的部分请参见上述提供的方法实施例的对应说明即可。下述描述的装置实施例仅仅是示意性的。
[0105] 本申请提供一种代码克隆检测装置,包括:
[0106] 获取源代码集单元301,用于获取至少两个版本的源代码组成的源代码集;
[0107] 代码特征向量转换单元302,用于将所述至少两个版本的源代码分别转换为对应的代码特征向量;
[0108] 克隆检测单元303,用于将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
[0109] 可选的,所述代码特征向量转换单元302,具体用于针对所述源代码集中至少两个版本的源代码,执行下述子单元:
[0110] 代码字符单元提取子单元,用于基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;
[0111] 语义向量构建子单元,用于构建所述代码字符单元的语义向量;
[0112] 语义矩阵生成子单元,用于根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;
[0113] 语义向量转换子单元,用于将所述源代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。
[0114] 可选的,所述集成分类模型,通过执行下述单元训练获得:
[0115] 训练源代码获取单元,用于获取原始训练代码集中至少两个版本的训练源代码;
[0116] 训练特征向量转换单元,用于将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;
[0117] 模型训练单元,用于利用转换获得的至少两个训练特征向量进行模型训练。
[0118] 可选的,所述集成分类模型,还通过执行下述单元训练获得:
[0119] 训练数据平衡处理单元,用于对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理;
[0120] 其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。
[0121] 可选的,所述训练数据平衡处理单元,具体用于计算所述原始训练代码集中正向训练数据与负向训练数据之比;
[0122] 若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加入所述原始训练代码集;
[0123] 若所述正向训练数据与负向训练数据之比大于目标比,则在所述原始训练代码集随机选择正向训练数据加入所述原始训练代码集。
[0124] 可选的,所述训练特征向量转换单元,包括:
[0125] 提取子单元,用于基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库中的代码字符单元;
[0126] 向量构建子单元,用于构建所述代码字符单元的语义向量;
[0127] 矩阵生成子单元,用于根据所述训练源代码包含的代码字符单元的语义向量,生成所述训练源代码的语义矩阵;
[0128] 训练特征向量生成子单元,用于将所述语义矩阵转换成语义向量,作为所述训练源代码对应的训练特征向量。
[0129] 可选的,所述克隆检测结果携带所述至少两个版本源代码之间的代码克隆类型;
[0130] 其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语法克隆和语义克隆。
[0131] 可选的,所述集成分类模型包括:采用集成学习方法训练获得的随机森林分类模型;
[0132] 其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:决策树、朴素贝叶斯、支持向量机、线性判别分析和k‑近邻分类器;
[0133] 所述随机森林分类模型的集成方法采用下述至少一项:装袋、增强和堆叠。
[0134] 可选的,所述代码特征向量转换单元302,采用词嵌入技术将源代码集中至少两个版本的源代码分别转换为对应的所述代码特征向量;
[0135] 其中,所述词嵌入技术包括下述至少一项:词向量化和文本向量化。
[0136] 本申请提供的一种电子设备实施例如下:
[0137] 在上述的实施例中,提供了一种代码克隆检测方法,此外,本申请还提供了一种用于实现所述代码克隆检测方法的电子设备,下面结合附图进行说明。
[0138] 参照附图4,其示出了本实施例提供的一种电子设备的示意图。
[0139] 本申请提供的所述电子设备实施例描述得比较简单,相关的部分请参见上述提供的所述代码克隆检测方法实施例的对应说明即可。下述描述的实施例仅仅是示意性的。
[0140] 本申请提供一种电子设备,包括:
[0141] 存储器401和处理器402;
[0142] 所述存储器401用于存储计算机可执行指令,所述处理器402用于执行如下计算机可执行指令:
[0143] 获取至少两个版本的源代码组成的源代码集;
[0144] 将所述至少两个版本的源代码分别转换为对应的代码特征向量;
[0145] 将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
[0146] 可选的,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量,包括:
[0147] 针对所述源代码集中至少两个版本的源代码,执行如下操作:
[0148] 基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;
[0149] 构建所述代码字符单元的语义向量;
[0150] 根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;
[0151] 将所述源代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。
[0152] 可选的,所述集成分类模型,采用如下方式训练获得:
[0153] 获取原始训练代码集中至少两个版本的训练源代码;
[0154] 将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;
[0155] 利用转换获得的至少两个训练特征向量进行模型训练。
[0156] 可选的,所述利用转换获得的至少两个训练特征向量进行模型训练指令执行之前,所述处理器402还用于执行如下计算机可执行指令:
[0157] 对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理;
[0158] 其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。
[0159] 可选的,所述对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:
[0160] 计算所述原始训练代码集中正向训练数据与负向训练数据之比;
[0161] 若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加入所述原始训练代码集;
[0162] 若所述正向训练数据与负向训练数据之比大于目标比,则在所述原始训练代码集随机选择正向训练数据加入所述原始训练代码集。
[0163] 可选的,所述将所述至少两个版本的训练源代码分别转换为对应的训练特征向量,包括:
[0164] 基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库中的代码字符单元;
[0165] 构建所述代码字符单元的语义向量;
[0166] 根据所述训练源代码包含的代码字符单元的语义向量,生成所述训练源代码的语义矩阵;
[0167] 将所述语义矩阵转换成语义向量,作为所述训练源代码对应的训练特征向量。
[0168] 可选的,所述克隆检测结果携带所述至少两个版本源代码之间的代码克隆类型;
[0169] 其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语法克隆和语义克隆。
[0170] 可选的,所述集成分类模型包括:采用集成学习方法训练获得的随机森林分类模型;
[0171] 其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:决策树、朴素贝叶斯、支持向量机、线性判别分析和k‑近邻分类器;
[0172] 所述随机森林分类模型的集成方法采用下述至少一项:装袋、增强和堆叠。
[0173] 可选的,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量指令,采用词嵌入技术将源代码集中至少两个版本的源代码分别转换为对应的所述代码特征
向量;
[0174] 其中,所述词嵌入技术包括下述至少一项:词向量化和文本向量化。
[0175] 本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保
护范围应当以本申请权利要求所界定的范围为准。
[0176] 在一个典型的配置中,计算设备包括一个或多个处理器、输入/输出接口、网络接口和内存。
[0177] 内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的
示例。
[0178] 计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。
计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动
态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除
可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD‑ROM)、
数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备
或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算
机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0179] 本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的
形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存
储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形
式。