一种代码相似度的检测方法和装置制造方法及图纸

技术编号:22329822 阅读:36 留言:0更新日期:2019-10-19 12:13
本发明专利技术公开了代码相似度的检测方法和装置,涉及计算机技术领域。该方法的一具体实施方式包括:获取代码文件,以建立所述代码对应的抽象语法树;提取所述抽象语法树中的词汇,以根据所述词汇将抽象语法树映射成空间向量;基于空间向量的余弦距离,计算代码相似度。该实施方式能够解决现有技术中针对不违背编程逻辑或者编程风格,并且变量、命名、类型都正常但是代码架构明显有问题的情况无法检测的问题。

A detection method and device of code similarity

【技术实现步骤摘要】
一种代码相似度的检测方法和装置
本专利技术涉及计算机
,尤其涉及一种代码相似度的检测方法和装置。
技术介绍
目前,一般的软件企业都会通过各种各样的工具对代码进行静态检测,以对代码中不合理的部分进行修改。现有的静态分析软件如Coverity或者Infer等静态检查工具,静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。其中,代码检查包括代码走查、桌面检查、代码审查等,主要检查代码的逻辑表达的正确性,可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。在实现本专利技术过程中,专利技术人发现现有技术中至少存在如下问题:现在的静态检测仅仅针对代码的违背逻辑、不符合编程风格以及变量检查、命名和类型审查等,但是对代码的架构的好坏是无法检测出来的,比如多个相似的重复类是否可以有更高的抽象层次。散落在各个文件中的工具方法是否可以统一到一起,这种不违背编程逻辑或者编程风格,并且变量、命名、类型都正常但是代码架构明显有问题的情况是无法检测出来的。
技术实现思路
有鉴于此,本专利技术实施例提供一种代码相似度的检测方法和装置,可以解决现有技术中针对不违背编程逻辑或者编程风格,并且变量、命名、类型都正常但是代码架构明显有问题的情况无法检测的问题。为实现上述目的,根据本专利技术实施例的一个方面,提供了一种代码相似度的检测方法,包括获取代码文件,以建立所述代码对应的抽象语法树;提取所述抽象语法树中的词汇,以根据所述词汇将抽象语法树映射成空间向量;基于空间向量的余弦距离,计算代码相似度。可选地,根据所述词汇将抽象语法树映射成空间向量,包括:根据所述词汇将抽象语法树转化为抽象代码树数组,以映射为空间向量。可选地,根据所述词汇将抽象语法树转化为抽象代码树数组,包括:去除抽象语法树中的变量值;根据所述词汇,将抽象语法树纵向的从左至右生成抽象代码树数组,并且删除重复词汇。可选地,根据所述词汇将抽象语法树转化为抽象代码树数组之后,包括:在生成的抽象代码树数组前端加上代码文件所属的工程包名,并存储在数据库的预设抽象表中;所述将数组映射为空间向量,包括:将抽象表中的文本信息转化为空间向量,所述文本信息包括工程包名、代码文件名和抽象代码树数组。另外,根据本专利技术实施例的一个方面,提供了一种代码相似度的检测装置,包括获取模块,用于获取代码文件,以建立所述代码对应的抽象语法树;映射模块,用于提取所述抽象语法树中的词汇,以根据所述词汇将抽象语法树映射成空间向量;计算模块,用于基于空间向量的余弦距离,计算代码相似度。可选地,所述映射模块根据所述词汇将抽象语法树映射成空间向量,包括:根据所述词汇将抽象语法树转化为抽象代码树数组,以映射为空间向量。可选地,所述映射模块根据所述词汇将抽象语法树转化为抽象代码树数组,包括:去除抽象语法树中的变量值;根据所述词汇,将抽象语法树纵向的从左至右生成抽象代码树数组,并且删除重复词汇。可选地,所述映射模块根据所述词汇将抽象语法树转化为抽象代码树数组之后,还包括:在生成的抽象代码树数组前端加上代码文件所属的工程包名,并存储在数据库的预设抽象表中;所述映射模块将数组映射为空间向量,包括:将抽象表中的文本信息转化为空间向量,所述文本信息包括工程包名、代码文件名和抽象代码树数组。根据本专利技术实施例的另一个方面,还提供了一种电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现上述任一代码相似度的检测实施例所述的方法。根据本专利技术实施例的另一个方面,还提供了一种计算机可读介质,其上存储有计算机程序,所述程序被处理器执行时实现上述任一基于代码相似度的检测实施例所述的方法。上述专利技术中的一个实施例具有如下优点或有益效果:因为采用了将代码文件加以处理,形成编译器所理解的抽象语法树,然后再将抽象语法树映射成空间向量,基于空间向量的余弦距离来计算代码的相似度的技术手段,从而可以在代码架构的层次上对系统中可能的需要重构修正的代码做出预测,进而明显改善代码结构以及可读性。上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。附图说明附图用于更好地理解本专利技术,不构成对本专利技术的不当限定。其中:图1是根据本专利技术实施例的代码相似度的检测方法的主要流程的示意图;图2是根据本专利技术可参考实施例的代码相似度的检测方法的主要流程的示意图;图3是根据本专利技术可参考实施例的代码抽象语法树的示意图;图4是根据本专利技术实施例的代码相似度的检测装置的主要模块的示意图;图5是本专利技术实施例可以应用于其中的示例性系统架构图;图6是适于用来实现本专利技术实施例的终端设备或服务器的计算机系统的结构示意图。具体实施方式以下结合附图对本专利技术的示范性实施例做出说明,其中包括本专利技术实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本专利技术的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。图1是根据本专利技术实施例的代码相似度的检测方法,如图1所示,所述基于代码相似度的检测方法包括:步骤S101,获取代码文件,以建立所述代码对应的抽象语法树。其中,通常一个工程包括很多包、以及包中的代码。而每个包中的代码则称之为一个代码文件。步骤S102,提取所述抽象语法树中的词汇,以根据所述词汇将抽象语法树映射成空间向量。具体的实施过程包括:将代码的抽象语法树转化为抽象代码树数组,以映射为空间向量。较佳地,可以先去除抽象语法树中的变量值,然后再将抽象语法树纵向的从左至右生成抽象代码树数组。进一步地,可以删除抽象代码树数组中重复词汇。另外,可以在生成的抽象代码树数组前端加上代码文件所属的工程包名,并存储在数据库的预设抽象表中。然后,将抽象表中的文本信息转化为空间向量,其中文本信息包括工程包名、代码文件名和抽象代码树数组。值得说明的是,可以采用Word2vec将文本信息转化为空间向量。步骤S103,基于空间向量的余弦距离,计算代码相似度。在实施例中,在计算出代码的相似度后,可以利用代码的相似度优化代码文件。进一步地,可以对相似的代码进行更高层次的抽象整合、删除无用的废弃代码。根据上面的各种实施例,可以看出所述代码相似度的检测方法,可以在代码架构的层次上对系统中可能的需要重构修正的代码做出预测,进而提醒开发人员关注那些十分相似的代码文件,从而可以通过基于代码间的相似度对代码的架构调整做出推荐,因此大幅度改善了代码结构以及可读性。图2是根据本专利技术可参考实施例的代码相似度的检测方法的主要流程的示意图,所述代码相似度的检测方法可以包括:步骤S201,获取代码文件。步骤S202,将代码文件生成抽象语法树。较佳地,通过JavaParser(Java解析器)或者类似的其他语言的Parser(解析器)工具可以将包下的每个代码文件生成抽象语法树(AST),这颗树定义了代码的语义结构,去除了不同的文字结构(空格、回车键本文档来自技高网...

【技术保护点】
1.一种代码相似度的检测方法,其特征在于,包括:获取代码文件,以建立所述代码对应的抽象语法树;提取所述抽象语法树中的词汇,以根据所述词汇将抽象语法树映射成空间向量;基于空间向量的余弦距离,计算代码相似度。

【技术特征摘要】
1.一种代码相似度的检测方法,其特征在于,包括:获取代码文件,以建立所述代码对应的抽象语法树;提取所述抽象语法树中的词汇,以根据所述词汇将抽象语法树映射成空间向量;基于空间向量的余弦距离,计算代码相似度。2.根据权利要求1所述的方法,其特征在于,根据所述词汇将抽象语法树映射成空间向量,包括:根据所述词汇将抽象语法树转化为抽象代码树数组,以映射为空间向量。3.根据权利要求2所述的方法,其特征在于,根据所述词汇将抽象语法树转化为抽象代码树数组,包括:去除抽象语法树中的变量值;根据所述词汇,将抽象语法树纵向的从左至右生成抽象代码树数组,并且删除重复词汇。4.根据权利要求2所述的方法,其特征在于,根据所述词汇将抽象语法树转化为抽象代码树数组之后,包括:在生成的抽象代码树数组前端加上代码文件所属的工程包名,并存储在数据库的预设抽象表中;所述将数组映射为空间向量,包括:将抽象表中的文本信息转化为空间向量,所述文本信息包括工程包名、代码文件名和抽象代码树数组。5.一种代码相似度的检测装置,其特征在于,包括:获取模块,用于获取代码文件,以建立所述代码对应的抽象语法树;映射模块,用于提取所述抽象语法树中的词汇,以根据所述词汇将抽象语法树映射成空间向量;计算模块,...

【专利技术属性】
技术研发人员:陆韬
申请(专利权)人:北京京东尚科信息技术有限公司北京京东世纪贸易有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1