CN115729797A - 代码相似函数检测方法、装置、电子设备及存储介质 - Google Patents
代码相似函数检测方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN115729797A CN115729797A CN202110983815.6A CN202110983815A CN115729797A CN 115729797 A CN115729797 A CN 115729797A CN 202110983815 A CN202110983815 A CN 202110983815A CN 115729797 A CN115729797 A CN 115729797A
- Authority
- CN
- China
- Prior art keywords
- subtrees
- node
- nodes
- similar
- subtree
- 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
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开实施例提供一种代码相似函数检测方法、装置、电子设备及存储介质,该方法通过解析待检测代码,得到抽象语法树;通过遍历抽象语法树,得到抽象语法树中至少两个子树,子树用于表征待检测代码中的函数体;根据各子树的节点,确定至少两个相似子树,并将至少两个相似子树对应的函数体,确定为相似函数,其中,各相似子树的对应节点的类型相同,由于将待检测代码转换为了抽象语法树,并基于对抽象语法树的静态分析,确定了节点的类型相同的相似子树,从而保证相似子树对应的函数体所实现的功能相同,进而根据相似子树所对应的函数体确定对应的相似函数,实现了对功能相同的相似函数的检测,提高了代码重复度检测的精确性。
Description
技术领域
本公开实施例涉及计算机技术领域,尤其涉及一种代码相似函数检测方法、装置、电子设备及存储介质。
背景技术
目前,在前端项目质量检测过程中,代码的重复度是一项很重要的指标,随着项目的不断开发迭代和功能累加,重复代码会逐渐出现,而过高的代码重复度,会导致项目的稳定性降低,提高项目维护成本。
现有技术中,对代码的重复度检测,通常是通过开源的代码检测功能库,对代码进行完全克隆检测,但这种方案只能检测出代码中完全一致的函数,而无法对功能相同,但参数、函数名不同的相似函数进行检测,导致代码的重复率检测准确性低的问题。
发明内容
本公开实施例提供一种代码相似函数检测方法、装置、电子设备及存储介质,以克服无法对相似函数进行检测的问题。
第一方面,本公开实施例提供一种代码相似函数检测方法,包括:
解析待检测代码,得到抽象语法树;通过遍历所述抽象语法树,得到所述抽象语法树中至少两个子树,所述子树用于表征所述待检测代码中的函数体;根据各所述子树的节点,确定至少两个相似子树,并将所述至少两个相似子树对应的函数体,确定为相似函数,其中,各所述相似子树的对应节点的类型相同。
第二方面,本公开实施例提供一种代码相似函数检测装置,包括:
解析模块,用于解析待检测代码,得到抽象语法树;
遍历模块,用于通过遍历所述抽象语法树,得到所述抽象语法树中至少两个子树,所述子树用于表征所述待检测代码中的函数体;
确定模块,用于根据各所述子树的节点,确定至少两个相似子树,并将所述至少两个相似子树对应的函数体,确定为相似函数,其中,各所述相似子树的对应节点的类型相同。
第三方面,本公开实施例提供一种电子设备,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如上第一方面以及第一方面各种可能的设计所述的代码相似函数检测方法。
第四方面,本公开实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的设计所述的代码相似函数检测方法。
第五方面,本公开实施例提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现如上第一方面以及第一方面各种可能的设计所述的代码相似函数检测方法。
本实施例提供的代码相似函数检测方法、装置、电子设备及存储介质,该方法通过解析待检测代码,得到抽象语法树;通过遍历所述抽象语法树,得到所述抽象语法树中至少两个子树,所述子树用于表征所述待检测代码中的函数体;根据各所述子树的节点,确定至少两个相似子树,并将所述至少两个相似子树对应的函数体,确定为相似函数,其中,各所述相似子树的对应节点的类型相同,由于将待检测代码转换为了抽象语法树,并基于对抽象语法树的静态分析,确定了节点的类型相同的相似子树,从而保证相似子树对应的函数体所实现的功能相同,进而根据相似子树所对应的函数体确定对应的相似函数,实现了对功能相同的相似函数的检测,提高了代码重复度检测的精确性。
附图说明
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本公开实施例提供的代码相似函数检测方法的一种应用场景图;
图2为本公开实施例提供的一种待检测代码的示意图;
图3为本公开实施例提供的代码相似函数检测方法的流程示意图一;
图4为图3所示实施例中步骤S102的一种实现步骤的流程图;
图5为本公开实施例提供的一种子树与函数体的对应关系示意图;
图6为本公开实施例提供的代码相似函数检测方法的流程示意图二;
图7为本公开实施例提供的代码相似函数检测装置的结构框图;
图8为本公开实施例提供的一种电子设备的结构示意图;
图9为本公开实施例提供的电子设备的硬件结构示意图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
下面对本公开实施例的应用场景进行解释:
图1为本公开实施例提供的代码相似函数检测方法的一种应用场景图,本公开实施例提供的代码相似函数检测方法,可以应用于***测试、代码重复度检测等软件开发过程的场景下,本公开实施例提供的代码相似函数检测方法的执行主体可以为服务器,服务器与终端设备通信,并向终端设备提供代码检测的服务,具体地,如图1所示,服务器接收终端设备上传的待检测代码,并基于本方法对待检测代码进行检测,确定其中的相似函数对应的代码行,并将相似函数对应的代码行返回给终端设备进行显示,从而使终端设备一侧的开发者用户能够得知待测代码中的相似函数的位置。
图2为本公开实施例提供的一种待检测代码的示意图,现有技术中,通过一些代码检测的功能库,例如jscpd,可以实现对待检测代码的完全克隆检测,即可以检测出待检测代码中两个完全一致的函数。但如图2中所示的函数1(fn1(rules1:string))和函数2(fn2(rules2:number)),虽然函数1和函数2内部的处理过程和实现的功能相同(执行X_function()函数),但由于二者的函数名(fn1和fn2)和输入参数不同(rules1:string和rules2:number),现有技术中的检测手段,会将函数1和函数2检测为两个不同的函数,从而不纳入重复代码部分,从而造成重复代码的漏检,影响重复度的检测准确性。导致上述问题的原因,是由于现有技术中只能对完全一致的相同函数进行检测,而无法对功能相同的相似函数进行检测。为了解决上述问题,本公开实施例所提供的代码相似函数检测方法,基于对待检测代码的静态分析,提供了一种确定相似函数的方法,从而解决上述无法确定相似函数导致的重复度检测准确性低的问题。
参考图3,图3为本公开实施例提供的代码相似函数检测方法的流程示意图一。本实施例的方法可以应用在服务器或者终端设备中,本实施例以服务器为执行主体进行说明,该代码相似函数检测方法包括:
步骤S101,解析待检测代码,得到抽象语法树。
示例性地,待检测代码可以通过加载存储在服务器内的代码文件而得到,更具体地,代码文件例如为ts格式、tsx格式、js格式的文件。待检测代码中可以包括一个或多个函数体,其中,函数体是编程语言中定义一个函数功能的所有代码组成的整体。
利用编辑器对待检测代码进行编译,可以将待检测代码转换为对应的抽象语法树(Abstract Syntax Tree,AST),抽象语法树是源代码语法结构的一种抽象表示方法,能够表示源代码的语法结构,抽象语法树中包括多个节点(Node),每个节点代表源代码的一种结构,通过对源代码中每一行代码进行词法分析、语法分析以及编译等步骤,可以实现抽象语法树的生成,该过程为本领域技术人员知晓的现有技术,此处不再赘述。具体地,对于待检测代码对应的抽象语法树,是通过对待检测代码中的每一行代码进行转换后得到的。示例性地,该过程可以通过Babel编译器实现,例如,通过加载预设的Babel编辑器,并通过Babel编辑器以及预设的解析关键字,对待检测代码进行解析,得到对应的抽象语法树。其中,Babel是一个工具链,主要用于将采用ECMAScript 2015+语法编写的代码转换为向后兼容的JavaScript语法,以便能够运行在当前和旧版本的浏览器或其他环境中。Babel编译器的具体使用方法为现有技术,此处不再对该过程进行赘述。
步骤S102,通过遍历抽象语法树,得到抽象语法树中至少两个子树,子树用于表征待检测代码中的函数体。
在得到待检测代码对应的抽象语法树后,对抽象语法树进行遍历,可以得到抽象语法树中所包括的所有节点。在本公开的一个实施例中,如图4所示,步骤S102包括步骤S1021、S1022两个具体的实现步骤:
步骤S1021,基于预设算法,对抽象语法树进行遍历,获得至少两个节点。
步骤S1022,根据各节点的节点信息,确定至少两个子树。
示例性地,预设算法例如为深度优先搜索(DFS)前序遍历算法,通过预设算法对对抽象语法树进行遍历后,得到抽象语法树中的节点,
其中,示例性地,节点信息中包括节点类型,根据各节点的节点信息,确定至少两个子树的实现方式包括:根据各节点的节点信息,确定各节点的节点类型(type);根据各节点的节点类型,确定至少两个子树。其中,示例性地,每一节点的节点信息,是节点对应的描述信息。节点信息中包括节点标识(Id)、节点类型等内容。其中,节点标识为对象名,例如函数名、变量名。节点类型用于表征该节点所对应的代码块的类型,例如,节点类型为“FunctionDeclaration”,即指该节点对应的代码块,为一个函数声明;再例如,节点类型为“VariableDeclarator”,即指该节点对应的代码块,为一个赋值声明。因此,根据节点类型,将表征函数声明的代码块对应的抽象语法树中的部分结构体,确定为一个子树。进而,通过遍历抽象语法树,可得到至少两个子树(即抽象语法树所对应的待检测代码中至少包含两个函数体)。其中,示例性地,抽象语法树中的部分结构体通过特定符号分割,例如“{}”,在遍历到某个节点的节点类型对应函数声明时,即可基于特定符号,将该节点所在的抽象语法树中的部分结构体,确定为一个子树。同时,通过对抽象语法树的遍历,还可以获得该子树中的其他节点。
步骤S103,根据各子树的节点,确定至少两个相似子树,并将至少两个相似子树对应的函数体,确定为相似函数,其中,各相似子树的对应节点的类型相同。
示例性地,在确定至少两个子树后,每一子树对应有一个或多个节点,当两个子树所对应的函数所实现的功能相同时,则该两个子树中的各相对应的节点的节点类型也应该是相同的。图5为本公开实施例提供的一种子树与函数体的对应关系示意图,如图5所示,对包含fn1函数和fn2函数的待检测代码进行解析,获得与fn1的函数体对应的子树1和与fn2的函数体对应的子树2。子树1和子树2中分别包括多个节点。当函数fn1与函数fn2所实现的功能相同时,子树1中各节点与子树2中的各节点一一对应,且各对应节点的节点类型都相同,例如,节点A1与节点B1的节点类型相同、节点A2与节点B2的节点类型相同、节点A3与节点B3的节点类型相同等,此处不再一一举例。通过对比子树中各节点的节点类型,即可实现子树所对应的函数体之间的对比,从而能够判断两个以上函数是否为实现相同功能的相似函数。其中,图5中的rules1为fn1的参数名、rules2为fn2的参数名,X_function为函数fn1和函数fn2内执行的函数名,图5所示代码中的其他功能性语句,为本领域技术人员知晓的常用编程语句,此处不再一一介绍。
在本实施例中,通过解析待检测代码,得到抽象语法树;通过遍历抽象语法树,得到抽象语法树中至少两个子树,子树用于表征待检测代码中的函数体;根据各子树的节点,确定至少两个相似子树,并将至少两个相似子树对应的函数体,确定为相似函数,其中,各相似子树的对应节点的类型相同,由于将待检测代码转换为了抽象语法树,并基于对抽象语法树的静态分析,确定了节点的类型相同的相似子树,从而保证相似子树对应的函数体所实现的功能相同,进而根据相似子树所对应的函数体确定对应的相似函数,实现了对功能相同的相似函数的检测,提高了代码重复度检测的精确性。
参考图6,图6为本公开实施例提供的代码相似函数检测方法的流程示意图二。本实施例在图3所示实施例的基础上,对步骤S102-S103进一步细化,该代码相似函数检测方法包括:
S201:解析待检测代码,得到抽象语法树。
S202:将抽象语法树中的各节点存储至第一字典数据,其中,第一字典数据的键表征存储地址,第一字典数据的值用于表征抽象语法树中的各节点的集合。
示例性地,对抽象语法树通过DFS前序遍历后,将得到的所有节点,保存在第一字典数据,示例性地,第一字典数据可以为一个map。这个map中的对象包括键(key)和对应的值(value)。其中,key值为待检测代码的存储地址,更具体地,例如为文件路径。value中存储所有节点的节点信息,实现对所有节点的存储。通过将抽象语法树中的所有节点存储在第一字典数据中,在后续步骤中,基于第一字典数据对确定的相似子树进行还原,从而确定相似函数在代码中的位置。
S203:获取各子树的至少两个节点的节点类型。
S204:根据各子树的至少两个节点的节点类型,确定子树类型。
S205:将子树类型相同的子树,确定为相似子树。
在本公开的一个实施例中,根据各子树的至少两个节点的节点类型,确定子树类型的实现方式包括:对各子树中的至少两个节点的节点类型进行哈希计算,生成与各子树分别对应的类型哈希值;根据各子树对应的类型哈希值,确定子树类型。
更具体地,例如,通过遍历抽象语法树,获取各子树中的节点,再将每一子树中各节点对应的节点类型的集合,进行哈希计算,得到子树对应的类型哈希值。例如,待检测代码对应的抽象语法树中包括A子树和B子树,A子树包括a1、a2、a3节点;B子树包括b1、b2、b3节点。对A子树中a1、a2、a3节点的节点类型的集合进行哈希计算,得到A子树的类型哈希值;对B子树中b1、b2、b3节点的节点类型的集合进行哈希计算,得到B子树的类型哈希值;若B子树的类型哈希值与B子树的类型哈希值一致,则认为A子树和B子树的每一对应节点的节点类型均相同,即A子树中的a1、a2、a3节点分别对应与B子树中的b1、b2、b3节点的节点类型相同,则将A子树和B子树确定为相似子树。
在一种可能的实现方式中,获取各子树中预设长度的节点,生成目标节点,其中,示例性地,预设长度的节点,是指子树中预设数量节点的节点,或者预设行数的节点的节点信息;例如,子树A中包括10个节点,获取预设长度的节点,即为获取子树A中前5个节点,生成目标节点,进行后续的哈希计算。在对各子树中的至少两个节点的节点类型进行哈希计算,生成与各子树分别对应的类型哈希值时,通过目标节点对应的节点类型进行哈希计算,可以提高计算效率,节约计算资源。
S206:将相似子树存储至第二字典数据,其中,第二字典数据的键表征相似子树的子树类型,第二字典数据的值用于表征相似子树的节点的集合。
示例性地,在确定相似子树后,将固定长度的相似子树存储至第二字典数据,第二字典数据也为一个map,map中的对象中,key值为以相似子树中所有节点的节点类型生成的一个唯一哈希值,表征子树类型;value中为所有具有相同子树类型的节点组,即相似子树的节点的集合。
S207:根据第一字典数据的值和第二字典数据的值,确定相似子树对应的各节点的节点位置。
示例性地,第二字典数据的value中,记录了所有具有相同子树类型的节点组,而第一字典数据的value中,存储所有节点的节点信息。根据第一数据字典中的值,查找与具有相同子树类型的节点组中的各节点对应的节点,进而确定相似子树的节点在代码中的位置,即确定相似子树对应的各节点的节点位置。
示例性地,第二字典数据中,key1为abcd1,表示相似子树的子树类型(即对应一种函数);对应的value1包括多三个节点组,即节点组a、节点组b、节点组c,每一个节点组分别对应一个子树,节点组a、节点组b、节点组c各自对应的三个子树为相似子树。根据第一字典数据中包括了所有节点的位置信息,通过第一字典数据,分别对节点组a、节点组b、节点组c中各节点的进行定位,进而确定相似子树对应的各节点的节点位置。
在本公开的一个实施例中,在确定节点位置之前,可以先通过稳定排序算法对第二字段数据中的相似子树对应的节点组进行排序,将节点多的相似子树放在前面优先处理,便于后续相似函数的去重。
S208:根据节点位置,对相似子树对应的各节点进行还原,生成相似函数。
进一步地,根据相似子树的节点位置,对相似子树进行还原,可以确定相似子树所对应的相似函数。其中,相似子树与相似函数一一对应,例如,如相似子树包括三个子树,则相似函数也对应包括三个函数。对抽象语法树中的子树进行还原,生成对应的函数代码段的实现方法,为本领域技术人员知晓的现有技术,此处不再赘述。
其中,示例性地,相似函数的实现方式,可以是具体的代码字符,也可以是待检测代码中的代码行标识。可选地,在确定相似函数后,还可以将相似函数发送给终端设备一侧,进行显示,以使开发者用户能够得知相似函数在待检测代码中的位置,进而进行代码的优化,提高代码质量。
本实施例中,步骤S201的实现方式与本公开图3所示实施例中的步骤S101的实现方式相同,在此不再一一赘述。
对应于上文实施例的代码相似函数检测方法,图7为本公开实施例提供的代码相似函数检测装置的结构框图。为了便于说明,仅示出了与本公开实施例相关的部分。参照图7,代码相似函数检测装置3,包括:
解析模块31,用于解析待检测代码,得到抽象语法树;
遍历模块32,用于通过遍历抽象语法树,得到抽象语法树中至少两个子树,子树用于表征待检测代码中的函数体;
确定模块33,用于根据各子树的节点,确定至少两个相似子树,并将至少两个相似子树对应的函数体,确定为相似函数,其中,各相似子树的对应节点的类型相同。
在本公开的一个实施例中,遍历模块32,具体用于:基于预设算法,对抽象语法树进行遍历,获得至少两个节点;根据各节点的节点信息,确定至少两个子树。
在本公开的一个实施例中,遍历模块32在根据各节点的节点信息,确定至少两个子树时,具体用于:根据各节点的节点信息,确定各节点的节点类型;各节点的节点类型,确定至少两个子树。
在本公开的一个实施例中,预设算法包括深度优先遍历算法,遍历模块32在基于预设算法,对抽象语法树进行遍历,获得至少两个节点时,具体用于:基于深度优先遍历算法,对抽象语法树进行前序遍历,获得至少两个节点。
在本公开的一个实施例中,确定模块33,具体用于:获取各子树的至少两个节点的节点类型;根据各子树的至少两个节点的节点类型,确定子树类型;将子树类型相同的子树,确定为相似子树。
在本公开的一个实施例中,确定模块33在根据各子树的至少两个节点的节点类型,确定子树类型时,具体用于:对各子树中的至少两个节点的节点类型进行哈希计算,生成与各子树分别对应的类型哈希值;根据各子树对应的类型哈希值,确定子树类型。
在本公开的一个实施例中,确定模块33,还用于:获取各子树中预设长度的节点,生成目标节点;确定模块33在对各子树中的至少两个节点的节点类型进行哈希计算,生成与各子树分别对应的类型哈希值时,具体用于:对各子树中的目标节点的节点类型进行哈希计算,生成与各子树分别对应的类型哈希值。
在本公开的一个实施例中,确定模块33,还用于:将抽象语法树中的各节点存储至第一字典数据,其中,第一字典数据的键表征存储地址,第一字典数据的值用于表征抽象语法树中的各节点的集合;将相似子树存储至第二字典数据,其中,第二字典数据的键表征相似子树的子树类型,第二字典数据的值用于表征相似子树的节点的集合;
确定模块33在将至少两个相似子树对应的函数体,确定为相似函数时,具体用于:根据第一字典数据的值和第二字典数据的值,确定相似子树对应的各节点的节点位置;根据节点位置,对相似子树对应的各节点进行还原,生成相似函数。
在本公开的一个实施例中,解析模块,具体用于:加载预设的Babel编辑器;通过Babel编辑器以及预设的解析关键字,对待检测代码进行解析,得到对应的抽象语法树。
其中,解析模块31、遍历模块32和确定模块33依次连接。本实施例提供的代码相似函数检测装置3可以执行上述方法实施例的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。
图8为本公开实施例提供的一种电子设备的结构示意图,如图8所示,该电子设备4包括至少一个处理器41和存储器42;
存储器42存储计算机执行指令;
至少一个处理器41执行存储器42存储的计算机执行指令,使得至少一个处理器41执行如图3-图6所示实施例中的代码相似函数检测方法。
其中,处理器41和存储器42通过总线43连接。
相关说明可以对应参见图3-图6所对应的实施例中的步骤所对应的相关描述和效果进行理解,此处不做过多赘述。
参考图9,其示出了适于用来实现本公开实施例的电子设备900的结构示意图,该电子设备900可以为终端设备或服务器。其中,终端设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、个人数字助理(Personal Digital Assistant,简称PDA)、平板电脑(Portable Android Device,简称PAD)、便携式多媒体播放器(Portable MediaPlayer,简称PMP)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图9示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图9所示,电子设备900可以包括处理装置(例如中央处理器、图形处理器等)901,其可以根据存储在只读存储器(Read Only Memory,简称ROM)902中的程序或者从存储装置908加载到随机访问存储器(Random Access Memory,简称RAM)903中的程序而执行各种适当的动作和处理。在RAM 903中,还存储有电子设备900操作所需的各种程序和数据。处理装置901、ROM 902以及RAM 903通过总线904彼此相连。输入/输出(I/O)接口905也连接至总线904。
通常,以下装置可以连接至I/O接口905:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置906;包括例如液晶显示器(Liquid CrystalDisplay,简称LCD)、扬声器、振动器等的输出装置907;包括例如磁带、硬盘等的存储装置908;以及通信装置909。通信装置909可以允许电子设备900与其他设备进行无线或有线通信以交换数据。虽然图9示出了具有各种装置的电子设备900,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置909从网络上被下载和安装,或者从存储装置908被安装,或者从ROM902被安装。在该计算机程序被处理装置901执行时,执行本公开实施例的方法中限定的上述功能。
需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的***、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行***、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行***、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。
上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备执行上述实施例所示的方法。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LocalArea Network,简称LAN)或广域网(Wide Area Network,简称WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的***、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,单元的名称在某种情况下并不构成对该单元本身的限定,例如,第一获取单元还可以被描述为“获取至少两个网际协议地址的单元”。
本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上***(SOC)、复杂可编程逻辑设备(CPLD)等等。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行***、装置或设备使用或与指令执行***、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体***、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
第一方面,根据本公开的一个或多个实施例,提供了一种代码相似函数检测方法,包括:
解析待检测代码,得到抽象语法树;通过遍历所述抽象语法树,得到所述抽象语法树中至少两个子树,所述子树用于表征所述待检测代码中的函数体;根据各所述子树的节点,确定至少两个相似子树,并将所述至少两个相似子树对应的函数体,确定为相似函数,其中,各所述相似子树的对应节点的类型相同。
根据本公开的一个或多个实施例,通过遍历所述抽象语法树,得到所述抽象语法树中至少两个子树,包括:基于预设算法,对所述抽象语法树进行遍历,获得至少两个节点;根据各所述节点的节点信息,确定至少两个子树。
根据本公开的一个或多个实施例,根据各所述节点的节点信息,确定至少两个子树,包括:根据各所述节点的节点信息,确定各所述节点的节点类型;根据各所述节点的节点类型,确定至少两个子树。
根据本公开的一个或多个实施例,所述预设算法包括深度优先遍历算法,基于预设算法,对所述抽象语法树进行遍历,获得至少两个节点,包括:基于深度优先遍历算法,对所述抽象语法树进行前序遍历,获得至少两个节点。
根据本公开的一个或多个实施例,根据各所述子树的节点,确定至少两个相似子树,包括:获取各所述子树的至少两个节点的节点类型;根据各所述子树的至少两个节点的节点类型,确定子树类型;将所述子树类型相同的子树,确定为相似子树。
根据本公开的一个或多个实施例,根据各所述子树的至少两个节点的节点类型,确定子树类型,包括:对各所述子树中的至少两个节点的节点类型进行哈希计算,生成与各所述子树分别对应的类型哈希值;根据各所述子树对应的类型哈希值,确定子树类型。
根据本公开的一个或多个实施例,所述方法还包括:获取各所述子树中预设长度的节点,生成目标节点;对各所述子树中的至少两个节点的节点类型进行哈希计算,生成与各所述子树分别对应的类型哈希值,包括:对各所述子树中的目标节点的节点类型进行哈希计算,生成与各所述子树分别对应的类型哈希值。
根据本公开的一个或多个实施例,所述方法还包括:将所述抽象语法树中的各节点存储至第一字典数据,其中,所述第一字典数据的键表征存储地址,所述第一字典数据的值用于表征所述抽象语法树中的各节点的集合;将所述相似子树存储至第二字典数据,其中,所述第二字典数据的键表征所述相似子树的子树类型,所述第二字典数据的值用于表征所述相似子树的节点的集合;将所述至少两个相似子树对应的函数体,确定为相似函数,包括:根据所述第一字典数据和所述第二字典数据,确定所述相似子树对应的各节点的节点位置;根据所述节点位置,对所述相似子树对应的各节点进行还原,生成所述相似函数。
根据本公开的一个或多个实施例,解析待检测代码,得到抽象语法树,包括:加载预设的Babel编辑器;通过所述Babel编辑器以及预设的解析关键字,对待检测代码进行解析,得到对应的抽象语法树。
第二方面,根据本公开的一个或多个实施例,提供了一种代码相似函数检测装置,包括:
解析模块,用于解析待检测代码,得到抽象语法树;
遍历模块,用于通过遍历所述抽象语法树,得到所述抽象语法树中至少两个子树,所述子树用于表征所述待检测代码中的函数体;
确定模块,用于根据各所述子树的节点,确定至少两个相似子树,并将所述至少两个相似子树对应的函数体,确定为相似函数,其中,各所述相似子树的对应节点的类型相同。
根据本公开的一个或多个实施例,遍历模块,具体用于:基于预设算法,对所述抽象语法树进行遍历,获得至少两个节点;根据各所述节点的节点信息,确定至少两个子树。
根据本公开的一个或多个实施例,遍历模块在根据各所述节点的节点信息,确定至少两个子树时,具体用于:根据各所述节点的节点信息,确定各所述节点的节点类型;根据各所述节点的节点类型,确定至少两个子树。
根据本公开的一个或多个实施例,所述预设算法包括深度优先遍历算法,遍历模块在基于预设算法,对所述抽象语法树进行遍历,获得至少两个节点时,具体用于:基于深度优先遍历算法,对所述抽象语法树进行前序遍历,获得至少两个节点。
根据本公开的一个或多个实施例,所述确定模块,具体用于:获取各所述子树的至少两个节点的节点类型;根据各所述子树的至少两个节点的节点类型,确定子树类型;将所述子树类型相同的子树,确定为相似子树。
根据本公开的一个或多个实施例,所述确定模块在根据各所述子树的至少两个节点的节点类型,确定子树类型时,具体用于:对各所述子树中的至少两个节点的节点类型进行哈希计算,生成与各所述子树分别对应的类型哈希值;根据各所述子树对应的类型哈希值,确定子树类型。
根据本公开的一个或多个实施例,所述确定模块,还用于:获取各所述子树中预设长度的节点,生成目标节点;所述确定模块在对各所述子树中的至少两个节点的节点类型进行哈希计算,生成与各所述子树分别对应的类型哈希值时,具体用于:对各所述子树中的目标节点的节点类型进行哈希计算,生成与各所述子树分别对应的类型哈希值。
根据本公开的一个或多个实施例,所述确定模块,还用于:将所述抽象语法树中的各节点存储至第一字典数据,其中,所述第一字典数据的键表征存储地址,所述第一字典数据的值用于表征所述抽象语法树中的各节点的集合;将所述相似子树存储至第二字典数据,其中,所述第二字典数据的键表征所述相似子树的子树类型,所述第二字典数据的值用于表征所述相似子树的节点的集合;
根据本公开的一个或多个实施例,在将所述至少两个相似子树对应的函数体,确定为相似函数时,具体用于:根据所述第一字典数据和所述第二字典数据,确定所述相似子树对应的各节点的节点位置;根据所述节点位置,对所述相似子树对应的各节点进行还原,生成所述相似函数。
根据本公开的一个或多个实施例,所述解析模块,具体用于:加载预设的Babel编辑器;通过所述Babel编辑器以及预设的解析关键字,对待检测代码进行解析,得到对应的抽象语法树。
第三方面,根据本公开的一个或多个实施例,提供了一种电子设备,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如上第一方面以及第一方面各种可能的设计所述的代码相似函数检测方法。
第四方面,根据本公开的一个或多个实施例,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的设计所述的代码相似函数检测方法。
第五方面,本公开实施例提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现如上第一方面以及第一方面各种可能的设计所述的代码相似函数检测方法。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
此外,虽然采用特定次序描绘了各操作,但是这不应当理解为要求这些操作以所示出的特定次序或以顺序次序执行来执行。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实施例中。相反地,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实施例中。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。
Claims (13)
1.一种代码相似函数检测方法,其特征在于,所述方法包括:
解析待检测代码,得到抽象语法树;
通过遍历所述抽象语法树,得到所述抽象语法树中至少两个子树,所述子树用于表征所述待检测代码中的函数体;
根据各所述子树的节点,确定至少两个相似子树,并将所述至少两个相似子树对应的函数体,确定为相似函数,其中,各所述相似子树的对应节点的类型相同。
2.根据权利要求1所述的方法,其特征在于,通过遍历所述抽象语法树,得到所述抽象语法树中至少两个子树,包括:
基于预设算法,对所述抽象语法树进行遍历,获得至少两个节点;
根据各所述节点的节点信息,确定至少两个子树。
3.根据权利要求2所述的方法,其特征在于,所述节点信息中包括节点类型;根据各所述节点的节点信息,确定至少两个子树,包括:
根据各所述节点的节点信息,确定各所述节点的节点类型;
根据各所述节点的节点类型,确定至少两个子树。
4.根据权利要求2所述的方法,其特征在于,所述预设算法包括深度优先遍历算法,基于预设算法,对所述抽象语法树进行遍历,获得至少两个节点,包括:
基于深度优先遍历算法,对所述抽象语法树进行前序遍历,获得至少两个节点。
5.根据权利要求1所述的方法,其特征在于,根据各所述子树的节点,确定至少两个相似子树,包括:
获取各所述子树的至少两个节点的节点类型;
根据各所述子树的至少两个节点的节点类型,确定子树类型;
将所述子树类型相同的子树,确定为相似子树。
6.根据权利要求5所述的方法,其特征在于,根据各所述子树的至少两个节点的节点类型,确定子树类型,包括:
对各所述子树中的至少两个节点的节点类型进行哈希计算,生成与各所述子树分别对应的类型哈希值;
根据各所述子树对应的类型哈希值,确定子树类型。
7.根据权利要求5所述的方法,其特征在于,所述方法还包括:
获取各所述子树中预设长度的节点,生成目标节点;
对各所述子树中的至少两个节点的节点类型进行哈希计算,生成与各所述子树分别对应的类型哈希值,包括:
对各所述子树中的目标节点的节点类型进行哈希计算,生成与各所述子树分别对应的类型哈希值。
8.根据权利要求5所述的方法,其特征在于,所述方法还包括:
将所述抽象语法树中的各节点存储至第一字典数据,其中,所述第一字典数据的键表征存储地址,所述第一字典数据的值用于表征所述抽象语法树中的各节点的集合;
将所述相似子树存储至第二字典数据,其中,所述第二字典数据的键表征所述相似子树的子树类型,所述第二字典数据的值用于表征所述相似子树的节点的集合;
将所述至少两个相似子树对应的函数体,确定为相似函数,包括:
根据所述第一字典数据和所述第二字典数据,确定所述相似子树对应的各节点的节点位置;
根据所述节点位置,对所述相似子树对应的各节点进行还原,生成所述相似函数。
9.根据权利要求1-8任一项所述的方法,其特征在于,解析待检测代码,得到抽象语法树,包括:
加载预设的Babel编辑器;
通过所述Babel编辑器以及预设的解析关键字,对待检测代码进行解析,得到对应的抽象语法树。
10.一种代码相似函数检测装置,其特征在于,包括:
解析模块,用于解析待检测代码,得到抽象语法树;
遍历模块,用于通过遍历所述抽象语法树,得到所述抽象语法树中至少两个子树,所述子树用于表征所述待检测代码中的函数体;
确定模块,用于根据各所述子树的节点,确定至少两个相似子树,并将所述至少两个相似子树对应的函数体,确定为相似函数,其中,各所述相似子树的对应节点的类型相同。
11.一种电子设备,其特征在于,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如权利要求1至9任一项所述的代码相似函数检测方法。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如权利要求1至9任一项所述的代码相似函数检测方法。
13.一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现权利要求1至9中任一项所述的代码相似函数检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110983815.6A CN115729797A (zh) | 2021-08-25 | 2021-08-25 | 代码相似函数检测方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110983815.6A CN115729797A (zh) | 2021-08-25 | 2021-08-25 | 代码相似函数检测方法、装置、电子设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115729797A true CN115729797A (zh) | 2023-03-03 |
Family
ID=85289807
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110983815.6A Pending CN115729797A (zh) | 2021-08-25 | 2021-08-25 | 代码相似函数检测方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115729797A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117349803A (zh) * | 2023-12-06 | 2024-01-05 | 浙江大学 | 代码解混淆方法、装置、电子设备及计算机可读存储介质 |
-
2021
- 2021-08-25 CN CN202110983815.6A patent/CN115729797A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117349803A (zh) * | 2023-12-06 | 2024-01-05 | 浙江大学 | 代码解混淆方法、装置、电子设备及计算机可读存储介质 |
CN117349803B (zh) * | 2023-12-06 | 2024-03-19 | 浙江大学 | 代码解混淆方法、装置、电子设备及计算机可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111506900B (zh) | 漏洞检测方法、装置、电子设备及计算机存储介质 | |
CN114422267B (zh) | 流量检测方法、装置、设备及介质 | |
CN110502227B (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
KR20180032669A (ko) | 콜경로 파인더 | |
CN111736840A (zh) | 小程序应用的编译方法、运行方法、存储介质及电子设备 | |
CN108763094B (zh) | 测试用例生成方法、装置、设备及存储介质 | |
CN109726217B (zh) | 一种数据库操作方法、装置、设备及存储介质 | |
CN112395253B (zh) | 索引文件生成方法、终端设备、电子设备及介质 | |
CN111552640A (zh) | 一种代码检测方法、装置、设备及存储介质 | |
CN110764748A (zh) | 代码调用方法、装置、终端及存储介质 | |
CN114328208A (zh) | 代码检测方法及装置、电子设备、存储介质 | |
CN111241823A (zh) | 一种依赖配置的管理方法、装置、电子设备及存储介质 | |
CN111124541B (zh) | 一种配置文件的生成方法、装置、设备及介质 | |
WO2015003452A1 (en) | Methods and systems for file processing | |
CN109446078B (zh) | 代码测试方法及装置、存储介质、电子设备 | |
CN115729797A (zh) | 代码相似函数检测方法、装置、电子设备及存储介质 | |
CN117034923A (zh) | 一种训练方法、文本评估方法、装置、介质及设备 | |
US11853751B2 (en) | Indirect function call target identification in software | |
CN116185805A (zh) | 代码检测方法、装置、设备及存储介质 | |
CN116010229A (zh) | 测试用例的生成方法、装置、设备及程序产品 | |
CN114047923A (zh) | 错误代码定位方法、装置、存储介质以及电子设备 | |
CN110716946B (zh) | 特征规则匹配库的更新方法、装置、存储介质及电子设备 | |
CN111026629A (zh) | 一种测试脚本自动生成的方法和装置 | |
CN113609309B (zh) | 知识图谱构建方法、装置、存储介质及电子设备 | |
CN117235744B (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 |