CN110990273B - 克隆代码检测方法及装置 - Google Patents

克隆代码检测方法及装置 Download PDF

Info

Publication number
CN110990273B
CN110990273B CN201911195989.5A CN201911195989A CN110990273B CN 110990273 B CN110990273 B CN 110990273B CN 201911195989 A CN201911195989 A CN 201911195989A CN 110990273 B CN110990273 B CN 110990273B
Authority
CN
China
Prior art keywords
code
target
clone
node
syntax tree
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
CN201911195989.5A
Other languages
English (en)
Other versions
CN110990273A (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.)
Bank of China Ltd
Original Assignee
Bank of China Ltd
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 Bank of China Ltd filed Critical Bank of China Ltd
Priority to CN201911195989.5A priority Critical patent/CN110990273B/zh
Publication of CN110990273A publication Critical patent/CN110990273A/zh
Application granted granted Critical
Publication of CN110990273B publication Critical patent/CN110990273B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/22Matching criteria, e.g. proximity measures

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Computer Hardware Design (AREA)
  • Software Systems (AREA)
  • Quality & Reliability (AREA)
  • Artificial Intelligence (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Evolutionary Biology (AREA)
  • Evolutionary Computation (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请提供一种克隆代码检测方法及装置,该方法包括:将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得;对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算;若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码。本申请能够提高克隆代码检测的准确性和高效性,进而提高软件的可靠性。

Description

克隆代码检测方法及装置
技术领域
本申请涉及克隆代码技术领域,尤其涉及一种克隆代码检测方法及装置。
背景技术
克隆代码是软件系统中的一些代码片段,这些代码片段之间存在着相同或相似语法及语义特征。大型软件中代码克隆率有较高的比重,这给软件维护带来了一定的挑战。若克隆的代码存在缺陷,会导致系统中潜在缺陷甚至安全漏洞增多,使系统受攻击的风险大大增加,并且增加系统维护的成本。目前,克隆代码检测技术被广泛地应用于软件维护、代码审计以及代码缺陷检测等领域中,检测克隆代码对于降低软件维护的成本,提高维护效率和软件的质量具有重要的应用价值。
现有技术中,克隆代码检测方法包括:基于程序依赖图的克隆代码检测方法,该方法首先使用静态程序分析将代码转换成用于表示数据和控制依赖关系的程序依赖图,然后通过比较程序依赖图的结构来检测克隆代码。通过人为定义特征向量使其逼近代码结构特征,并采用局部敏感哈希聚类相似向量实现克隆代码检测。使用Hash运算来检测克隆代码。基于深度学习的代码检测方法,该方法针对之前的技术依赖于人工定义特征表示代码的缺点,提出使用深度学习中的循环神经网络自动提取代码特征向量,并通过比较特征向量的相似度来完成克隆检测。
上述方法主要存在的以下缺陷:需要人工定义特征、漏报率和误报率高、检测精度低;不能够提取完整的代码结构和语义信息;无法检测代码片段功能相同的克隆代码。
发明内容
针对现有技术中的问题,本申请提出了一种克隆代码检测方法及装置,能够提高克隆代码检测的准确性和高效性,进而提高软件的可靠性。
为了解决上述技术问题,本申请提供以下技术方案:
第一方面,本申请提供一种克隆代码检测方法,包括:
将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得;
对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算;
若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码。
进一步地,在所述将目标代码对应的代码图输入预设的图网络模型之前,还包括:将所述待训练代码图中的各个节点分别编码成多维特征向量;基于所述多维特征向量、邻居节点信息和Embedding函数,迭代获取所述各个节点的特征表示;应用所述聚合函数和各个节点的特征表示获取所述图网络模型。
进一步地,在所述将所述待训练代码图中的各个节点分别编码成多维特征向量之前,还包括:获取待训练代码的抽象语法树;根据所述抽象语法树和控制流关系,将所述抽象语法树中有控制流关系的节点有向连接;根据所述抽象语法树和数据流关系,将所述抽象语法树中有数据流关系的节点有向连接,以生成所述待训练代码图。
进一步地,所述相似度计算的类型包括:余弦相似度计算、杰卡德系数计算、欧氏距离计算或皮尔逊系数计算类型。
第二方面,本申请提供一种克隆代码检测装置,包括:
输入模块,用于将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得;
相似度计算模块,用于对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算;
判断模块,用于若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码。
进一步地,所述的克隆代码检测装置,还包括:编码模块,用于将所述待训练代码图中的各个节点分别编码成多维特征向量;获取特征表示模块,用于基于所述多维特征向量、邻居节点信息和Embedding函数,迭代获取所述各个节点的特征表示;获取图网络模型模块,用于应用所述聚合函数和各个节点的特征表示获取所述图网络模型。
进一步地,所述的克隆代码检测装置,还包括:获取抽象语法树模块,用于获取待训练代码的抽象语法树;第一节点连接模块,用于根据所述抽象语法树和控制流关系,将所述抽象语法树中有控制流关系的节点有向连接;第二节点连接模块,用于根据所述抽象语法树和数据流关系,将所述抽象语法树中有数据流关系的节点有向连接,以生成所述待训练代码图。
进一步地,所述相似度计算的类型包括:余弦相似度计算、杰卡德系数计算、欧氏距离计算或皮尔逊系数计算类型。
第三方面,本申请提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述的克隆代码检测方法的步骤。
第四方面,本申请提供一种计算机可读存储介质,其上存储有计算机指令,所述指令被执行时实现所述的克隆代码检测方法的步骤。
由上述技术方案可知,本申请提供一种克隆代码检测方法及装置。其中,该方法包括:将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得;对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算;若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码,本申请提供的克隆代码检测方法及装置能够提高克隆代码检测的准确性和高效性,特别适用于语义相似,但结构上不相似的克隆代码,能够有效降低克隆代码检测的误报率和漏报率;同时,通过获取代码对应的抽象语法树、数据流图和控制流图能够获取完整的代码结构和语义特征,增强代码的表示能力,提高克隆代码检测的自动化程度、检测精度并降低软件维护成本,进而提高软件的可靠性和质量。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例中的克隆代码检测方法的流程示意图;
图2是本申请实施例中的克隆代码检测方法中步骤201至203的流程示意图;
图3是本申请实施例中的克隆代码检测方法中步骤301至303的流程示意图;
图4是本申请实施例中的克隆代码检测装置的结构示意图。
图5为本申请实施例的电子设备9600的系统构成示意框图。
具体实施方式
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
软件开发过程中,软件开发的效率和软件产品的质量是软件工程领域的一大研究热点。一般情况下,软件维护占用了软件开发周期中的大部分资源和时间,而在软件维护中,对源代码的理解和修改工作需要耗费大量的时间和人力。故如果要提高软件开发的质量,就需要提高软件维护的效率。大型软件中普遍存在代码克隆现象。在2015年ICSE会议上,Hitesh等人对大规模开源代码库GitHub中的仓库做了克隆检测,研究结果显示,GitHub中开源软件的代码克隆率接近90%。
从代码相似性角度考虑,2007年Roy等人定义了四种克隆代码类型,分别为Type-1、Type-2、Type-3和Type-4类型。Type-1类型的克隆代码除了空格和代码的格式不同外,代码内容完全相同;Type-2类型的克隆代码除了用户自定义的变量名、函数名、常量、注释和代码布局格式等不同外,代码结构或代码语法构成都相同;Type-3类型的克隆代码是在Type-1和Type-2类型上的变动之外,代码本身存在增加、删除或修改的克隆代码类型;Type-4类型,又叫语义克隆类型的克隆代码与前三种有所不同,代码段功能相同但句法结构不同。
针对上述四种类型的克隆代码,业界已提出了一些检测方法。Komondoor等人在2001年提出了一种基于程序依赖图的代码克隆检测方法,该方法可以检测Type-1,Type-2和Type-3类型的克隆代码。Jiang等人通过人为定义特征向量使其逼近代码结构特征,并采用局部敏感哈希聚类相似向量实现代码克隆。在2008年的软件工程旗舰会议OSDI上,Li等人提出了使用Hash运算来检测克隆代码。具体地,将每一行代码转换成Hash值,通过滑动窗口技术挖掘封闭Hash值子序列来检测克隆,该方法也能够检测前三种类型的克隆代码。Martin等人在2016年软件工程旗舰会议上提出了一种基于深度学习的代码检测方法,该方法针对之前的技术依赖于人工定义特征表示代码的缺点,提出使用深度学习中的循环神经网络自动提取代码特征向量,并通过比较特征向量的相似度来完成克隆检测。
然而,一方面,由于人工定义特征需要对代码有较深的理解和专家知识,而且特征严重依赖于某一种开发语言,因此需要耗费大量的人力资源和时间开销;另一方面,人工定义的特征往往不全面,导致在实际使用过程中检测漏报率和误报率偏高,检测率低。不能提取完整的代码结构和语义特征。传统的克隆代码检测方法通常使用程序依赖图,提取代码片段的结构特征;或者使用循环神经网络来提取代码的结构和语义特征。然而,程序依赖图仅表达了程序之间的控制依赖和数据依赖关系,故程序依赖图对代码删除和增加尤为敏感,删除和增加代码很容易导致程序依赖图拓扑结果上的明显变化,导致漏报的发生。因此,基于程序依赖图匹配的方法对于Type-3类型的克隆效果较差。基于循环神经网络的方法需要固定长度的代码片段,超出长度的代码片段需要截取掉一部分代码,进而使待检测代码不完整,这极大限制了克隆检测能力和实际应用。
又因为源代码是高度结构化但书写风格又比较灵活的数据。结构相似的代码在语义上并不一定相似甚至截然相反。相同地,语义相似的代码在结构上也不一定相似。这是导致传统的克隆代码检测方法误报率、漏报率高的主要原因之一,即没有同时兼顾到代码语义和结构特征。考虑传统的克隆代码检测技术无法准确的提取代码语义和结构特征,本申请提出一种克隆代码检测方法及装置。通过提取源代码的抽象语法树(AST)、数据流图(CFG)以及控制流图(DFG),并将上述三种图融合成一种源代码表示图,可以准确的表示代码的语义和结构特征,并利用深度学习技术中的图卷积神经网络技术,构建代码表示模型,将代码表示成向量的形式,最后使用相似性度量的方法检测出目标代码中的克隆代码。其中,图卷积网络是一种人工神经网络,可以处理图类型的数据;AST是源代码语法结构的一种抽象表示;DFG表征程序中数据的流向;CFG是程序执行过程中的抽象表现,表征程序的控制流向。
为了提高提高克隆代码检测的准确性和高效性,进而提高软件的可靠性,本申请实施例提供一种克隆代码检测装置,该装置可以是一服务器或客户端设备,所述客户端设备可以包括智能手机、平板电子设备、网络机顶盒、便携式计算机、台式电脑、个人数字助理(PDA)、车载设备和智能穿戴设备等。其中,所述智能穿戴设备可以包括智能眼镜、智能手表和智能手环等。
在实际应用中,进行克隆代码检测的部分可以在如上述内容所述的服务器侧执行,也可以所有的操作都在所述客户端设备中完成。具体可以根据所述客户端设备的处理能力,以及用户使用场景的限制等进行选择。本申请对此不作限定。若所有的操作都在所述客户端设备中完成,所述客户端设备还可以包括处理器。
上述的客户端设备可以具有通信模块(即通信单元),可以与远程的服务器进行通信连接,实现与所述服务器的数据传输。所述服务器可以包括任务调度中心一侧的服务器,其他的实施场景中也可以包括中间平台的服务器,例如与任务调度中心服务器有通信链接的第三方服务器平台的服务器。所述的服务器可以包括单台计算机设备,也可以包括多个服务器组成的服务器集群,或者分布式装置的服务器结构。
所述服务器与所述客户端设备之间可以使用任何合适的网络协议进行通信,包括在本申请提交日尚未开发出的网络协议。所述网络协议例如可以包括TCP/IP协议、UDP/IP协议、HTTP协议、HTTPS协议等。当然,所述网络协议例如还可以包括在上述协议之上使用的RPC协议(Remote Procedure Call Protocol,远程过程调用协议)、REST协议(Representational State Transfer,表述性状态转移协议)等。
具体通过下述各个实施例进行说明。
图1是本申请一实施例提供的克隆代码检测方法的流程示意图,如图1所示,为了提高克隆代码检测的准确性和高效性,进而提高软件的可靠性,本实施例提供一种执行主体是克隆代码检测装置的克隆代码检测方法的实施例,具体包含有如下内容:
步骤101:将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得。
具体地,所述目标代码为待检测的代码段。图神经网络有强大的图数据特征提取的能力,可以将目标代码表示成代码图的形式,能够提高代码特征提取的高效性。
举例来说,可以应用word2vector工具,将目标代码对应的代码图中的每个节点编码成300维的特征向量。
步骤102:对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算。
具体地,所述图网络模型的输出结果为目标代码输入图网络模型后最终获得的特征向量;所述预获取的代码库代码可以是目标代码所在的目标系统中的代码,便于对目标系统中的代码进行维护和审计;也可以是开源代码库中的代码,如GitHub或Coding.ne,能够动态的维护该代码库用以比较其中的代码与目标代码的相似度。
步骤103:若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码。
具体地,所述预设阈值可根据实际情况进行设置,本申请对此不作限制。可以理解的是,若经判断获知所述相似度计算的结果不满足预设阈值,则确定所述目标代码中不存在克隆代码。
具体地,所述相似度计算类型包含有:余弦相似度计算、杰卡德系数计算、欧氏距离计算或皮尔逊系数计算类型。
由上述描述可知,在本申请实施例中首先利用训练完成的图网络模型,将目标代码转换成向量表示,然后使用余弦相似度算法,将目标代码对应的向量表示与代码库中的向量作对比,然后筛选出相似度大于预设阈值的代码,作为克隆代码;若检测不到,说明目标代码不存在克隆代码。能够提高提取代码特征的自动化程度,避免由于代码特征的不全面,导致检测漏报率和误报率偏高,进而提高代码特征提取的全面性和高效性,提高克隆代码检测的准确性。
图2是本申请另一实施例提供的克隆代码检测方法的流程示意图,如图2所示,为了进一步提高克隆代码检测的准确性和高效性,进而提高软件的可靠性,在步骤101之前,还包含有:
步骤201:将所述待训练代码图中的各个节点分别编码成多维特征向量。
具体地,所述待训练代码图为待训练代码对应的代码图,假设G=<V,E>表示代码图,其中V表示节点v的集合,E表示边的集合。图中每个节点v都有一个特征向量xv,其维度为d。可以使用word2vector工具,将图中的每个节点编码成多维的特征向量xv
步骤202:基于所述多维特征向量、邻居节点信息和Embedding函数,迭代获取所述各个节点的特征表示。
步骤203:应用所述聚合函数和各个节点的特征表示获取所述图网络模型。
图3是本申请又一实施例提供的克隆代码检测方法的流程示意图,如图3所示,为了提高获取目标代码的代码结构的完整性,进而提高克隆代码检测的准确性和自动化程度,在步骤201之前,还包含有:
步骤301:获取待训练代码的抽象语法树。
具体地,可以应用开源工具JavaParser获取待训练代码的抽象语法树(AST)。
步骤302:根据所述抽象语法树和控制流关系,将所述抽象语法树中有控制流关系的节点有向连接。
具体地,遍历所述抽象语法树的各个节点,并分析得到所述待训练代码中的控制流关系,将所述抽象语法树中有控制流关系的节点用有向边连接,生成控制流图(DFG)。
步骤303:根据所述抽象语法树和数据流关系,将所述抽象语法树中有数据流关系的节点有向连接,以生成所述待训练代码图。
具体地,遍历所述抽象语法树的各个节点,并分析得到所述待训练代码中的数据流关系,将所述抽象语法树中有数据流关系的节点用有向边连接。由于变量之间的依赖关系比较复杂,有同一个变量之间的关系和不同变量之间的关系之分,同一个变量之间的关系可分为:上次使用变量(LastUse);上次改变变量的值(LastWrite);不同变量之间的关系为计算自(ComputedFrom),例如a=b+5,变量a由变量b计算而来,故b影响了a,在AST中,节点b到节点a需要连接一条ComputedFrom的有向连接。依照相同方式,可以生成所述目标代码对应的代码图。
具体地,根据所述抽象语法树和数据流关系,将所述抽象语法树中有数据流关系的节点有向连接,生成控制流图(CFG);将DFG、CFG与AST结合,给AST中的节点添加数据依赖和控制依赖关系,生成所述待训练代码图,能够提高代码的表示能力。
其中,抽象语法树(AST)可以表示源代码的语义和结构特征,数据流图(DFG)表示了代码中数据的依赖关系,控制流图(CFG)表示了代码语句之间的控制依赖关系。
图4为本申请实施例提供的克隆代码检测装置的结构示意图,如图4所示,从软件层面来说,为了进一步提高克隆代码检测的准确性和高效性,进而提高软件的可靠性,本申请实施例提供一种用于实现所述克隆代码检测方法中全部或部分内容的克隆代码检测装置的实施例,具体包含有如下内容:
输入模块41,用于将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得。
相似度计算模块42,用于对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算。
判断模块43,用于若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码。
所述相似度计算的类型包括:余弦相似度计算、杰卡德系数计算、欧氏距离计算或皮尔逊系数计算类型。
在本申请一个实施例中,所述的克隆代码检测装置还包含有:
编码模块,用于将所述待训练代码图中的各个节点分别编码成多维特征向量。
获取特征表示模块,用于基于所述多维特征向量、邻居节点信息和Embedding函数,迭代获取所述各个节点的特征表示。
获取图网络模型模块,用于应用所述聚合函数和各个节点的特征表示获取所述图网络模型。
在本申请一个实施例中,所述的克隆代码检测装置还包含有:
获取抽象语法树模块,用于获取待训练代码的抽象语法树。
第一节点连接模块,用于根据所述抽象语法树和控制流关系,将所述抽象语法树中有控制流关系的节点有向连接。
第二节点连接模块,用于根据所述抽象语法树和数据流关系,将所述抽象语法树中有数据流关系的节点有向连接,以生成所述待训练代码图。
为了进一步说明本方案,本申请还提供一种代码图的构建方法的具体应用实例,在本应用实例中,对于一段给定的代码,本发明首先提取分析和提取代码的抽象语法树(AST),然后分析代码的控制流图和数据流图。最后将AST中有控制依赖和数据依赖关系的节点连接起来,构成一个完整的代码图。具体步骤如下:
S1:代码AST的构建。使用开源工具JavaParser提取待检测代码的AST;
S2:遍历AST节点,并分析待检测代码中的控制流关系,将AST中有控制流关系的节点用有向边连接。
S3:遍历AST节点,并分析待检测代码中的数据流关系,将AST中有数据流关系的节点用有向边连接。由于变量之间的依赖关系比较复杂,有同一个变量之间的关系和不同变量之间的关系之分,同一个变量之间的关系可分为:LastUse,即上次使用变量;LastWrite,即上次改变变量的值;不同变量之间的关系为ComputedFrom,例如a=b+5,变量a由变量b计算而来,故b影响了a,在AST中,节点b到节点a需要连接一条ComputedFrom的有向连接。
为了进一步说明本方案,本申请还提供一种图网络模型的构建方法的具体应用实例,在本应用实例中,假设G=<V,E>表示代码图,其中V表示节点的集合,E表示边的集合。图中每个节点都有一个特征向量xv,其维度为d。图网络模型的构建具体步骤如下:
S4:使用word2vector工具,将图中的每个节点编码成300维的特征向量。
S5:对于每一个节点,使用Embedding函数Γ,并结合当前节点v相连接的邻居节点信息xN(v),计算该节点的特征表示Embedding函数具体如下:
其中,N(v)表示当前节点v的邻居节点集合,tanh是神经网络中经常使用的非线性激活函数,W1是一个d×p维的权重矩阵,其中p为Embedding函数计算出的的维度,σ(xN(v))表示n个全连接网络层组成的神经网络,其是由第一层全连接网络层σ1(xN(v))至第n层全连接网络层σn(xN(v))组成,本实施例中,n设为6,其表达式如下:
σl+1(x)=P1×σl(x),σl(x)=ReLU(Plx),l∈[1,n]
其中,Pl是一个p×p维的权重矩阵,表示第l层的全连接网络层的权重参数值,ReLU为非线性激活函数,ReLU(x)=max{0,x}。
可以理解的是,当前节点的邻居节点信息xN(v)为所述300维的特征向量。
S6:迭代重复步骤S5,使图中每个节点的信息都能够尽可能多的传递到与其相邻或T-跳的节点中,以增强网络的表达能力。其迭代的过程表示如下:
其中,表示网络第t次迭代后节点v的特征向量。可以看出,T值越大,每个节点所传递和接收到其它节点的信息也就越多,距离也就越长。这使得网络能够更好的提取代码的结构和语义特征,增强网络特征提取的能力。
具体地,当前节点的T-跳节点为与当前节点不直接相邻的、间隔为T个节点距离的节点。例如,节点A与节点B直接相邻,节点B与节点C直接相邻,但节点A与C不相邻,那么节点C是节点A的1-跳节点。
具体地,对于代码图中的每个节点,迭代应用Embedding函数计算出每个节点的特征向量。例如,当计算当前节点的特征向量时,应用当前节点的特征与其邻居节点特征,使用Embedding函数计算出当前节点在本次迭代后的新的特征向量。迭代过程中,迭代次数根据代码图的规模和复杂度确定,本申请对此不作限制;图的规模越大,深度越深,迭代次数就需要设置越大(例如,代码图的深度为6,作为优选迭代次数设置为6),使代码图中的各个节点都能够接收到其它所有的节点信息。
S7:使用聚合函数E,将图中每个节点的特征聚合起来,用于表征代码,聚合函数表示如下:
其中n表示代码图中节点的个数,uG为p维的特征向量,其表示代码图最终的特征向量。
在进行克隆代码检测时,将所述代码图最终的特征向量与代码库中代码的特征向量进行比较,筛选出相似度大于某一阈值的代码,作为克隆代码。
为了进一步说明本方案,本申请还提供一种克隆代码检测装置的具体应用实例,在本应用实例中,所述的克隆代码检测装置具体包含有如下内容:
代码库构建模块:用于克隆代码库的构建,用于后续克隆代码检测。该代码库可以依托本系统的代码,后续方便对本系统代码进行维护和审计;也可以依托大规模开源代码库GitHub。
图网络构建模块:用于将代码转换成图表示的形式。使用滑动窗口技术,将待检测的代码根据不同的窗口大小划分成若干代码片段,然后将代码片段转换成图的形式,方便后续检测。
检测模块:用于利用训练好的图网络模型,将待检测代码转换成向量表示,然后使用余弦相似度算法,将待检测的代码的表示向量与代码库中的向量作对比,然后筛选出相似度大于某一阈值的代码,作为克隆代码。若检测不到,说明带检测代码不存在克隆代码。
由上述描述可知,本申请提供一种克隆代码检测方法及装置,具有如下优点:
代码的AST可以表示代码的结构信息,各个节点又包含有语义信息,更为重要的是,代码控制流图和数据流图能够反映代码的数据和控制的流向,能够增加代码结构和语义特征。因此,代码图可以有效地表征代码。
在图网络模型中,各个节点之间的数据交换使该模型与传统的循环神经网络相比,特征提取能力有很大的提高。并且图网络模型不要求输入是固定长度的代码,其可以输入不同拓扑结构的图,使网络具有极强的适应性,本申请提供的克隆代码检测方法及装置能够应用在实际的业务场景中,提高用户体验。
从硬件层面来说,为了提高克隆代码检测的准确性和高效性,进而提高软件的可靠性,本申请提供一种用于实现所述克隆代码检测方法中的全部或部分内容的电子设备的实施例所述电子设备具体包含有如下内容:
处理器(processor)、存储器(memory)、通信接口(Communications Interface)和总线;其中,所述处理器、存储器、通信接口通过所述总线完成相互间的通信;所述通信接口用于实现所述克隆代码检测装置以及用户终端等相关设备之间的信息传输;该电子设备可以是台式计算机、平板电脑及移动终端等,本实施例不限于此。在本实施例中,该电子设备可以参照实施例用于实现所述克隆代码检测方法的实施例及用于实现所述克隆代码检测装置的实施例进行实施,其内容被合并于此,重复之处不再赘述。
图5为本申请实施例的电子设备9600的系统构成的示意框图。如图5所示,该电子设备9600可以包括中央处理器9100和存储器9140;存储器9140耦合到中央处理器9100。值得注意的是,该图5是示例性的;还可以使用其他类型的结构,来补充或代替该结构,以实现电信功能或其他功能。
在本申请一个或多个实施例中,克隆代码检测功能可以被集成到中央处理器9100中。其中,中央处理器9100可以被配置为进行如下控制:
步骤101:将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得。
步骤102:对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算。
步骤103:若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码。
从上述描述可知,本申请的实施例提供的电子设备,能够提高克隆代码检测的准确性和高效性,进而提高软件的可靠性。
在另一个实施方式中,克隆代码检测装置可以与中央处理器9100分开配置,例如可以将克隆代码检测装置配置为与中央处理器9100连接的芯片,通过中央处理器的控制来实现克隆代码检测功能。
如图5所示,该电子设备9600还可以包括:通信模块9110、输入单元9120、音频处理器9130、显示器9160、电源9170。值得注意的是,电子设备9600也并不是必须要包括图5中所示的所有部件;此外,电子设备9600还可以包括图5中没有示出的部件,可以参考现有技术。
如图5所示,中央处理器9100有时也称为控制器或操作控件,可以包括微处理器或其他处理器装置和/或逻辑装置,该中央处理器9100接收输入并控制电子设备9600的各个部件的操作。
其中,存储器9140,例如可以是缓存器、闪存、硬驱、可移动介质、易失性存储器、非易失性存储器或其它合适装置中的一种或更多种。可储存上述与失败有关的信息,此外还可存储执行有关信息的程序。并且中央处理器9100可执行该存储器9140存储的该程序,以实现信息存储或处理等。
输入单元9120向中央处理器9100提供输入。该输入单元9120例如为按键或触摸输入装置。电源9170用于向电子设备9600提供电力。显示器9160用于进行图像和文字等显示对象的显示。该显示器例如可为LCD显示器,但并不限于此。
该存储器9140可以是固态存储器,例如,只读存储器(ROM)、随机存取存储器(RAM)、SIM卡等。还可以是这样的存储器,其即使在断电时也保存信息,可被选择性地擦除且设有更多数据,该存储器的示例有时被称为EPROM等。存储器9140还可以是某种其它类型的装置。存储器9140包括缓冲存储器9141(有时被称为缓冲器)。存储器9140可以包括应用/功能存储部9142,该应用/功能存储部9142用于存储应用程序和功能程序或用于通过中央处理器9100执行电子设备9600的操作的流程。
存储器9140还可以包括数据存储部9143,该数据存储部9143用于存储数据,例如联系人、数字数据、图片、声音和/或任何其他由电子设备使用的数据。存储器9140的驱动程序存储部9144可以包括电子设备的用于通信功能和/或用于执行电子设备的其他功能(如消息传送应用、通讯录应用等)的各种驱动程序。
通信模块9110即为经由天线9111发送和接收信号的发送机/接收机9110。通信模块(发送机/接收机)9110耦合到中央处理器9100,以提供输入信号和接收输出信号,这可以和常规移动通信终端的情况相同。
基于不同的通信技术,在同一电子设备中,可以设置有多个通信模块9110,如蜂窝网络模块、蓝牙模块和/或无线局域网模块等。通信模块(发送机/接收机)9110还经由音频处理器9130耦合到扬声器9131和麦克风9132,以经由扬声器9131提供音频输出,并接收来自麦克风9132的音频输入,从而实现通常的电信功能。音频处理器9130可以包括任何合适的缓冲器、解码器、放大器等。另外,音频处理器9130还耦合到中央处理器9100,从而使得可以通过麦克风9132能够在本机上录音,且使得可以通过扬声器9131来播放本机上存储的声音。
由上述描述可知,本申请的实施例提供的电子设备,能够提高克隆代码检测的准确性和高效性,进而提高软件的可靠性。
本申请的实施例还提供能够实现上述实施例中的克隆代码检测方法中全部步骤的一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述实施例中的克隆代码检测方法的全部步骤,例如,所述处理器执行所述计算机程序时实现下述步骤:
步骤101:将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得。
步骤102:对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算。
步骤103:若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码。
从上述描述可知,本申请实施例提供的计算机可读存储介质,能够提高克隆代码检测的准确性和高效性,进而提高软件的可靠性。
本申请中上述方法的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。相关之处参见方法实施例的部分说明即可。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
本申请中应用了具体实施例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

Claims (10)

1.一种克隆代码检测方法,其特征在于,包括:
将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得;
对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算;
若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码;
在所述将目标代码对应的代码图输入预设的图网络模型之前,还包括:
获取目标代码的目标抽象语法树;
根据所述目标抽象语法树和目标控制流关系,将所述目标抽象语法树中有控制流关系的节点有向连接,所述目标控制流关系表示所述目标代码中语句之间的控制依赖关系;
根据所述目标抽象语法树和目标数据流关系,将所述目标抽象语法树中有数据流关系的节点有向连接,以生成所述目标代码对应的代码图,所述目标数据流关系表示所述目标代码中数据的依赖关系。
2.根据权利要求1所述的克隆代码检测方法,其特征在于,在所述将目标代码对应的代码图输入预设的图网络模型之前,还包括:
将所述待训练代码图中的各个节点分别编码成多维特征向量;
基于所述多维特征向量、邻居节点信息和Embedding函数,迭代获取所述各个节点的特征表示;
应用所述聚合函数和各个节点的特征表示获取所述图网络模型。
3.根据权利要求2所述的克隆代码检测方法,其特征在于,在所述将所述待训练代码图中的各个节点分别编码成多维特征向量之前,还包括:
获取待训练代码的抽象语法树;
根据所述抽象语法树和控制流关系,将所述抽象语法树中有控制流关系的节点有向连接;
根据所述抽象语法树和数据流关系,将所述抽象语法树中有数据流关系的节点有向连接,以生成所述待训练代码图。
4.根据权利要求1所述的克隆代码检测方法,其特征在于,所述相似度计算的类型包括:余弦相似度计算、杰卡德系数计算、欧氏距离计算或皮尔逊系数计算类型。
5.一种克隆代码检测装置,其特征在于,包括:
输入模块,用于将目标代码对应的代码图输入预设的图网络模型,其中,该图网络模型为应用聚合函数和各个节点的特征表示训练得到,且所述各个节点的特征表示为根据待训练代码图中的各个节点分别编码成的多维特征向量、邻居节点信息和Embedding函数迭代而得;
相似度计算模块,用于对所述图网络模型的输出结果和预获取的代码库代码的特征向量进行相似度计算;
判断模块,用于若经判断获知所述相似度计算的结果满足预设阈值,则确定所述目标代码中存在克隆代码;
所述克隆代码检测装置还用于:
获取目标代码的目标抽象语法树;
根据所述目标抽象语法树和目标控制流关系,将所述目标抽象语法树中有控制流关系的节点有向连接,所述目标控制流关系表示所述目标代码中语句之间的控制依赖关系;
根据所述目标抽象语法树和目标数据流关系,将所述目标抽象语法树中有数据流关系的节点有向连接,以生成所述目标代码对应的代码图,所述目标数据流关系表示所述目标代码中数据的依赖关系。
6.根据权利要求5所述的克隆代码检测装置,其特征在于,还包括:
编码模块,用于将所述待训练代码图中的各个节点分别编码成多维特征向量;
获取特征表示模块,用于基于所述多维特征向量、邻居节点信息和Embedding函数,迭代获取所述各个节点的特征表示;
获取图网络模型模块,用于应用所述聚合函数和各个节点的特征表示获取所述图网络模型。
7.根据权利要求6所述的克隆代码检测装置,其特征在于,还包括:
获取抽象语法树模块,用于获取待训练代码的抽象语法树;
第一节点连接模块,用于根据所述抽象语法树和控制流关系,将所述抽象语法树中有控制流关系的节点有向连接;
第二节点连接模块,用于根据所述抽象语法树和数据流关系,将所述抽象语法树中有数据流关系的节点有向连接,以生成所述待训练代码图。
8.根据权利要求5所述的克隆代码检测装置,其特征在于,所述相似度计算的类型包括:余弦相似度计算、杰卡德系数计算、欧氏距离计算或皮尔逊系数计算类型。
9.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至4任一项所述的克隆代码检测方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,所述指令被处理器执行时实现权利要求1至4任一项所述的克隆代码检测方法的步骤。
CN201911195989.5A 2019-11-29 2019-11-29 克隆代码检测方法及装置 Active CN110990273B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911195989.5A CN110990273B (zh) 2019-11-29 2019-11-29 克隆代码检测方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911195989.5A CN110990273B (zh) 2019-11-29 2019-11-29 克隆代码检测方法及装置

Publications (2)

Publication Number Publication Date
CN110990273A CN110990273A (zh) 2020-04-10
CN110990273B true CN110990273B (zh) 2024-04-23

Family

ID=70088081

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911195989.5A Active CN110990273B (zh) 2019-11-29 2019-11-29 克隆代码检测方法及装置

Country Status (1)

Country Link
CN (1) CN110990273B (zh)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111562943B (zh) * 2020-04-29 2023-07-11 海南大学 一种基于事件嵌入树及gat网络的代码克隆检测方法和装置
CN113946366A (zh) * 2020-07-17 2022-01-18 华为技术有限公司 代码分析的方法、系统及计算设备
CN111931252B (zh) * 2020-07-28 2022-05-03 重庆邮电大学 一种基于滑动窗口和cenn的车载can入侵检测方法
CN112035165B (zh) * 2020-08-26 2023-06-09 山谷网安科技股份有限公司 基于同构网络的代码克隆检测方法及系统
CN112286575A (zh) * 2020-10-20 2021-01-29 杭州云象网络技术有限公司 基于图匹配模型的智能合约相似度检测方法及系统
CN112433756B (zh) * 2020-11-24 2021-09-07 北京京航计算通讯研究所 基于加权递归自编码器的快速代码克隆检测方法及装置
CN113900654B (zh) * 2021-09-07 2024-09-06 安徽中科国创高可信软件有限公司 基于程序语言教学实践平台的代码抄袭检测方法及系统
CN114356405B (zh) * 2022-03-21 2022-05-17 思探明信息科技(南京)有限公司 开源组件函数的匹配方法、装置、计算机设备和存储介质
CN115129364B (zh) * 2022-07-05 2023-04-18 四川大学 基于抽象语法树和图神经网络的指纹身份识别方法和系统
CN116302074B (zh) * 2023-05-12 2023-07-28 卓望数码技术(深圳)有限公司 第三方组件识别方法、装置、设备及存储介质
CN118331637A (zh) * 2024-06-14 2024-07-12 北京迪力科技有限责任公司 一种代码相似性评估方法、装置、设备及存储介质
CN118468296B (zh) * 2024-07-12 2024-09-10 武汉金银湖实验室 一种克隆漏洞检测方法、系统及设备

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108446540A (zh) * 2018-03-19 2018-08-24 中山大学 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
KR20190030490A (ko) * 2017-09-14 2019-03-22 국방과학연구소 프로그램 소스 코드의 보안 취약점 검출 장치 및 방법
CN110135157A (zh) * 2019-04-04 2019-08-16 国家计算机网络与信息安全管理中心 恶意软件同源性分析方法、系统、电子设备及存储介质
CN110287702A (zh) * 2019-05-29 2019-09-27 清华大学 一种二进制漏洞克隆检测方法及装置
CN110502361A (zh) * 2019-08-29 2019-11-26 扬州大学 面向bug报告的细粒度缺陷定位方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101780233B1 (ko) * 2016-04-26 2017-09-21 고려대학교 산학협력단 소프트웨어의 코드 클론 탐지 장치 및 방법

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20190030490A (ko) * 2017-09-14 2019-03-22 국방과학연구소 프로그램 소스 코드의 보안 취약점 검출 장치 및 방법
CN108446540A (zh) * 2018-03-19 2018-08-24 中山大学 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
CN110135157A (zh) * 2019-04-04 2019-08-16 国家计算机网络与信息安全管理中心 恶意软件同源性分析方法、系统、电子设备及存储介质
CN110287702A (zh) * 2019-05-29 2019-09-27 清华大学 一种二进制漏洞克隆检测方法及装置
CN110502361A (zh) * 2019-08-29 2019-11-26 扬州大学 面向bug报告的细粒度缺陷定位方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
Java Code Clone Detection by Exploiting Semantic and Syntax Information From Intermediate Code-Based Graph;Dawei Yuan等;《IEEE Transactions on Reliability (Volume: 72, Issue: 2, June 2023)》;全文 *
刘复星等.基于深度学习的代码克隆检测技术研究.《电脑知识与技术》.2018,第14卷(第18期),全文. *
谢春丽等.改进的卷积神经网络源代码相似性度量方法.《应用数学和力学》.2019,第40卷(第11期),第1235-1245页. *

Also Published As

Publication number Publication date
CN110990273A (zh) 2020-04-10

Similar Documents

Publication Publication Date Title
CN110990273B (zh) 克隆代码检测方法及装置
CN109783582B (zh) 一种知识库对齐方法、装置、计算机设备及存储介质
CN111274811B (zh) 地址文本相似度确定方法以及地址搜索方法
US11907675B2 (en) Generating training datasets for training neural networks
CN111400504B (zh) 企业关键人的识别方法和装置
CN112989055B (zh) 文本识别方法、装置、计算机设备和存储介质
CN113570030B (zh) 数据处理方法、装置、设备以及存储介质
WO2020199595A1 (zh) 基于词袋模型的长文本分类方法、装置、计算机设备及存储介质
CN114861889B (zh) 深度学习模型的训练方法、目标对象检测方法和装置
US10217455B2 (en) Linguistic model database for linguistic recognition, linguistic recognition device and linguistic recognition method, and linguistic recognition system
CN113779316A (zh) 信息生成方法、装置、电子设备和计算机可读介质
CN111159424B (zh) 标注知识图谱实体的方法,装置,存储介质及电子设备
CN113743432A (zh) 一种图像实体信息获取方法、设备、电子设备和存储介质
CN107622201B (zh) 一种抗加固的Android平台克隆应用程序快速检测方法
CN113393288B (zh) 订单处理信息生成方法、装置、设备和计算机可读介质
CN115577363A (zh) 恶意代码反序列化利用链的检测方法及装置
CN113361629A (zh) 一种训练样本生成的方法、装置、计算机设备及存储介质
CN111723188A (zh) 用于问答系统的基于人工智能的语句显示方法、电子设备
CN113361249B (zh) 文档判重方法、装置、电子设备和存储介质
CN115718696B (zh) 源码密码学误用检测方法、装置、电子设备和存储介质
CN111353282B (zh) 模型训练、文本改写方法、装置和存储介质
CN113722496B (zh) 一种三元组抽取方法、装置、可读存储介质及电子设备
KR102374034B1 (ko) 시드 파일 생성 장치 및 그 방법
CN116092521A (zh) 特征频点识别模型训练和音频指纹识别方法、设备及产品
CN117008961A (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