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

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

Info

Publication number
CN111124487B
CN111124487B CN201811295180.5A CN201811295180A CN111124487B CN 111124487 B CN111124487 B CN 111124487B CN 201811295180 A CN201811295180 A CN 201811295180A CN 111124487 B CN111124487 B CN 111124487B
Authority
CN
China
Prior art keywords
code
training
versions
source
training data
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.)
Active
Application number
CN201811295180.5A
Other languages
English (en)
Other versions
CN111124487A (zh
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.)
Zhejiang University ZJU
Original Assignee
Zhejiang University ZJU
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 Zhejiang University ZJU filed Critical Zhejiang University ZJU
Priority to CN201811295180.5A priority Critical patent/CN111124487B/zh
Publication of CN111124487A publication Critical patent/CN111124487A/zh
Application granted granted Critical
Publication of CN111124487B publication Critical patent/CN111124487B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

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

Description

代码克隆检测方法、装置以及电子设备
技术领域
本申请涉及软件克隆技术领域,具体涉及一种代码克隆检测方法。本申请同时涉及一种代码克隆检测装置,以及一种电子设备。
背景技术
随着软件***规模的日趋扩大化和复杂化,软件开发工作也越来越繁重,在软件开发过程中,软件开发人员经常参照已有代码来实现类似功能,或者直接通过复制粘贴来“复用”已有代码,生成许多语义和功能上类似的代码,这就是代码克隆。尽管这种重用代码的方式在某种程度上能提高软件开发效率,但代码克隆却导致软件Bug(漏洞)的扩散,同时也导致软件维护难度加大,甚至会触发许可违规的风险;因此,代码克隆检测也随着软件的维护和发展变得愈加重要。
目前,已提出许多代码克隆检测的方法和工具,这些方法和工具主要可分为三类:基于文本的代码克隆检测、基于标记的代码克隆检测以及基于树的代码克隆检测。其中,基于文本的代码克隆检测工具主要有NiCad Clone Detector,该工具首先对源代码进行了少量预处理,即格式化和标准化排版,然后通过简单的文本行比较来对潜在克隆代码进行动态聚类。基于标记的代码克隆检测工具主要有CCFinder和SourcererCC,二者均是在标记的基础上实现代码克隆检测。基于树的代码克隆检测工具主要有DECKARD,通过识别出AST(abstract syntax tree,抽象语法树)相似的代码来进行代码克隆检测。
上述提供的代码克隆检测工具虽然比较实用,但只能通过检测文本、标记以及树(语法)级别的相似性来检测代码克隆,对于语义相似但语法未必相似的代码,无法实现语义级别的代码克隆检测,存在较大的缺陷。
发明内容
本申请提供一种代码克隆检测方法,以解决现有技术存在的缺陷。本申请同时涉及一种代码克隆检测装置,以及一种电子设备。
本申请提供一种代码克隆检测方法,包括:
获取至少两个版本的源代码组成的源代码集;
将所述至少两个版本的源代码分别转换为对应的代码特征向量;
将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
可选的,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量,包括:
针对所述源代码集中至少两个版本的源代码,执行如下操作:
基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;
构建所述代码字符单元的语义向量;
根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;
将所述源代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。
可选的,所述集成分类模型,采用如下方式训练获得:
获取原始训练代码集中至少两个版本的训练源代码;
将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;
利用转换获得的至少两个训练特征向量进行模型训练。
可选的,所述利用转换获得的至少两个训练特征向量进行模型训练子步骤执行之前,包括:
对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理;
其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。
可选的,所述对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:
计算所述原始训练代码集中正向训练数据与负向训练数据之比;
若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加入所述原始训练代码集;
若所述正向训练数据与负向训练数据之比大于目标比,则在所述原始训练代码集随机选择正向训练数据加入所述原始训练代码集。
可选的,所述将所述至少两个版本的训练源代码分别转换为对应的训练特征向量,包括:
基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库中的代码字符单元;
构建所述代码字符单元的语义向量;
根据所述训练源代码包含的代码字符单元的语义向量,生成所述训练源代码的语义矩阵;
将所述语义矩阵转换成语义向量,作为所述训练源代码对应的训练特征向量。
可选的,所述克隆检测结果携带所述至少两个版本源代码之间的代码克隆类型;
其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语法克隆和语义克隆。
可选的,所述集成分类模型包括:采用集成学习方法训练获得的随机森林分类模型;
其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:决策树、朴素贝叶斯、支持向量机、线性判别分析和k-近邻分类器;
所述随机森林分类模型的集成方法采用下述至少一项:装袋、增强和堆叠。
可选的,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量步骤,采用词嵌入技术将源代码集中至少两个版本的源代码分别转换为对应的所述代码特征向量;
其中,所述词嵌入技术包括下述至少一项:词向量化和文本向量化。
本申请还提供一种代码克隆检测装置,包括:
获取源代码集单元,用于获取至少两个版本的源代码组成的源代码集;
代码特征向量转换单元,用于将所述至少两个版本的源代码分别转换为对应的代码特征向量;
克隆检测单元,用于将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
本申请还提供一种电子设备,包括:
存储器和处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
获取至少两个版本的源代码组成的源代码集;
将所述至少两个版本的源代码分别转换为对应的代码特征向量;
将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
与现有技术相比,本申请具有如下优点:
本申请提供的所述代码克隆检测方法,包括:获取至少两个版本的源代码组成的源代码集;将所述至少两个版本的源代码分别转换为对应的代码特征向量;将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
本申请提供的所述代码克隆检测方法,在对至少两个版本的源代码进行克隆检测的过程中,通过提取至少两个版本的源代码各自的特征信息来将源代码转换为各自对应的代码特征向量,在代码特征向量的基础上利用集成分类模型实现至少两个版本的源代码之间的克隆检测,从而降低了源代码的特征损失,在此基础上实现的代码克隆检测更加精准,同时也更具有效性。
附图说明
附图1是本申请提供的一种代码克隆检测方法实施例的处理流程图;
附图2是本申请提供的一种代码克隆检测框架的示意图;
附图3是本申请提供的一种代码克隆检测装置实施例的示意图;
附图4是本申请提供的一种电子设备的示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其他方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
本申请提供一种代码克隆检测方法,本申请还提供一种代码克隆检测装置,以及一种电子设备。以下分别结合本申请提供的实施例的附图逐一进行详细说明,并且对方法的各个步骤进行说明。
本申请提供的一种代码克隆检测方法实施例如下:
参照附图1,其示出了本申请提供的一种代码克隆检测方法实施例的处理流程图,参照附图2,其示出了本申请提供的一种代码克隆检测框架的示意图。
步骤S101,获取至少两个版本的源代码组成的源代码集。
一般而言,代码克隆可根据其相似程度分为4个类型:(1)Type-1型,该类型的多个版本源代码除了注释和布局之外,多个版本的源代码片段完全相同,可称之为文本克隆类型;(2)Type-2型,该类型的多个版本源代码除了上述文本克隆类型的差异之外,多个版本的源代码片段在标识符名称和字面常量值方面也存在差异,可称之为标记克隆类型;(3)Type-3型,该类型的多个版本源代码除了上述标记克隆类型的差异之外,多个版本的源代码片段还添加、修改和删除了相关的语句,即多个版本的代码片段在语法层面具有相似性,可称之为语法克隆类型;(4)Type-4型,该类型的多个版本源代码除了上述语法克隆类型的差异之外,多个版本的源代码片段虽然实现相同的功能,但在语法上不具相似性,可称之为语义克隆类型。目前虽然在文本克隆、标记克隆、语法克隆检测层面提出许多代码克隆检测方法和工具,甚至提出利用深度学习模型用以进行代码克隆检测,但在模型训练、代码克隆的检测效率以及检测精度方面仍有改进空间,具体体现为对规模稍大的源代码片段没有好的扩展性,原因在于深度学习模型在模型训练上耗费的时间较长。
本申请提供的代码克隆检测方法,不使用复杂的深度学习模型,而是通过集成学习来训练模型,从而使训练获得的集成分类模型更具有效性和扩展性,同时,该方法通过维护多个版本源代码的原始特征信息,利用词嵌入技术来挖掘源代码中的词法、句法等特征信息,在提取源代码的特征信息的技术上将其转换为特征向量,并使用训练开销更小的集成分类模型来学习特征向量中源代码的特征信息,从而降低了源代码的信息损失,保留了源代码更加完整特征信息,在此基础上实现了更加精准和更加有效的代码克隆检测效果。
需要说明的是,本申请提供的代码克隆检测方法,可实现两个版本以及两个版本以上源代码之间的相似性检测,本申请实施例以两个版本源代码的克隆检测为例进行说明,三个、四个甚至更多版本的源代码克隆检测,具体实现过程与两个版本的源代码克隆检测类似,参见本申请实施例提供的两个版本源代码的克隆检测即可,本实施例对此不再赘述。除此之外,具体实施时,还可将三个、四个甚至更多版本的源代码进行两两组合,从而将三个、四个甚至更多版本的源代码的克隆检测转换为两个版本的克隆检测。
实际应用中,本申请实施例提供的所述代码克隆检测方法,包括将至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测这一源代码克隆检测环节,还包括根据训练数据训练集成分类模型这一集成分类模型训练环节,并且源代码克隆检测环节和集成分类模型训练环节可交叉进行,在源代码克隆检测过程中不断对集成分类模型进行训练,从而不断完善集成分类模型对源代码检测的准确度。比如,对于代码克隆检测,每天可能会提交许多需要进行检测的源代码,这些源代码为进行克隆检测相互之间进行匹配的数目可能会非常大,因此,模型训练时间和代码克隆检测时间都很重要,模型训练时间应确保集成分类模型可以每天更新,代码克隆检测时间应确保所有日常提交的源代码对可及时检测为克隆或非克隆。
本实施例中,结合附图2首先对集成分类模型训练环节进行详细说明。在集成分类模型训练环节,目标是通过集成学习来构建集成分类模型,并从已知是否为克隆/非克隆的源代码样本中训练出有高可信特征的集成分类模型,本申请实施例提供的一种优选实施方式中,采用如下方式进行集成分类模型的训练:
(1)获取原始训练代码集中至少两个版本的训练源代码;
所述原始训练代码集即是指集成分类模型的训练样本集合,该原始训练代码集中每一组至少两个版本的训练源代码即为模型训练的一个训练样本,并且需要指出的是,原始训练代码集中每一组至少两个版本的训练源代码是否为克隆/非克隆是已知的,从而利用原始训练代码集中已知的训练样本进行模型训练。
例如,原始训练代码集中源代码两两成对,并且每一个源代码对被标记为克隆/非克隆,可将每一个已知克隆/非克隆的源代码对视为模型训练的一个训练样本。
优选的,本申请实施例所述集成分类模型,是指采用集成学习方法训练获得的随机森林分类模型;其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:决策树、朴素贝叶斯、支持向量机、线性判别分析和k-近邻分类器;所述随机森林分类模型的集成方法采用下述至少一项:装袋、增强和堆叠。
例如,将决策树和装袋法(Bagging)结合起来构建随机森林分类模型,其中,决策树使用一组特征进行分层决策,以树状结构排列,同时在树构建过程中能够快速找到最能区分不同类别的特征变量作为分支属性。此外,决策树还可以为不同的类生成相应的显式规则。为避免应对所有情况需构建非常大的决策树,节省时间和空间成本,利用集成学习,期望建立一些中等规模的决策树来取代一个巨大的决策树,具体是使用装袋法(Bagging)来建立随机森林。随机森林是一种基于决策树的先进集成技术,随机森林通过将随机性引入每个决策树的模型构建过程,从而使决策树具有较少的相关性,在此基础上利用装袋法(Bagging)实现的集成性能更好。
(2)将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;
优选的,将所述至少两个版本的训练源代码分别转换为对应的训练特征向量,采用如下方式实现:基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库中的代码字符单元;构建所述代码字符单元的语义向量;根据所述训练源代码包含的代码字符单元的语义向量,生成所述训练源代码的语义矩阵;将所述语义矩阵转换成语义向量,作为所述训练源代码对应的训练特征向量。
需要说明的是,此处集成分类模型训练过程中将至少两个版本的训练源代码分别转换为对应的训练特征向量,与下述步骤S102将所述至少两个版本的源代码分别转换为对应的代码特征向量,优选可采用同一词嵌入技术实现,其中,所述词嵌入技术包括下述至少一项:词向量化(Word2Vec)和文本向量化(Doc2Vec)。
例如,利用词嵌入技术并结合词向量化(Word2Vec)中的一个模型(skip-gram模型)将每个源代码转换为其对应的代码特征向量,具体实现如下:
给定源代码中的标记t(例如,源代码中的字符),将标记t的周围标记(例如,给定标记的相邻单词)的集合表示为Ct。skip-gram模型的目标函数J(需要最大化)是在给定标记条件下周围标记出现的概率对数的总和,目标函数J可表示为:
Figure BDA0001850985040000071
其中,n表示标记序列的整个长度。此外,p(tj|ti)为使用下述softmax函数定义的条件概率:
Figure BDA0001850985040000072
其中,vt为标记t的向量表示,T为所有标记的词汇表。
对于代码字符语料库中的每个字符,均可以表示为d维向量其中d是可变参数,并且通常设置为整数(比如100)。利用skip-gram模型,每个标记都被转换为固定长度的向量(即d维向量),在此基础上,可将源代码表示为矩阵,其中每行代表一个标记。由于不同的源代码具有不同数量的标记,因而难以将表示源代码的矩阵直接输入到集成分类模型中,通过对源代码包含的所有标记向量取平均值,将表示源代码的矩阵转换为向量。
平均值基于向量中每个维度的数值计算获得,具体的,给定总共n行的源代码矩阵,将矩阵的第i行表示为ri,并且按如下方式生成变换后的源代码的向量vd
Figure BDA0001850985040000081
通过上述方式,可将每个源代码表示为向量,即字符特征向量,通过该符特征向量表示源代码的特征。
(3)利用转换获得的至少两个训练特征向量进行模型训练。
使用上述转换获得的源代码对应的训练特征向量可以构建集成分类模型,但在集成分类模型构建过程中,如果原始训练代码集中的训练样本不平衡(存在克隆代码的训练样本数目和不存在克隆代码的训练样本数目差距较大,比如实际中),将会直接影响训练获得的集成分类模型的检测精度和准确性。因此,在构建集成分类模型之前,需要对原始训练代码集中的训练样本进行平衡处理,以此训练出更准确的集成分类模型。
本申请实施例提供的一种优选实施方式中,在构建集成分类模型之前,对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理;其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码(例如,两个版本的源代码对为克隆代码),所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码(例如,两个版本的源代码对不是克隆代码)。
优选的,所述对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,采用如下方式实现:
计算所述原始训练代码集中正向训练数据与负向训练数据之比;若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加入所述原始训练代码集;若所述正向训练数据与负向训练数据之比大于目标比,则在所述原始训练代码集随机选择正向训练数据加入所述原始训练代码集。
例如,采用过采样平衡原始训练代码集中的正向训练数据和负向训练数据,首先设置目标比p,目标比p的定义是少数类的训练数据占总训练数据量的目标比例。然后重复下述两个步骤,直至少数类的训练数据与总训练数据量比率增加至目标比p:
步骤一:随机选择原始训练代码集中属于少数类的训练数据;
步骤二:将步骤一选择的训练数据添加到原始训练代码集中。
步骤S102,将所述至少两个版本的源代码分别转换为对应的代码特征向量。
本申请实施例提供的一种优选实施方式中,将所述至少两个版本的源代码分别转换为对应的代码特征向量,采用如下方式实现:
针对所述源代码集中至少两个版本的源代码,执行如下操作:基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;构建所述代码字符单元的语义向量;根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;将所述源代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。
需要说明的是,本步骤将所述至少两个版本的源代码分别转换为对应的代码特征向量,与上述集成分类模型训练过程中将至少两个版本的训练源代码分别转换为对应的训练特征向量所采用的词嵌入技术一致,所述至少两个版本的源代码分别转换为对应的代码特征向量的具体实现过程参见上述集成分类模型训练过程中将至少两个版本的训练源代码分别转换为对应的训练特征向量的具体说明即可,此处不再赘述。
步骤S103,将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
如上所述,在上述步骤S102转换获得的所述至少两个版本的源代码对应的代码特征向量的基础上,将代码特征向量输入上述训练获得的集成分类模型进行克隆检测,即检测所述至少两个版本的源代码之间是否存在代码克隆,集成分类模型在检测完毕后输出所述至少两个版本的源代码之间是否存在代码克隆的克隆检测结果。
优选的,所述集成分类模型输出的克隆检测结果还携带所述至少两个版本源代码之间的代码克隆类型;其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语法克隆和语义克隆。
例如,将待检测的两个版本的源代码对各自对应的代码特征向量输入随机森林分类模型,若经随机森林分类模型检测后这两个版本的源代码的代码相似度在[0.7,1]之间,则随机森林分类模型输出这两个版本的源代码的克隆检测结果为文本克隆;若经随机森林分类模型检测后这两个版本的源代码的代码相似度在[0.5,0.7]之间,则随机森林分类模型输出这两个版本的源代码的克隆检测结果为标记克隆;若经随机森林分类模型检测后这两个版本的源代码的代码相似度在[0,0.5]之间,则随机森林分类模型输出这两个版本的源代码的克隆检测结果为语法克隆或者语义克隆。
综上所述,所述代码克隆检测方法,在对至少两个版本的源代码进行克隆检测的过程中,通过提取至少两个版本的源代码各自的特征信息来将源代码转换为各自对应的代码特征向量,在代码特征向量的基础上利用集成分类模型实现至少两个版本的源代码之间的克隆检测,从而降低了源代码的特征信息损失,在此基础上实现的代码克隆检测更加精准,同时也更具有效性。
本申请提供的一种代码克隆检测装置实施例如下:
在上述的实施例中,提供了一种代码克隆检测方法,与之相对应的,本申请还提供了一种代码克隆检测装置,下面结合附图进行说明。
参照附图3,其示出了本申请提供的一种代码克隆检测装置实施例的示意图。
由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关的部分请参见上述提供的方法实施例的对应说明即可。下述描述的装置实施例仅仅是示意性的。
本申请提供一种代码克隆检测装置,包括:
获取源代码集单元301,用于获取至少两个版本的源代码组成的源代码集;
代码特征向量转换单元302,用于将所述至少两个版本的源代码分别转换为对应的代码特征向量;
克隆检测单元303,用于将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
可选的,所述代码特征向量转换单元302,具体用于针对所述源代码集中至少两个版本的源代码,执行下述子单元:
代码字符单元提取子单元,用于基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;
语义向量构建子单元,用于构建所述代码字符单元的语义向量;
语义矩阵生成子单元,用于根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;
语义向量转换子单元,用于将所述源代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。
可选的,所述集成分类模型,通过执行下述单元训练获得:
训练源代码获取单元,用于获取原始训练代码集中至少两个版本的训练源代码;
训练特征向量转换单元,用于将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;
模型训练单元,用于利用转换获得的至少两个训练特征向量进行模型训练。
可选的,所述集成分类模型,还通过执行下述单元训练获得:
训练数据平衡处理单元,用于对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理;
其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。
可选的,所述训练数据平衡处理单元,具体用于计算所述原始训练代码集中正向训练数据与负向训练数据之比;
若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加入所述原始训练代码集;
若所述正向训练数据与负向训练数据之比大于目标比,则在所述原始训练代码集随机选择正向训练数据加入所述原始训练代码集。
可选的,所述训练特征向量转换单元,包括:
提取子单元,用于基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库中的代码字符单元;
向量构建子单元,用于构建所述代码字符单元的语义向量;
矩阵生成子单元,用于根据所述训练源代码包含的代码字符单元的语义向量,生成所述训练源代码的语义矩阵;
训练特征向量生成子单元,用于将所述语义矩阵转换成语义向量,作为所述训练源代码对应的训练特征向量。
可选的,所述克隆检测结果携带所述至少两个版本源代码之间的代码克隆类型;
其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语法克隆和语义克隆。
可选的,所述集成分类模型包括:采用集成学习方法训练获得的随机森林分类模型;
其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:决策树、朴素贝叶斯、支持向量机、线性判别分析和k-近邻分类器;
所述随机森林分类模型的集成方法采用下述至少一项:装袋、增强和堆叠。
可选的,所述代码特征向量转换单元302,采用词嵌入技术将源代码集中至少两个版本的源代码分别转换为对应的所述代码特征向量;
其中,所述词嵌入技术包括下述至少一项:词向量化和文本向量化。
本申请提供的一种电子设备实施例如下:
在上述的实施例中,提供了一种代码克隆检测方法,此外,本申请还提供了一种用于实现所述代码克隆检测方法的电子设备,下面结合附图进行说明。
参照附图4,其示出了本实施例提供的一种电子设备的示意图。
本申请提供的所述电子设备实施例描述得比较简单,相关的部分请参见上述提供的所述代码克隆检测方法实施例的对应说明即可。下述描述的实施例仅仅是示意性的。
本申请提供一种电子设备,包括:
存储器401和处理器402;
所述存储器401用于存储计算机可执行指令,所述处理器402用于执行如下计算机可执行指令:
获取至少两个版本的源代码组成的源代码集;
将所述至少两个版本的源代码分别转换为对应的代码特征向量;
将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果。
可选的,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量,包括:
针对所述源代码集中至少两个版本的源代码,执行如下操作:
基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;
构建所述代码字符单元的语义向量;
根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;
将所述源代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。
可选的,所述集成分类模型,采用如下方式训练获得:
获取原始训练代码集中至少两个版本的训练源代码;
将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;
利用转换获得的至少两个训练特征向量进行模型训练。
可选的,所述利用转换获得的至少两个训练特征向量进行模型训练指令执行之前,所述处理器402还用于执行如下计算机可执行指令:
对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理;
其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。
可选的,所述对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:
计算所述原始训练代码集中正向训练数据与负向训练数据之比;
若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加入所述原始训练代码集;
若所述正向训练数据与负向训练数据之比大于目标比,则在所述原始训练代码集随机选择正向训练数据加入所述原始训练代码集。
可选的,所述将所述至少两个版本的训练源代码分别转换为对应的训练特征向量,包括:
基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库中的代码字符单元;
构建所述代码字符单元的语义向量;
根据所述训练源代码包含的代码字符单元的语义向量,生成所述训练源代码的语义矩阵;
将所述语义矩阵转换成语义向量,作为所述训练源代码对应的训练特征向量。
可选的,所述克隆检测结果携带所述至少两个版本源代码之间的代码克隆类型;
其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语法克隆和语义克隆。
可选的,所述集成分类模型包括:采用集成学习方法训练获得的随机森林分类模型;
其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:决策树、朴素贝叶斯、支持向量机、线性判别分析和k-近邻分类器;
所述随机森林分类模型的集成方法采用下述至少一项:装袋、增强和堆叠。
可选的,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量指令,采用词嵌入技术将源代码集中至少两个版本的源代码分别转换为对应的所述代码特征向量;
其中,所述词嵌入技术包括下述至少一项:词向量化和文本向量化。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本领域技术人员应明白,本申请的实施例可提供为方法、***或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

