首页> 中国专利> 基于加权递归自编码器的快速代码克隆检测方法及装置

基于加权递归自编码器的快速代码克隆检测方法及装置

摘要

本发明涉及一种基于加权递归自编码器的快速代码克隆检测方法及装置,属于代码克隆技术领域,解决了现有的代码克隆技术检测精度较差且效率较低的问题。方法包括:获取待检测代码数据集,对待检测代码数据集进行预处理,得到待检测代码数据集中每一代码对应的二叉树;基于二叉树和加权递归自编码器获得待检测代码数据集中每一代码对应的最终向量,并基于每一代码对应的最终向量得到最终向量集合;基于最终向量集合构建导航展开图,并根据导航展开图对最终向量集合中的任意两个最终向量进行检测,得到代码克隆对。实现了代码克隆对的快速检测,提高了检测效率和精度。

著录项

  • 公开/公告号CN112433756A

    专利类型发明专利

  • 公开/公告日2021-03-02

    原文格式PDF

  • 申请/专利权人 北京京航计算通讯研究所;

    申请/专利号CN202011329523.2

  • 申请日2020-11-24

  • 分类号G06F8/75(20180101);G06F16/901(20190101);G06F40/284(20200101);G06F40/30(20200101);G06K9/62(20060101);

  • 代理机构11386 北京天达知识产权代理事务所(普通合伙);

  • 代理人胡时冶

  • 地址 100074 北京市丰台区云岗北里西区1号院

  • 入库时间 2023-06-19 10:05:17

说明书

技术领域

本发明涉及代码克隆技术领域,尤其涉及一种基于加权递归自编码器的快速代码克隆检测方法及装置。

背景技术

代码克隆是指相似或相同的代码(可以是代码片段、方法、文件、模块等不同粒度),即重复代码。代码克隆可以极大促进软件开发,但其缺陷也会得到快速传播。因此代码克隆检测技术应运而生。

根据代码克隆的相似性,将代码克隆分为4种类型,类型1:两段代码之间除却空白、布局和注释等不同以外,其余完全一致;类型2:两段代码除却空白、布局、注释、变量命名、类型、标识符等不同以外,其余完全一致;类型3:两段代码除却空白、布局、注释、变量命名、类型、标识符等不同以外,部分语句增删或顺序发生变化;类型4:两段代码功能相似,但是语法上差异巨大。

传统代码克隆检测方法对于检测前三种类型的代码克隆都是有效的,但是对于语法相似度很低的第四类代码克隆的检测精度较差,且检测过程时长较长造成的检测效率较低。

发明内容

鉴于上述的分析,本发明实施例旨在提供一种基于加权递归自编码器的快速代码克隆检测方法及装置,用以解决现有的代码克隆技术检测精度较差且效率较低的问题。

一方面,本发明实施例提供了一种基于加权递归自编码器的快速代码克隆检测方法,包括下述步骤:

获取待检测代码数据集,对所述待检测代码数据集进行预处理,得到待检测代码数据集中每一代码对应的二叉树;

基于所述二叉树和加权递归自编码器获得待检测代码数据集中每一代码对应的最终向量,并基于所述每一代码对应的最终向量得到最终向量集合;

基于所述最终向量集合构建导航展开图,并根据所述导航展开图对最终向量集合中的任意两个最终向量进行检测,得到代码克隆对。

进一步,对所述待检测代码数据集进行预处理,得到待检测代码数据集中每一代码对应的二叉树,包括下述步骤:

基于所述待检测代码数据集获得待检测代码数据集中每一代码对应的抽象语法树;

对所述每一代码对应的抽象语法树进行优化,得到待检测代码数据集中每一代码对应的二叉树,其中,所述二叉树包括叶子节点和非叶子节点。

进一步,基于所述二叉树和加权递归自编码器获得待检测代码数据集中每一代码对应的最终向量,包括下述步骤:

遍历所述二叉树中的所有叶子节点,得到待检测代码数据集中每一代码对应的函数语句;

获取所述函数语句中每个单词的词向量;

