CN115309451A - 代码克隆检测方法、装置、设备、存储介质及程序产品 - Google Patents

代码克隆检测方法、装置、设备、存储介质及程序产品 Download PDF

Info

Publication number
CN115309451A
CN115309451A CN202210784064.XA CN202210784064A CN115309451A CN 115309451 A CN115309451 A CN 115309451A CN 202210784064 A CN202210784064 A CN 202210784064A CN 115309451 A CN115309451 A CN 115309451A
Authority
CN
China
Prior art keywords
code
information
fusion
nodes
function
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.)
Pending
Application number
CN202210784064.XA
Other languages
English (en)
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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202210784064.XA priority Critical patent/CN115309451A/zh
Publication of CN115309451A publication Critical patent/CN115309451A/zh
Pending legal-status Critical Current

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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking

Abstract

本申请实施例公开了一种代码克隆检测方法、装置、设备、存储介质及程序产品,属于计算机技术领域。该方法包括:获取代码源文件的语法信息以及语义信息;对语法信息以及语义信息进行信息融合,得到代码融合信息;对代码融合信息进行特征提取,得到代码源文件的特征向量;基于各个代码源文件的特征向量进行特征对比,得到克隆检测结果。基于对源代码的语法分析和语义分析结果进行克隆检测,既能够有效甄别微小的语法变化对相似度的影响,也能够有效识别出同质异构的代码片段,有助于提高各种类型的克隆代码的检测准确率。

Description