Claims (10)

1.一种代码克隆检测方法,其特征在于,包括:
获取至少两个版本的源代码组成的源代码集;
将所述至少两个版本的源代码分别转换为对应的代码特征向量;
将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果;
其中,所述集成分类模型是利用原始训练代码集中至少两个版本的训练源代码对应的训练特征向量进行模型训练获得的;
所述方法还包括:对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:通过比较所述正向训练数据与所述负向训练数据之比和目标比的大小,调整所述原始训练代码集;其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。
2.根据权利要求1所述的代码克隆检测方法,其特征在于,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量,包括:
针对所述源代码集中至少两个版本的源代码,执行如下操作:
基于代码字符语料库,提取所述源代码包含的所述代码字符语料库中的代码字符单元;
构建所述代码字符单元的语义向量;
根据所述代码字符单元的语义向量生成所述源代码的语义矩阵;
将所述源代码的语义矩阵转换为语义向量,作为所述源代码对应的代码特征向量。
3.根据权利要求1所述的代码克隆检测方法,其特征在于,所述集成分类模型是利用原始训练代码集中至少两个版本的训练源代码对应的训练特征向量进行模型训练获得的,包括:
获取原始训练代码集中至少两个版本的训练源代码;
将所述至少两个版本的训练源代码分别转换为对应的训练特征向量;
利用转换获得的至少两个训练特征向量进行模型训练。
4.根据权利要求1所述的代码克隆检测方法,其特征在于,所述对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:
计算所述原始训练代码集中正向训练数据与负向训练数据之比;
若所述正向训练数据与负向训练数据之比小于目标比,则在所述原始训练代码集随机选择负向训练数据加入所述原始训练代码集;
若所述正向训练数据与负向训练数据之比大于目标比,则在所述原始训练代码集随机选择正向训练数据加入所述原始训练代码集。
5.根据权利要求3所述的代码克隆检测方法,其特征在于,所述将所述至少两个版本的训练源代码分别转换为对应的训练特征向量,包括:
基于代码字符语料库,提取所述训练源代码包含的所述代码字符语料库中的代码字符单元;
构建所述代码字符单元的语义向量;
根据所述训练源代码包含的代码字符单元的语义向量,生成所述训练源代码的语义矩阵;
将所述语义矩阵转换成语义向量,作为所述训练源代码对应的训练特征向量。
6.根据权利要求1至5任意一项所述的代码克隆检测方法,其特征在于,所述克隆检测结果携带所述至少两个版本源代码之间的代码克隆类型;
其中,所述代码克隆类型包括下述至少一项:文本克隆、标记克隆、语法克隆和语义克隆。
7.根据权利要求6所述的代码克隆检测方法,其特征在于,所述集成分类模型包括:采用集成学习方法训练获得的随机森林分类模型;
其中,所述随机森林分类模型的基础学习器采用下述至少一项分类技术:决策树、朴素贝叶斯、支持向量机、线性判别分析和k-近邻分类器;
所述随机森林分类模型的集成方法采用下述至少一项:装袋、增强和堆叠。
8.根据权利要求6所述的代码克隆检测方法,其特征在于,所述将所述至少两个版本的源代码分别转换为对应的代码特征向量步骤,采用词嵌入技术将源代码集中至少两个版本的源代码分别转换为对应的所述代码特征向量;
其中,所述词嵌入技术包括下述至少一项:词向量化和文本向量化。
9.一种代码克隆检测装置,其特征在于,包括:
获取源代码集单元,用于获取至少两个版本的源代码组成的源代码集;
代码特征向量转换单元,用于将所述至少两个版本的源代码分别转换为对应的代码特征向量;
克隆检测单元,用于将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果;
其中,所述集成分类模型是利用原始训练代码集中至少两个版本的训练源代码对应的训练特征向量进行模型训练获得的;
所述装置还包括:对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:通过比较所述正向训练数据与所述负向训练数据之比和目标比的大小,调整所述原始训练代码集;其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。
10.一种电子设备,其特征在于,包括:
存储器和处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
获取至少两个版本的源代码组成的源代码集;
将所述至少两个版本的源代码分别转换为对应的代码特征向量;
将所述至少两个版本的源代码对应的代码特征向量输入集成分类模型进行克隆检测,获得克隆检测结果;
其中,所述集成分类模型是利用原始训练代码集中至少两个版本的训练源代码对应的训练特征向量进行模型训练获得的;
所述设备还包括:对所述原始训练代码集中正向训练数据和负向训练数据进行平衡处理,包括:通过比较所述正向训练数据与所述负向训练数据之比和目标比的大小,调整所述原始训练代码集;其中,所述正向训练数据是指所述至少两个版本的训练源代码存在克隆代码,所述负向训练数据是指所述至少两个版本的训练源代码不存在克隆代码。
CN201811295180.5A 2018-11-01 2018-11-01 代码克隆检测方法、装置以及电子设备 Active CN111124487B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811295180.5A CN111124487B (zh) 2018-11-01 2018-11-01 代码克隆检测方法、装置以及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811295180.5A CN111124487B (zh) 2018-11-01 2018-11-01 代码克隆检测方法、装置以及电子设备