基于加权递归自编码器对每个单词的词向量进行编码,得到多级语义向量,并计算每一级语义向量对应的权值;

将每一级语义向量与其对应的权值相乘的结果进行叠加,得到待检测代码数据集中每一代码对应的最终向量。

进一步,基于所述导航展开图对最终向量集合中的任意两个最终向量进行检测,得到代码克隆对,包括下述步骤:

基于所述导航展开图计算最终向量集合中任意两个最终向量的欧氏距离;

判断所述欧氏距离是否小于阈值门槛,若是,则两个最终向量对应的代码为代码克隆对;若否,则两个最终向量对应的代码不是代码克隆对。

进一步,所述任意两个最终向量的欧氏距离计算公式为:

式中,dist(r,v)表示任意两个最终向量的欧氏距离,r和v表示向量集合中的任意两个最终向量,r=(x

另一方面,本发明实施例提供了一种基于加权递归自编码器的快速代码克隆检测装置,包括:

数据集获取模块,获取待检测代码数据集,对所述待检测代码数据集进行预处理,得到待检测代码数据集中每一代码对应的二叉树;

最终向量获得模块,用于根据所述二叉树和加权递归自编码器获得待检测代码数据集中每一代码对应的最终向量,并基于所述每一代码对应的最终向量得到最终向量集合;

检测模块,用于根据所述最终向量集合构建导航展开图,并根据所述导航展开图对最终向量集合中的任意两个最终向量进行检测,得到代码克隆对。

进一步,所述数据集获取模块用于:

基于所述待检测代码数据集获得待检测代码数据集中每一代码对应的抽象语法树;

对所述每一代码对应的抽象语法树进行优化,得到待检测代码数据集中每一代码对应的二叉树,其中,所述二叉树包括叶子节点和非叶子节点。

进一步,所述最终向量获得模块用于:

遍历所述二叉树中的所有叶子节点,得到待检测代码数据集中每一代码对应的函数语句;

获取所述函数语句中每个单词的词向量;

基于加权递归自编码器对每个单词的词向量进行编码,得到多级语义向量,并计算每一级语义向量对应的权值;

将每一级语义向量与其对应的权值相乘的结果进行叠加,得到待检测代码数据集中每一代码对应的最终向量。

进一步,所述检测模块用于:

基于所述导航展开图计算最终向量集合中任意两个最终向量的欧氏距离;

判断所述欧氏距离是否小于阈值门槛,若是,则两个最终向量对应的代码为代码克隆对;若否,则两个最终向量对应的代码不是代码克隆对。

进一步,所述任意两个最终向量的欧氏距离计算公式为:

式中,dist(r,v)表示任意两个最终向量的欧氏距离,r和v表示向量集合中的任意两个最终向量,r=(x

与现有技术相比,本发明至少可实现如下有益效果之一:

1、一种基于加权递归自编码器的快速代码克隆检测方法及装置,首先从程序语料库中获取待检测代码数据集,然后将待检测代码数据集中的每一段代码转换为其对应的函数语句,并依据该函数语句生成词向量,同时,将生成的词向量输入训练好的加权递归自编码器,得到每一段程序代码对应的最终向量,最后,依据导航展开图将每一段程序代码对应的最终向量分布在空间中,并通过两段代码对应的最终向量之间的距离判断两段代码是否为克隆代码对,简单易行,易于实施,提高了克隆代码检测的效率和精度。

2、通过采用加权递归自编码器的方式,对每一级语义向量进行加权求和以得到最终向量,使得最终向量拥有的信息更加精确,放大了更重要节点对最终向量的贡献,提高了最终向量的精度,也提高了克隆对的检测精度。

3、通过导航展开图算法进行最近邻搜索,通过计算任意两个最终向量之间的欧氏距离,并将欧式距离与阈值门槛比较,以判断两段代码是否为代码克隆对,提高了代码克隆对的检测速率。

本发明中,上述各技术方案之间还可以相互组合,以实现更多的优选组合方案。本发明的其他特征和优点将在随后的说明书中阐述,并且,部分优点可从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过说明书以及附图中所特别指出的内容中来实现和获得。

附图说明

附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。

图1为一个实施例中代码克隆检测整体框架示意图;

图2为一个实施例中基于加权递归自编码器的快速代码克隆检测方法流程图;

图3为一个实施例中采用加权递归自编码器得到最终向量的过程;

图4为另一个实施例中基于加权递归自编码器的快速代码克隆检测装置结构图;

附图标记:

100-数据集获取模块,200-最终向量获得模块,300-检测模块。

具体实施方式

下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理,并非用于限定本发明的范围。

传统代码克隆检测方法对于语法相似度很低的第四类代码克隆的检测精度较差,且检测过程时长较长造成的检测效率较低。为此,本申请提出来一种基于加权递归自编码器的快速代码克隆检测方法及装置,如图1所示,首先从程序语料库中获取待检测代码数据集,然后将待检测代码数据集中的每一段代码转换为其对应的函数语句,并依据该函数语句生成词向量,同时,将生成的词向量输入训练好的加权递归自编码器,得到每一段程序代码对应的最终向量,最后,依据导航展开图将每一段程序代码对应的最终向量分布在空间中,并通过两段代码对应的最终向量之间的距离判断两段代码是否为克隆代码对,简单易行,易于实施,提高了克隆代码检测的效率和精度。

本发明的一个具体实施例,公开了基于加权递归自编码器的快速代码克隆检测方法,如图2所示,包括下述步骤S1~步骤S3。

步骤S1、获取待检测代码数据集,对待检测代码数据集进行预处理,得到待检测代码数据集中每一代码对应的二叉树。具体来说,本申请主要是采用爬虫技术从目标软件系统的程序语料库中爬取多段程序代码,多段程序代码组合即可得到待检测代码数据集,其中,对待检测代码数据集进行预处理,得到待检测代码数据集中每一代码对应的二叉树,包括下述步骤:

步骤S101、基于待检测代码数据集获得待检测代码数据集中每一代码对应的抽象语法树。具体来说,本申请中主要是采用JavaParser工具解析待检测代码数据集中每一段代码,对应得到每一段代码对应的抽象语法树。

步骤S102、对每一代码对应的抽象语法树进行优化,得到待检测代码数据集中每一代码对应的二叉树,其中,二叉树包括叶子节点和非叶子节点。具体来说,对每一代码对应的抽象语法树进行优化的过程包括:先对有多于2个子节点的非叶子节点进行Case II类型转换,然后对于只有一个子节点的非叶子结点,将它和它的子节点进行合并,以实现CaseI类型转换,得到一个完整的二叉树,即完满二叉树。

步骤S2、基于二叉树和加权递归自编码器获得待检测代码数据集中每一代码对应的最终向量,并基于每一代码对应的最终向量得到最终向量集合。具体来说,加权递归自编码器是在递归自编码器模型中引入抽象语法树的节点权重信息,加大重要节点在程序最终向量表示中贡献的信息量,以提升克隆检测的精确性。其中,递归自编码器对于任意非叶子节点的两个子节点,采取先压缩编码之后再展开重建的方式计算重构损失,并在训练样本上优化重构损失至局部最优,而后再用编码层去编码出非叶子节点的向量表示。本申请中在使用加权递归自编码器得到每一代码对应的最终向量之前,需要先从程序语料库中爬取多段程序代码组成训练数据集,利用训练数据集对加权递归自编码器进行参数训练,以降低自重构误差为优化目标,当加权递归自编码器拟合时,得到训练好的加权递归自编码器。

步骤S201、遍历二叉树中的所有叶子节点,得到待检测代码数据集中每一代码对应的函数语句。在得到完满二叉树之后,每一个叶子节点对应一个单词,遍历二叉树中的所有叶子节点,把所有叶子节点表示的单词排成一个函数语句,就可以得到该段代码对应的函数语句。

步骤S202、采用word2vec模型获取函数语句中每个单词的词向量。

步骤S203、基于加权递归自编码器对每个单词的词向量进行编码,得到多级语义向量,并计算每一级语义向量对应的权值。具体来说,如图3所示,先对叶子节点3和叶子节点4进行压缩编码,得到一级语义向量O

式中,TF-IDF为每一级语义向量对应的权重,n

步骤S204、将每一级语义向量与其对应的权值相乘的结果进行叠加,得到待检测代码数据集中每一代码对应的最终向量。步骤S203得到多级语义向量及每一级语义向量对应的权值后,将每一级语义向量与其对应的权值相乘的结果进行叠加,得到待检测代码数据集中每一代码对应的最终向量,示例性地,设第i级语义向量对应的权值为f

O

通过采用加权递归自编码器的方式,对每一级语义向量进行加权求和以得到最终向量,使得最终向量拥有的信息更加精确,放大了更重要节点对最终向量的贡献,提高了最终向量的精度,也提高了克隆对的检测精度。

步骤S3、基于最终向量集合构建导航展开图,并根据导航展开图对最终向量集合中的任意两个最终向量进行检测,得到代码克隆对。具体来说,导航展开图算法基于K近邻图算法演变而来,目标是完成近似最近邻搜索,具体是将向量集合中的每个向量看作空间中的一个点,然后构建K近邻图,并在图中搜索查询向量的近邻向量。首先给定一个最终向量,在图中随机选取另外一个最终向量,然后计算两者之间的欧式距离,将该欧式距离与阈值门槛比较,若欧式距离小于阈值门槛,则两个最终向量对应的代码为代码克隆对,若欧式距离不小于阈值门槛,则两个最终向量对应的代码不是代码克隆对。直至比较完导航展开图中所有的两个任意最终向量之间的距离,得到待检测代码数据集中的所有代码克隆对。其中,代码克隆对指的是一段代码由另一端代码克隆得到。

优选地,基于导航展开图对最终向量集合中的任意两个最终向量进行检测,得到代码克隆对,包括下述步骤:

基于导航展开图计算最终向量集合中任意两个最终向量的欧氏距离,其中,任意两个最终向量的欧氏距离计算公式为:

式中,dist(r,v)表示任意两个最终向量的欧氏距离,r和v表示向量集合中的任意两个最终向量,r=(x

判断欧氏距离是否小于阈值门槛,若是,则两个最终向量对应的代码为代码克隆对;若否,则两个最终向量对应的代码不是代码克隆对。

通过导航展开图算法进行最近邻搜索,计算任意两个最终向量之间的欧氏距离,并将欧式距离与阈值门槛比较,以判断两段代码是否为代码克隆对,提高了代码克隆对的检测速率。

与现有技术相比,本实施例提供的基于加权递归自编码器的快速代码克隆检测方法,首先从程序语料库中获取待检测代码数据集,然后将待检测代码数据集中的每一段代码转换为其对应的函数语句,并依据该函数语句生成词向量,同时,将生成的词向量输入训练好的加权递归自编码器,得到每一段程序代码对应的最终向量,最后,依据导航展开图将每一段程序代码对应的最终向量分布在空间中,并通过两段代码对应的最终向量之间的距离判断两段代码是否为克隆代码对,简单易行,易于实施,提高了克隆代码检测的效率和精度。

本发明的另一个具体实施例,公开了基于加权递归自编码器的快速代码克隆检测装置,如图4所示。代码克隆检测装置包括:数据集获取模块100,获取待检测代码数据集,对待检测代码数据集进行预处理,得到待检测代码数据集中每一代码对应的二叉树;最终向量获得模块200,用于根据二叉树和加权递归自编码器获得待检测代码数据集中每一代码对应的最终向量,并基于每一代码对应的最终向量得到最终向量集合;检测模块300,用于根据最终向量集合构建导航展开图,并根据导航展开图对最终向量集合中的任意两个最终向量进行检测,得到代码克隆对。

由于基于加权递归自编码器的快速代码克隆检测装置的实现原理与基于加权递归自编码器的快速代码克隆检测方法的实现原理相同,故这里不再赘述。

本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

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

客服邮箱:kefu@zhangqiaokeyan.com

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

  • 服务号