代码克隆检测方法、装置、设备、存储介质及程序产品
技术领域
本申请实施例涉及计算机技术领域,特别涉及一种代码克隆检测方法、装置、设备、存储介质及程序产品。
背景技术
代码克隆检测是最基本的软件工程技术之一,主要应用于代码复用、安全与软件工程研效管理。代码克隆可以大致划分为四类:Type1、除空格、换行、注释等,其它代码内容完全一致;Type 2、除变量、方法、类名等重命名以外,其它代码内容完全一致;Type 3、代码片段存在局部修改,或调整了语句、模块顺序;Type 4、代码片段不一致但其语义一致、实现功能一致。
相关技术中的代码克隆检测主要通过对代码的文本进行简单的预处理并整体哈希处理,计算相似度。然而,上述方法只能够支持前两种类型的克隆检测,检测准确率较低,泛化能力弱,存在识别结果的误报或漏报。
发明内容
本申请实施例提供了一种代码克隆检测方法、装置、设备、存储介质及程序产品,有助于提高各种类型的克隆代码的检测准确率。所述技术方案如下:
一方面,本申请提供了一种代码克隆检测方法,所述方法包括:
获取代码源文件的语法信息以及语义信息,所述语法信息用于指示代码的语法结构,所述语义信息用于指示代码的含义;
对所述语法信息以及所述语义信息进行信息融合,得到代码融合信息;
对所述代码融合信息进行特征提取,得到所述代码源文件的特征向量;
基于各个代码源文件的所述特征向量进行特征对比,得到克隆检测结果,所述克隆检测结果用于指示所述代码源文件之间的相似度。
另一方面,本申请提供了一种代码克隆检测装置,所述装置包括:
获取模块,用于获取代码源文件的语法信息以及语义信息,所述语法信息用于指示代码的语法结构,所述语义信息用于指示代码的含义;
信息融合模块,用于对所述语法信息以及所述语义信息进行信息融合,得到代码融合信息;
特征提取模块,用于对所述代码融合信息进行特征提取,得到所述代码源文件的特征向量;
相似度评价模块,用于基于各个代码源文件的所述特征向量进行特征对比,得到克隆检测结果,所述克隆检测结果用于指示所述代码源文件之间的相似度。
另一方面,本申请提供了一种计算机设备,所述计算机设备包括处理器和存储器;所述存储器中存储有至少一段程序,所述至少一段程序由所述处理器加载并执行以实现如上述方面所述的代码克隆检测方法。
另一方面,本申请提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一条计算机程序,所述计算机程序由处理器加载并执行以实现如上述方面所述的代码克隆检测方法。
根据本申请的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述方面的各种可选实现方式中提供的代码克隆检测方法。
本申请实施例提供的技术方案至少包括以下有益效果:
本申请实施例中,通过对代码源文件的语法信息和语义信息进行融合,得到代码源文件的融合特征,进而基于待检测的代码源文件的融合特征进行特征比对,得到相似度。充分考虑代码语法特征和语义特征进行克隆检测,既能够有效甄别微小的语法变化对相似度的影响,也能够有效识别出同质异构的代码片段,有助于提高各种类型的克隆代码的检测准确率。
附图说明
图1是本申请一个示例性实施例提供的代码克隆检测方法的流程图;
图2是本申请另一个示例性实施例提供的代码克隆检测方法的流程图;
图3是本申请一个示例性实施例提供的代码融合信息的示意图;
图4是本申请一个示例性实施例提供的代码克隆检测方法的框架图;
图5是本申请另一个示例性实施例提供的代码克隆检测方法的流程图;
图6是本申请一个示例性实施例提供的相似度计算过程的示意图;
图7是本申请一个示例性实施例提供的代码克隆检测装置的结构框图;
图8是本申请一个示例性实施例提供的计算机设备的结构框图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
首先,对本申请实施例中涉及的名词进行简要介绍:
抽象语法树(AbstractSyntaxTree,AST):基于编程语言关键词、语法规则等对源码抽象出来的结构化树。
控制流图(ControlFlowGraph,CFG):代码函数与方法中依据跳转语句(IF、 ELSE、SWITCH、GOTO)等形成的结构化图。
函数调用图(CallGraph,CG):函数与方法之间的调用关系图。
数据流图(Dataflow,DL):代码中的全局变量、局部变量以及静态变量等在程序存活期间的活动轨迹图。
程序依赖图(Program Dependency Graph,PDG):由控制流图与数据流图构成,分为数据依赖和控制依赖。
人工智能(Artificial Intelligence,AI):利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用系统。换句话说,人工智能是计算机科学的一个综合技术,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。人工智能也就是研究各种智能机器的设计原理与实现方法,使机器具有感知、推理与决策的功能。人工智能技术是一门综合学科,涉及领域广泛,既有硬件层面的技术也有软件层面的技术。人工智能基础技术一般包括如传感器、专用人工智能芯片、云计算、分布式存储、大数据处理技术、操作/交互系统、机电一体化等技术。人工智能软件技术主要包括计算机视觉技术、语音处理技术、自然语言处理技术以及机器学习/深度学习等几大方向。
相关技术中基于代码分析的克隆检测技术主要分为以下三类:
1、基于文本的方法是将源代码看作字符串的序列,通过匹配最长重复字符串序列进行检测,没有对源代码进行转化。该方法在处理Type1类问题上比较有效,也能基本处理Type2和Type3类问题。
2、基于Token的方法是利用词法分析和语法分析,将源代码转化为Token 序列,通过匹配最长重复子序列,对源代码进行检测。该方法能有效解决Type1 和Type2类问题,但无法解决Type3类问题。
3、基于度量的方法,通过计算函数或类中的语句的度量值,以及对比度量值以反映代码之间的差异。这类方法同样能够解决Type1、Type2和Type4类问题,但无法解决Type3类问题。
为了解决上述相关技术存在的问题,本申请实施例提供了一种代码克隆检测方法,能够针对上述四种克隆场景进行检测。下面对本申请实施例提供的代码克隆检测方法的应用场景进行示意性说明。
1、辅助工程师监测代码重复率:
本申请实施例提供的代码克隆检测方法可集成为快速、高效、高精度的代码重复率检测工具。例如,通过植入Development和Operations的持续集成流水线中,可以在代码合入时提醒工程师变更代码是否遵循了复用原则;在软件架构梳理与架构升级过程中,可以为工程师提供整体系统的重复率报告,辅助架构师决策架构设计;此外,还可以辅助科研人员对他人提交的代码进行代码查重。
2、帮助开发人员进行大仓业务管理:
大仓开发模式下,各业务线集中托管,针对业务线中网关、配置、数据库、中间件等大量类似或重复的组件,设计并开发代码克隆检测工具对于协助收敛并统一维护公共库、组件、工具类具有极高的工程价值。通过本申请实施例提供的代码克隆检测方法对大仓中各个业务的基础代码模块进行代码克隆检测,可以将迁移到大仓的各个业务公共的基础代码模块抽离出来,进行统一治理、统一维护。
请参考图1,其示出了本申请一个示例性实施例提供的代码克隆检测方法的流程图。本实施例以该方法由具有代码编译能力的计算机设备执行为例进行说明。该方法包括如下步骤:
步骤101,获取代码源文件的语法信息以及语义信息,语法信息用于指示代码的语法结构,语义信息用于指示代码的含义。
代码的语法信息能够表征具体的代码语句,例如关键字、变量名、符号等。而语义信息则能够表征代码的含义,即代码所实现的功能。
在一种可能的实施方式中,计算机设备获取待检测的两个或两个以上的代码源文件,针对每个代码源文件,分别获取其语法信息和语义信息。
示意性的,计算机设备基于克隆检测界面中的克隆检测操作,确定待检测的代码源文件a和代码源文件b。计算机设备获取代码源文件a的语法信息和语义信息,以及代码源文件b的语法信息和语义信息。
步骤102,对语法信息以及语义信息进行信息融合,得到代码融合信息。
计算机设备针对每个待检测的代码源文件,进行信息融合,得到各个代码源文件的代码融合信息。该代码融合信息中融合有代码的语法特征以及语义特征。
示意性的,计算机设备对代码源文件的语法信息和语义信息进行信息融合,得到既能够反映语法也能够反映语义的树状结构。该树状结构中的节点包含关键字、变量名、语句含义等信息,且包含能够反映数据流向或代码控制流向的边。
步骤103,对代码融合信息进行特征提取,得到代码源文件的特征向量。
在一种可能的实施方式中,计算机设备基于代码融合信息进行特征提取,得到代码源文件对应的特征向量。示意性的,代码源文件的特征向量为上述树状结构中各个节点的特征向量的集合,且代码源文件的特征向量中包含节点之间的语义关系。
步骤104,基于各个代码源文件的特征向量进行特征对比,得到克隆检测结果,克隆检测结果用于指示代码源文件之间的相似度。
计算机设备基于代码源文件的特征向量计算相似度,该相似度即可表示代码源文件的相似度。在一种可能的实施方式中,计算机设备输出的克隆检测结果包含代码源文件之间的相似度,还包含涉及到的相似代码片段,以供用户参考。
示意性的,计算机设备分别对代码源文件的特征向量进行哈希处理,得到每个代码源文件的特征向量对应的哈希值,然后基于哈希值进行相似度计算,得到克隆检测结果。
综上所述,本申请实施例中,通过对代码源文件的语法信息和语义信息进行融合,得到代码源文件的融合特征,进而基于待检测的代码源文件的融合特征进行特征比对,得到相似度。充分考虑代码语法特征和语义特征进行克隆检测,既能够有效甄别微小的语法变化对相似度的影响,也能够有效识别出同质异构的代码片段,有助于提高各种类型的克隆代码的检测准确率。
在一种可能的实施方式中,计算机设备基于包括但不限于抽象语法树、函数调用图、控制流图以及数据流图四种信息进行信息融合。其中抽象语法树反映代码语法,函数调用图、控制流图以及数据流图反映代码语义。
请参考图2,其示出了本申请另一个示例性实施例提供的代码克隆检测方法的流程图。本实施例以该方法由具有代码编译能力的计算机设备执行为例进行说明。该方法包括如下步骤:
步骤201,获取代码源文件的语法信息以及语义信息,语法信息用于指示代码的语法结构,语义信息用于指示代码的含义。
在一种可能的实施方式中,语法信息包括方法级抽象语法树,语义信息包括函数调用图、控制流图以及数据流图。其中,方法级抽象语法树是基于编程语言关键词、语法规则等对源码抽象出来的结构化树。函数调用图是用于表征函数之间调用关系的图。通常一个函数对应有一个(或多个)方法级抽象语法树。
可选的,计算机设备通过代码编译器或者开源工具,生成代码源文件的方法级抽象语法树,以及构建代码源文件对应的函数调用图、控制流图和数据流图。
步骤202,对方法级抽象语法树以及函数调用图进行信息融合,得到函数级抽象语法树。
计算机设备直接编译得到的仅为方法级抽象语法树,在与函数调用图进行信息融合后,可得到函数级抽象语法树。该函数级抽象语法树仍然是反映源代码语法结构的树,但其还能够反映函数之间的调用关系这一语义信息。
在一种可能的实施方式中,步骤202具体包括如下步骤202a至步骤202b:
步骤202a,基于函数调用图对代码源文件中的函数进行归一化处理,得到目标函数,目标函数为与其它函数之间不存在调用关系的独立函数,或存在调用关系的至少两个函数的集合。
在一种可能的实施方式中,计算机设备提取代码源文件的函数调用与,将存在调用关系的函数连接在一起,形成一个新的函数,即目标函数。对于没有调用关系的函数,计算机设备将其本身确定为一个目标函数。因此,相互之间存在调用关系的函数构成一个新的函数节点。
例如,代码源文件中包含函数a、函数b、函数c和函数d,其中,函数a 与函数c、函数d存在调用关系。计算机设备基于函数调用图对其进行归一化处理,得到目标函数A和目标函数B,其中,目标函数A中包括函数a、函数c 和函数d,目标函数B为函数b。
步骤202b,基于目标函数对各代码片段对应的方法级抽象语法树进行连接,得到函数级抽象语法树。
计算机设备对初始函数进行归一化后,基于目标函数,将方法级别的抽象语法树连接成函数级别的抽象语法树。例如上述步骤202a中的示例,计算机设备基于函数a、函数c以及函数d之间的调用关系,对三者的方法级抽象语法树进行连接。使抽象语法树中融合有语法信息以及函数调用关系。
抽象语法树的节点中包含大量的变量、关键字以及符号等内容。在一种可能的实施方式中,为了消除变量名给克隆检测过程造成的影响,上述步骤202b 之后,本申请实施例提供的代码克隆检测方法还可以包括如下步骤202c至步骤 202d:
步骤202c,获取函数级抽象语法树的节点中包含的初始变量名。
步骤202d,对初始变量名进行归一化处理,将初始变量名替换为目标变量名。
其中,目标变量名由变量类型名称以及计数数字i组成,变量类型名称用于表征变量所属的变量类型,计数数字用于表征属于变量类型的第i个变量,i为正整数。
变量名的变化不会对代码实质内容造成影响,真正对代码含义产生实质影响的为变量类型和赋值等内容。但变量名的不同会影响最终的相似度计算结果。因此计算机设备对代码源文件中的变量名进行归一化处理,用变量类型代替自定义的名称,从而能够防止变量名称的变化导致克隆检测结果不准确的情况。
示意性的,计算机设备将变量类型划分为包括但不仅限以下五类:整数(Integer,INT)、浮点型(FLOAT)、字符型(CHAR)、字符串(STRING)和布尔型(BOOL)。则变量名用变量类型和计数数字的形式组成。例如对于代码源文件中的第一个整数型变量a,计算机设备将其名称由“a”替换为“INT1”,并对全文中的a均进行替换。
在另一种可能的实施方式中,计算机设备还可以在对方法级抽象语法树进行信息融合之前,进行变量名的归一化处理。
可选的,在对方法级抽象语法树进行信息融合之前,计算机设备还对代码中的空格、注释以及符号(例如分号)进行剔除,以降低上述非实质内容的变化对克隆检测结果的影响。
步骤203,对函数级抽象语法树、控制流图以及数据流图进行信息融合,得到代码融合信息。
函数级的抽象语法树中包含了源代码中的语法信息以及函数调用信息,是代码的另一种表现形式。而抽象语法树往往较为庞大,不利于直接进行特征提取和分析。因此计算机设备利用包含但不限于数据流和控制流等语义信息对函数级抽象语法树进行切割划分。其中,控制流图中包含代码中的分支跳转信息,数据流图包含代码中的数据流向信息。
在一种可能的实施方式中,步骤203具体包括如下步骤203a至步骤203b:
步骤203a,在控制流图的语句节点下插入对应的函数级抽象语法树。
计算机设备确定语句节点与抽象语法树之间的对应关系,在各个语句节点下方连接其对应的抽象语法树,从而实现函数级抽抽象语法树与控制流图的融合。示意性的,计算机设备对控制流图中的语句节点以及语句节点对应的抽象语法树中的父节点进行连接。
步骤203b,基于数据流图,在控制流图的语句节点之间加入用于指示数据流向的边,得到代码融合信息。
计算机设备基于构造出的数据流图,在控制流图的语句节点之间添加数据流指向的边。实现方法级抽象语法树、函数调用图、控制流图以及数据流图的融合,得到代码融合信息。
上述步骤203a与步骤203b之间并无严格的先后执行顺序。
示意性的,给出如下代码片段:
Figure RE-GDA0003881079490000091
计算机设备针对上述一段代码片段进行信息融合,得到的代码融合信息,即融合有语法节点、函数调用关系、控制流节点、数据流向和控制流向的树状图如图3所示。其中“入口”、“声明”、“判断”等节点为控制流图中的语句节点,对应上述代码中的语句,比如“入口”对应语句“public static void main(String[] args)”。“声明”、“判断”、“赋值”控制流节点下方所连接的树状图为函数级抽象语法图,其中的节点用于表征关键字、变量、赋值、符号等内容。控制流图的语句节点之间连接有用于指示控制流向的边(图中语句节点之间带箭头的实线),例如节点“判断”后存在两个分支,一个指向第一个赋值节点,另一个分支指向第二个赋值节点。并且,控制流图的语句节点之间还连接有用于指示数据流向的边(图中语句节点之间带箭头的虚线),例如用于声明变量a的赋值的语句节点指向判断节点和第一个赋值节点。图3所示的融合图中既能够反映语法信息也能够反映语义信息。
步骤204,对代码融合信息进行特征提取,得到代码源文件的特征向量。
步骤205,基于各个代码源文件的特征向量进行特征对比,得到克隆检测结果,克隆检测结果用于指示代码源文件之间的相似度。
步骤204至步骤205的具体实施方式可以参考上述步骤103至步骤104,本申请实施例在此不再赘述。
相关技术中存在利用树结构进行代码克隆检测的方法,例如抽象语法树。但相关技术中的方法是通过搜索完整树结构中的相似子树进行检测,其仅能检测出代码片段内容一致的克隆代码,对于语句、模块顺序不一致的局部改造克隆代码则会产生误报的情况。
本申请实施例中,先基于函数调用图对方法级抽象语法树进行连接,得到函数级抽象语法树,再基于控制流图和数据流图对函数级抽象语法树进行划分和信息补充,基于融合后的信息进行特征提取以及相似度计算,既能够有效甄别微小的语法变化对相似度的影响,即低质量的代码复制,也能够有效识别出同质异构的代码片段,即语义类似的代码模块。其次,对变量名进行归一化处理,利用变量类型和计数数字代替自定义的变量名,从而降低变量名的变化对检测结果的影响。
结合上述实施例,图4示出了代码克隆检测方法的框架图。计算机设备分别针对代码源文件m1和代码源文件m2进行如下操作:生成方法级抽象语法树、函数调用图、控制流图以及数据流图;基于函数调用图对方法级抽象语法树进行拼接,得到函数级抽象语法树;基于控制流图和数据流图对函数级抽象语法树进行裁剪,得到简化抽象语法树;基于简化抽象语法树进行特征提取,得到函数特征(即代码源文件的特征向量)。接着,计算机设备计算代码源文件m1 与代码源文件m2的特征相似度,得到相似度评分以及代码中的相似行。
在一种可能的实施方式中,对代码源文件的特征提取实际上是针对抽象语法树中各个节点进行特征提取,即代码源文件的特征向量为节点特征向量的集合。
请参考图5,其示出了本申请另一个示例性实施例提供的代码克隆检测方法的流程图。本实施例以该方法由具有代码编译能力的计算机设备执行为例进行说明。该方法包括如下步骤:
步骤501,获取代码源文件的语法信息以及语义信息,语法信息用于指示代码的语法结构,语义信息用于指示代码的含义。
步骤502,对语法信息以及语义信息进行信息融合,得到代码融合信息。
步骤501至步骤502的具体实施方式可以参考上述步骤101至步骤102,本申请实施例在此不再赘述。
步骤503,对融合抽象语法树中的语法节点进行特征提取,得到节点特征向量。
在一种可能的实施方式中,计算机设备对最终得到的融合抽象语法树中的非关键字节点(通常为抽象语法树中的叶子节点)进行特征提取,得到各个非关键字节点对应的节点特征向量。通过提取关键字节点自身的特征、非关键字节点与父节点的关系特征、非关键字节点所对应的父节点与其它非关键字节点对应的父节点之间的关系特征、相邻非关键字节点之间的关系特征等,实现对整个代码源文件的特征提取。
具体的,步骤503包括如下步骤503a:
步骤503a,基于节点特征、来源特征、兄弟特征、变量特征以及数据流特征中的至少一种对语法节点进行特征提取,得到节点特征向量。
其中,节点特征表征语法信息,来源特征表征语法节点所属的父节点以及对应的分支次序,兄弟特征表征相邻节点,变量特征表征非关键字节点中的变量在函数中的调用位置,数据流特征表征语法节点所在的控制流节点(即语句节点)对应的数据流指向关系与数据流被指向关系。
步骤504,确定融合抽象语法树中节点特征向量的并集,得到代码源文件的特征向量。
计算机设备基于上述五种特征表示一个非关键子节点,那么对于AST树的特征,则可以表示成该AST树的所有非关键字节点的特征的病机,即为F(m),其中m代表AST树。
步骤505,将各个代码源文件的特征向量输入相似度算法,得到相似度算法输出的相似度评分以及相似节点集合。
在一种可能的实施方式中,计算机设备通过相似度算法计算特征向量之间的相似度评分,作为代码源文件的相似度评分。该相似节点集合中包含相似的语法节点。示意性的,假设存在两个AST树m1和m2,计算机设备对两个特征向量的相似度计算过程如图6所示。
步骤506,基于语法节点与代码片段之间的映射关系,以及相似节点集合,确定代码源文件之间的相似代码片段。
如图6所示,R集合代表相似的非关键字节点的集合。计算机设备基于节点与代码片段之间的对应关系,基于相似节点反向确定出相似代码片段。
步骤507,通过结果展示界面对代码源文件中的相似代码片段进行高亮显示。
在一种可能的实施方式中,计算机设备通过代码克隆检测工具的结果展示界面展示克隆检测结果。该结果展示界面中展示有相似度评分,还展示有参与检测的源代码。计算机设备基于确定出的相似代码片段,在结果展示界面的源代码中对相似代码片段进行高亮显示。例如,对于两个代码源文件中相似的代码行使用同一种颜色添加底色,以便提示用户存在代码克隆现象的代码片段所在位置。
本申请实施例中,在得到融合抽象语法树后,从节点自身、节点来源、相邻节点、变量调用位置以及数据流指向五方面对各个非关键字节点进行特征提取,取并集得到整个代码源文件的特征向量,提高了特征提取效率以及特征的全面性,进而提高克隆检测结果的准确率。此外,对相似代码片段进行高亮显示,便于用户快速进行克隆代码确认。
图7是本申请一个示例性实施例提供的代码克隆检测装置的结构框图,该装置包括如下结构:
获取模块701,用于获取代码源文件的语法信息以及语义信息,所述语法信息用于指示代码的语法结构,所述语义信息用于指示代码的含义;
信息融合模块702,用于对所述语法信息以及所述语义信息进行信息融合,得到代码融合信息;
特征提取模块703,用于对所述代码融合信息进行特征提取,得到所述代码源文件的特征向量;
相似度评价模块704,用于基于各个代码源文件的所述特征向量进行特征对比,得到克隆检测结果,所述克隆检测结果用于指示所述代码源文件之间的相似度。
可选的,所述语法信息包括方法级抽象语法树,所述语义信息包括函数调用图、控制流图与数据流图;
所述信息融合模块702,还用于:
对所述方法级抽象语法树以及所述函数调用图进行信息融合,得到函数级抽象语法树;
对所述函数级抽象语法树、所述控制流图以及所述数据流图进行信息融合,得到所述代码融合信息。
可选的,所述信息融合模块702,还用于:
基于所述函数调用图对所述代码源文件中的函数进行归一化处理,得到目标函数,所述目标函数为与其它函数之间不存在调用关系的独立函数,或存在调用关系的至少两个函数的集合;
基于所述目标函数对各代码片段对应的所述方法级抽象语法树进行连接,得到所述函数级抽象语法树。
可选的,所述获取模块701,还用于:
获取所述函数级抽象语法树的节点中包含的初始变量名;
对所述初始变量名进行归一化处理,将所述初始变量名替换为目标变量名,所述目标变量名由变量类型名称以及计数数字i组成,所述变量类型名称用于表征变量所属的变量类型,所述计数数字用于表征属于所述变量类型的第i个变量, i为正整数。
可选的,所述信息融合模块702,还用于:
在所述控制流图的语句节点下插入对应的所述函数级抽象语法树;
基于所述数据流图,在所述控制流图的所述语句节点之间加入用于指示数据流向的边,得到所述代码融合信息。
可选的,所述代码融合信息为融合抽象语法树,所述融合抽象语法树中的节点包括语法节点以及控制流节点,且所述语法节点基于函数调用关系聚类,所述融合抽象语法树中的边用于指示控制流向或数据流向;
所述特征提取模块703,还用于:
对所述融合抽象语法树中的所述语法节点进行特征提取,得到节点特征向量;
确定所述融合抽象语法树中所述节点特征向量的并集,得到所述代码源文件的特征向量。
可选的,所述特征提取模块703,还用于:
基于节点特征、来源特征、兄弟特征、变量特征以及数据流特征中的至少一种对所述语法节点进行特征提取,得到所述节点特征向量;
其中,所述节点特征表征语法信息,所述来源特征表征所述语法节点所属的父节点以及对应的分支次序,所述兄弟特征表征相邻节点,所述变量特征表征非关键字节点中的变量在函数中的调用位置,所述数据流特征表征所述语法节点所在的所述控制流节点对应的数据流指向关系与数据流被指向关系。
可选的,所述相似度评价模块704,还用于:
将各个代码源文件的所述特征向量输入相似度算法,得到所述相似度算法输出的相似度评分以及相似节点集合,所述相似节点集合中包含相似的语法节点。
可选的,所述装置还包括结果展示模块,用于:
基于所述语法节点与代码片段之间的映射关系,以及所述相似节点集合,确定所述代码源文件之间的相似代码片段;
通过结果展示界面对所述代码源文件中的相似代码片段进行高亮显示。
综上所述,本申请实施例中,通过对代码源文件的语法信息和语义信息进行融合,得到代码源文件的融合特征,进而基于待检测的代码源文件的融合特征进行特征比对,得到相似度。充分考虑代码语法特征和语义特征进行克隆检测,既能够有效甄别微小的语法变化对相似度的影响,也能够有效识别出同质异构的代码片段,有助于提高各种类型的克隆代码的检测准确率。
请参考图8,其示出了本申请一个实施例提供的计算机设备的结构示意图。
所述计算机设备800包括中央处理单元(Central Processing Unit,CPU)801、包括随机存取存储器(Random Access Memory,RAM)802和只读存储器(Read Only Memory,ROM)803的系统存储器804,以及连接系统存储器804和中央处理单元801的系统总线805。所述计算机设备800还包括帮助计算机内的各个器件之间传输信息的基本输入/输出(Input/Output,I/O)控制器806,和用于存储操作系统813、应用程序814和其他程序模块815的大容量存储设备807。
所述基本输入/输出系统806包括有用于显示信息的显示器808和用于用户输入信息的诸如鼠标、键盘之类的输入设备809。其中所述显示器808和输入设备809都通过连接到系统总线805的输入输出控制器810连接到中央处理单元801。所述基本输入/输出系统806还可以包括输入输出控制器810以用于接收和处理来自键盘、鼠标、或电子触控笔等多个其他设备的输入。类似地,输入/输出控制器810还提供输出到显示屏、打印机或其他类型的输出设备。
所述大容量存储设备807通过连接到系统总线805的大容量存储控制器(未示出)连接到中央处理单元801。所述大容量存储设备807及其相关联的计算机可读介质为计算机设备800提供非易失性存储。也就是说,所述大容量存储设备807可以包括诸如硬盘或者只读光盘(Compact Disc Read-Only Memory, CD-ROM)驱动器之类的计算机可读介质(未示出)。
不失一般性,所述计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括RAM、ROM、可擦除可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)、闪存或其他固态存储其技术, CD-ROM、数字视频光盘(Digital Video Disc,DVD)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知所述计算机存储介质不局限于上述几种。上述的系统存储器804和大容量存储设备807可以统称为存储器。
根据本申请的各种实施例,所述计算机设备800还可以通过诸如因特网等网络连接到网络上的远程计算机运行。也即计算机设备800可以通过连接在所述系统总线805上的网络接口单元811连接到网络812,或者说,也可以使用网络接口单元811来连接到其他类型的网络或远程计算机系统(未示出)。
本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有至少一条指令,所述至少一条指令由处理器加载并执行以实现如上各个实施例所述的代码克隆检测方法。
根据本申请的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述方面的各种可选实现方式中提供的代码克隆检测方法。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本申请实施例所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读存储介质中或者作为计算机可读存储介质上的一个或多个指令或代码进行传输。计算机可读存储介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。
需要说明的是,本申请所涉及的信息(包括但不限于用户设备信息、用户个人信息等)、数据(包括但不限于用于分析的数据、存储的数据、展示的数据等)以及信号,均为经用户授权或者经过各方充分授权的,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。例如,本申请中涉及到的代码源文件都是在充分授权的情况下获取的。
以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (13)