Publications (2)

Publication Number Publication Date
CN111124487A CN111124487A (zh) 2020-05-08
CN111124487B true CN111124487B (zh) 2022-01-21

Family

ID=70494816

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811295180.5A Active CN111124487B (zh) 2018-11-01 2018-11-01 代码克隆检测方法、装置以及电子设备

Country Status (1)

Country Link
CN (1) CN111124487B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112035165B (zh) * 2020-08-26 2023-06-09 山谷网安科技股份有限公司 基于同构网络的代码克隆检测方法及***
CN112433756B (zh) * 2020-11-24 2021-09-07 北京京航计算通讯研究所 基于加权递归自编码器的快速代码克隆检测方法及装置
CN112214419A (zh) * 2020-12-09 2021-01-12 深圳开源互联网安全技术有限公司 组件代码相似度的检测方法及设备
CN112835620B (zh) * 2021-02-10 2022-03-25 中国人民解放军军事科学院国防科技创新研究院 一种基于深度学习的语义相似代码在线检测方法
CN113220301A (zh) * 2021-04-13 2021-08-06 广东工业大学 一种基于分层神经网络的克隆一致性变化预测方法和***
CN113704108A (zh) * 2021-08-27 2021-11-26 浙江树人学院(浙江树人大学) 一种相似代码检测方法及装置、电子设备、存储介质
CN113986345B (zh) * 2021-11-01 2024-05-07 天津大学 一种预训练增强的代码克隆检测方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101697121A (zh) * 2009-10-26 2010-04-21 哈尔滨工业大学 一种基于程序源代码语义分析的代码相似度检测方法
US8296759B1 (en) * 2006-03-31 2012-10-23 Vmware, Inc. Offloading operations to a replicate virtual machine
CN104077147A (zh) * 2014-07-11 2014-10-01 东南大学 一种基于代码克隆自动检测和及时提醒的软件复用方法
CN104407872A (zh) * 2014-12-04 2015-03-11 北京邮电大学 代码克隆的检测方法
CN108491228A (zh) * 2018-03-28 2018-09-04 清华大学 一种二进制漏洞代码克隆检测方法及***

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120159434A1 (en) * 2010-12-20 2012-06-21 Microsoft Corporation Code clone notification and architectural change visualization
JP2015056140A (ja) * 2013-09-13 2015-03-23 アイシン・エィ・ダブリュ株式会社 クローン検出方法及びクローン共通関数化方法
CN107608732B (zh) * 2017-09-13 2020-08-21 扬州大学 一种基于bug知识图谱的bug搜索定位方法
US10114624B1 (en) * 2017-10-12 2018-10-30 Devfactory Fz-Llc Blackbox matching engine
CN108170468B (zh) * 2017-12-28 2021-04-20 中山大学 一种自动检测注释和代码一致性的方法及其***
CN108171050A (zh) * 2017-12-29 2018-06-15 浙江大学 Linux容器的细粒度沙盒策略挖掘方法

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8296759B1 (en) * 2006-03-31 2012-10-23 Vmware, Inc. Offloading operations to a replicate virtual machine
CN101697121A (zh) * 2009-10-26 2010-04-21 哈尔滨工业大学 一种基于程序源代码语义分析的代码相似度检测方法
CN104077147A (zh) * 2014-07-11 2014-10-01 东南大学 一种基于代码克隆自动检测和及时提醒的软件复用方法
CN104407872A (zh) * 2014-12-04 2015-03-11 北京邮电大学 代码克隆的检测方法
CN108491228A (zh) * 2018-03-28 2018-09-04 清华大学 一种二进制漏洞代码克隆检测方法及***

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
An efficient code clone detection model on Java byte code using hybrid approach;Kanika Raheja 等;《Confluence 2013: The Next Generation Information Technology Summit》;20140616;第16-21页 *
移动网络中恶意代码优化检测仿真研究;芦天亮 等;《计算机仿真》;20170815;第377-381页 *

Also Published As

Publication number Publication date
CN111124487A (zh) 2020-05-08

Similar Documents

Publication Publication Date Title
CN111124487B (zh) 代码克隆检测方法、装置以及电子设备
US11106714B2 (en) Summary generating apparatus, summary generating method and computer program
US8457950B1 (en) System and method for coreference resolution
Xu et al. Post2vec: Learning distributed representations of Stack Overflow posts
CN110674297B (zh) 舆情文本分类模型构建和舆情文本分类方法、装置及设备
CN116661805B (zh) 代码表示的生成方法和装置、存储介质及电子设备
CN110750297B (zh) 一种基于程序分析和文本分析的Python代码参考信息生成方法
CN110688540B (zh) 一种作弊账户筛选方法、装置、设备及介质
CN111831624A (zh) 数据表创建方法、装置、计算机设备及存储介质
CN115146062A (zh) 融合专家推荐与文本聚类的智能事件分析方法和***
Kettunen Keep, change or delete? setting up a low resource ocr post-correction framework for a digitized old finnish newspaper collection
CN115066674A (zh) 使用源代码元素的数值数组表示来评估源代码的方法
CN114416926A (zh) 关键词匹配方法、装置、计算设备及计算机可读存储介质
Vu et al. Revising FUNSD dataset for key-value detection in document images
Eppa et al. Source code plagiarism detection: A machine intelligence approach
Schirmer et al. A new dataset for topic-based paragraph classification in genocide-related court transcripts
CN112417147A (zh) 训练样本的选取方法与装置
Vu-Manh et al. Improving Vietnamese dependency parsing using distributed word representations
Tang et al. Interpretability rules: Jointly bootstrapping a neural relation extractorwith an explanation decoder
CN115495636A (zh) 网页搜索方法、装置及存储介质
CN110968691B (zh) 司法热点确定方法及装置
CN113420127A (zh) 威胁情报处理方法、装置、计算设备及存储介质
CN113704108A (zh) 一种相似代码检测方法及装置、电子设备、存储介质
Zaikis et al. Dacl: A domain-adapted contrastive learning approach to low resource language representations for document clustering tasks
CN111126066A (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
GR01 Patent grant
GR01 Patent grant