1.一种代码克隆检测方法,其特征在于,所述方法包括:
获取代码源文件的语法信息以及语义信息,所述语法信息用于指示代码的语法结构,所述语义信息用于指示代码的含义;
对所述语法信息以及所述语义信息进行信息融合,得到代码融合信息;
对所述代码融合信息进行特征提取,得到所述代码源文件的特征向量;
基于各个代码源文件的所述特征向量进行特征对比,得到克隆检测结果,所述克隆检测结果用于指示所述代码源文件之间的相似度。
2.根据权利要求1所述的方法,其特征在于,所述语法信息包括方法级抽象语法树,所述语义信息包括函数调用图、控制流图与数据流图;
所述对所述语法信息以及所述语义信息进行信息融合,得到代码融合信息,包括:
对所述方法级抽象语法树以及所述函数调用图进行信息融合,得到函数级抽象语法树;
对所述函数级抽象语法树、所述控制流图以及所述数据流图进行信息融合,得到所述代码融合信息。
3.根据权利要求2所述的方法,其特征在于,所述对所述方法级抽象语法树以及所述函数调用图进行信息融合,得到函数级抽象语法树,包括:
基于所述函数调用图对所述代码源文件中的函数进行归一化处理,得到目标函数,所述目标函数为与其它函数之间不存在调用关系的独立函数,或存在调用关系的至少两个函数的集合;
基于所述目标函数对各代码片段对应的所述方法级抽象语法树进行连接,得到所述函数级抽象语法树。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
获取所述函数级抽象语法树的节点中包含的初始变量名;
对所述初始变量名进行归一化处理,将所述初始变量名替换为目标变量名,所述目标变量名由变量类型名称以及计数数字i组成,所述变量类型名称用于表征变量所属的变量类型,所述计数数字用于表征属于所述变量类型的第i个变量,i为正整数。
5.根据权利要求2所述的方法,其特征在于,所述对所述函数级抽象语法树、所述控制流图以及所述数据流图进行信息融合,得到所述代码融合信息,包括:
在所述控制流图的语句节点下插入对应的所述函数级抽象语法树;
基于所述数据流图,在所述控制流图的所述语句节点之间加入用于指示数据流向的边,得到所述代码融合信息。
6.根据权利要求2至5任一所述的方法,其特征在于,所述代码融合信息为融合抽象语法树,所述融合抽象语法树中的节点包括语法节点以及控制流节点,且所述语法节点基于函数调用关系聚类,所述融合抽象语法树中的边用于指示控制流向或数据流向;
所述对所述代码融合信息进行特征提取,得到所述代码源文件的特征向量,包括:
对所述融合抽象语法树中的所述语法节点进行特征提取,得到节点特征向量;
确定所述融合抽象语法树中所述节点特征向量的并集,得到所述代码源文件的特征向量。
7.根据权利要求6所述的方法,其特征在于,所述对所述融合抽象语法树中的所述语法节点进行特征提取,得到节点特征向量,包括:
基于节点特征、来源特征、兄弟特征、变量特征以及数据流特征中的至少一种对所述语法节点进行特征提取,得到所述节点特征向量;
其中,所述节点特征表征语法信息,所述来源特征表征所述语法节点所属的父节点以及对应的分支次序,所述兄弟特征表征相邻节点,所述变量特征表征非关键字节点中的变量在函数中的调用位置,所述数据流特征表征所述语法节点所在的所述控制流节点对应的数据流指向关系与数据流被指向关系。
8.根据权利要求6所述的方法,其特征在于,所述基于各个代码源文件的所述特征向量进行特征对比,得到克隆检测结果,包括:
将各个代码源文件的所述特征向量输入相似度算法,得到所述相似度算法输出的相似度评分以及相似节点集合,所述相似节点集合中包含相似的语法节点。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
基于所述语法节点与代码片段之间的映射关系,以及所述相似节点集合,确定所述代码源文件之间的相似代码片段;
通过结果展示界面对所述代码源文件中的相似代码片段进行高亮显示。
10.一种代码克隆检测装置,其特征在于,所述装置包括:
获取模块,用于获取代码源文件的语法信息以及语义信息,所述语法信息用于指示代码的语法结构,所述语义信息用于指示代码的含义;
信息融合模块,用于对所述语法信息以及所述语义信息进行信息融合,得到代码融合信息;
特征提取模块,用于对所述代码融合信息进行特征提取,得到所述代码源文件的特征向量;
相似度评价模块,用于基于各个代码源文件的所述特征向量进行特征对比,得到克隆检测结果,所述克隆检测结果用于指示所述代码源文件之间的相似度。
11.一种计算机设备,其特征在于,所述计算机设备包括处理器和存储器;所述存储器中存储有至少一段程序,所述至少一段程序由所述处理器加载并执行以实现如权利要求1至9任一所述的代码克隆检测方法。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有至少一条计算机程序,所述计算机程序由处理器加载并执行以实现如权利要求1至9任一所述的代码克隆检测方法。
13.一种计算机程序产品,其特征在于,所述计算机程序产品包括计算机指令,所述计算机指令存储在计算机可读存储介质中;计算机设备的处理器从所述计算机可读存储介质读取所述计算机指令,所述处理器执行所述计算机指令,使得所述计算机设备执行如权利要求1至9任一所述的代码克隆检测方法。
CN202210784064.XA 2022-06-28 2022-06-28 代码克隆检测方法、装置、设备、存储介质及程序产品 Pending CN115309451A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210784064.XA CN115309451A (zh) 2022-06-28 2022-06-28 代码克隆检测方法、装置、设备、存储介质及程序产品

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210784064.XA CN115309451A (zh) 2022-06-28 2022-06-28 代码克隆检测方法、装置、设备、存储介质及程序产品

Publications (1)

Publication Number Publication Date
CN115309451A true CN115309451A (zh) 2022-11-08

Family

ID=83857290

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210784064.XA Pending CN115309451A (zh) 2022-06-28 2022-06-28 代码克隆检测方法、装置、设备、存储介质及程序产品

Country Status (1)

Country Link
CN (1) CN115309451A (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115906086A (zh) * 2023-02-23 2023-04-04 中国人民解放军国防科技大学 基于代码属性图的网页后门检测方法、系统及存储介质
CN116302074A (zh) * 2023-05-12 2023-06-23 卓望数码技术(深圳)有限公司 第三方组件识别方法、装置、设备及存储介质
CN116302089A (zh) * 2023-05-23 2023-06-23 华中科技大学 基于图片相似度的代码克隆检测方法、系统及存储介质
CN116340185A (zh) * 2023-05-19 2023-06-27 国网数字科技控股有限公司 一种软件开源代码成分分析方法、装置及设备
CN116414445A (zh) * 2023-06-07 2023-07-11 深圳海云安网络安全技术有限公司 一种基于源代码水印的同源性检测方法及系统

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115906086A (zh) * 2023-02-23 2023-04-04 中国人民解放军国防科技大学 基于代码属性图的网页后门检测方法、系统及存储介质
CN116302074A (zh) * 2023-05-12 2023-06-23 卓望数码技术(深圳)有限公司 第三方组件识别方法、装置、设备及存储介质
CN116340185A (zh) * 2023-05-19 2023-06-27 国网数字科技控股有限公司 一种软件开源代码成分分析方法、装置及设备
CN116340185B (zh) * 2023-05-19 2023-09-01 国网数字科技控股有限公司 一种软件开源代码成分分析方法、装置及设备
CN116302089A (zh) * 2023-05-23 2023-06-23 华中科技大学 基于图片相似度的代码克隆检测方法、系统及存储介质
CN116302089B (zh) * 2023-05-23 2023-08-18 华中科技大学 基于图片相似度的代码克隆检测方法、系统及存储介质
CN116414445A (zh) * 2023-06-07 2023-07-11 深圳海云安网络安全技术有限公司 一种基于源代码水印的同源性检测方法及系统
CN116414445B (zh) * 2023-06-07 2023-08-29 深圳海云安网络安全技术有限公司 一种基于源代码水印的同源性检测方法及系统

Similar Documents

Publication Publication Date Title
US11442702B2 (en) Code completion
CN108985073B (zh) 一种高度自动化的智能合约形式化验证系统及方法
CN108446540B (zh) 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
CN115309451A (zh) 代码克隆检测方法、装置、设备、存储介质及程序产品
Ambriola et al. Processing natural language requirements
RU2605077C2 (ru) Способ и система для хранения и поиска информации, извлекаемой из текстовых документов
Roy et al. Scenario-based comparison of clone detection techniques
CN107203468B (zh) 一种基于ast的软件版本演化对比分析方法
US20140156282A1 (en) Method and system for controlling target applications based upon a natural language command string
US20160275058A1 (en) Method and system of text synthesis based on extracted information in the form of an rdf graph making use of templates
US20170286103A1 (en) Identifying and correlating semantic bias for code evaluation
EP4364044A1 (en) Automated troubleshooter
CN113609838A (zh) 文档信息抽取及图谱化方法和系统
Abbas et al. A review of nlidb with deep learning: findings, challenges and open issues
CN102298552A (zh) 基于代码查询进行源代码插桩的方法
Nan et al. Hisyn: human learning-inspired natural language programming
CN113778852A (zh) 一种基于正则表达式的代码分析方法
Liu et al. Adaptivepaste: Code adaptation through learning semantics-aware variable usage representations
Koskimies et al. The design of a language processor generator
CN115391785A (zh) 一种软件漏洞的风险检测方法、装置以及设备
CN110727428B (zh) 一种转换业务逻辑层代码的方法、装置和电子设备
Tukaram Design and development of software tool for code clone search, detection, and analysis
Nan et al. Enabling near real-time nlu-driven natural language programming through dynamic grammar graph-based translation
Butler Analysing Java Identifier Names
Yang et al. A function level Java code clone detection method

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