基于哈希值的代码克隆检测方法、电子设备、存储介质技术

技术编号:20545485 阅读:57 留言:0更新日期:2019-03-09 18:26
本发明专利技术提供基于哈希值的代码克隆检测方法,包括步骤:读取源代码,通过解析器抽取源代码中的代码库,得到克隆检测对象;通过哈希算法对克隆检测对象进行处理,获得克隆检测对象对应的匿名哈希值,通过匿名哈希值进行聚类,获得若干代码克隆分组;将代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆。本发明专利技术涉及电子设备与可读存储介质,用于执行上述方法。本发明专利技术能够检测到有标识符差异的代码克隆与有行数差异的代码克隆,能够针对COBOL源代码进行代码克隆检测,无平台及特定版本语言的限制,迁移性好,通过对哈希值进行聚类,降低整体复杂度。

Code Cloning Detection Method, Electronic Equipment and Storage Media Based on Hash Value

The invention provides a code cloning detection method based on hash value, including steps: reading source code, extracting code base from source code by parser, obtaining cloning detection object; processing cloning detection object by hash algorithm, obtaining anonymous hash value corresponding to cloning detection object, clustering anonymous hash value, obtaining several code cloning groups; Comparing the code in the code clone grouping in two groups to determine whether the number of lines of the two codes is less than the threshold or not, the code cloning in the code clone grouping is similar, otherwise it is not code cloning. The invention relates to an electronic device and a readable storage medium for performing the above method. The invention can detect code clones with different identifiers and lines, can detect code clones for COBOL source code, has no platform and specific version language limitations, good migration, and reduces overall complexity by clustering hash values.

【技术实现步骤摘要】
基于哈希值的代码克隆检测方法、电子设备、存储介质
本专利技术涉及代码克隆检测
,尤其涉及基于哈希值的代码克隆检测方法、电子设备、存储介质。
技术介绍
代码克隆(CodeClone)是指软件源代码中重复出现的相同或相似的代码片断。这些代码片断可能完全相同,也可能经过了一些编辑性(如修改变量名)或逻辑性的修改(如修改为功能相似但功能不同的代码)。被认为互相克隆的代码片段往往具有相似的逻辑运算,实现了类似的功能。代码克隆一般是由于复制粘贴式的代码复用造成的,也可能是由于复用软件模式造成的。代码克隆大量存在于各种软件系统,特别是大型软件系统。代码克隆在软件工程中与许多问题密切相关。代码克隆检测有广泛的应用:首先,随着开源项目的发展、代码复用规模的扩大,代码复用的广泛程度可以作为代码质量的评判标准和选择所复用的代码模块的参考依据;其次,通过克隆代码检测可以找出大型系统中的代码克隆,并进行重构,从而消除代码克隆,提高源代码的质量。此外,代码的缺陷可能因为克隆而传播,代码克隆检测有助于定位并修复这种类型的缺陷。但是,现有的代码克隆检测工具缺乏对有标识符差异的代码检测的能力,缺乏对有行数差异的代码检测的能力,只能运行在特定平台上,缺乏迁移性,只能检测特定的编程语言。
技术实现思路
为了克服现有技术的不足,本专利技术的目的之一在于提供基于哈希值的代码克隆检测方法,解决了现有的代码克隆检测工具缺乏对有标识符差异的代码检测的能力,缺乏对有行数差异的代码检测的能力,无法针对COBOL进行检测,只能运行在特定平台上,缺乏迁移性,只能检测特定版本的语言的问题。本专利技术提供基于哈希值的代码克隆检测方法,包括以下步骤:代码预处理,读取源代码,通过解析器抽取所述源代码中的代码库,得到克隆检测对象;克隆聚类,通过哈希算法对所述克隆检测对象进行处理,获得所述克隆检测对象对应的匿名哈希值,通过所述匿名哈希值进行聚类,获得若干代码克隆分组;克隆比较,将所述代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆。进一步地,所述代码预处理步骤还包括对所述克隆检测对象进行噪音消除。进一步地,所述代码预处理步骤还包括对所述克隆检测对象中不同的编码格式进行统一。进一步地,所述代码预处理步骤还包括通过哈希算法对所述克隆检测对象进行处理,获取所述克隆检测对象对应的全文哈希值,将所述全文哈希值中相同值对应的代码合并为同一代码段。进一步地,所述代码预处理步骤中,所述哈希算法为SimHash算法;所述通过哈希算法对所述克隆检测对象进行处理具体为将所述克隆检测对象进行关键词抽取,得到若干关键词与权重对,计算每个所述关键词与权重对中关键词的哈希值,对哈希值与权重对进行位的纵向累加,得到所述全文哈希值。进一步地,所述代码预处理步骤还包括对所述克隆检测对象进行变量名替换。进一步地,所述克隆聚类步骤中,所述哈希算法为SimHash算法;所述通过哈希算法对所述克隆检测对象进行处理具体为对变量名替换后的克隆检测对象进行关键词抽取,得到若干关键词与权重对,计算每个所述关键词与权重对中关键词的哈希值,对哈希值与权重对进行位的纵向累加,得到所述匿名哈希值。进一步地,所述克隆聚类步骤中,将所述匿名哈希值中所有哈希值从高位到低位进行排列,将海明距离在聚类阈值内的代码片段分入同一组中,所述海明距离为将所述匿名哈希值中的两个哈希值进行异或,获得结果中所有1的和。一种电子设备,包括:处理器;存储器;以及程序,其中所述程序被存储在所述存储器中,并且被配置成由处理器执行,所述程序包括用于执行上述基于哈希值的代码克隆检测方法。一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行上述基于哈希值的代码克隆检测方法。相比现有技术,本专利技术的有益效果在于:本专利技术提供基于哈希值的代码克隆检测方法,包括以下步骤:代码预处理,读取源代码,通过解析器抽取源代码中的代码库,得到克隆检测对象;克隆聚类,通过哈希算法对克隆检测对象进行处理,获得克隆检测对象对应的匿名哈希值,通过匿名哈希值进行聚类,获得若干代码克隆分组;克隆比较,将代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆。本专利技术涉及电子设备与可读存储介质,用于执行基于哈希值的代码克隆检测方法。本专利技术能够检测到有标识符差异的代码克隆与有行数差异的代码克隆,能够针对COBOL源代码进行代码克隆检测,无平台及特定版本语言的限制,迁移性好,通过对哈希值进行聚类,将方法的整体复杂度变为O(n),其中特定代码的克隆扫描复杂度为O(1)。上述说明仅是本专利技术技术方案的概述,为了能够更清楚了解本专利技术的技术手段,并可依照说明书的内容予以实施,以下以本专利技术的较佳实施例并配合附图详细说明如后。本专利技术的具体实施方式由以下实施例及其附图详细给出。附图说明此处所说明的附图用来提供对本专利技术的进一步理解,构成本申请的一部分,本专利技术的示意性实施例及其说明用于解释本专利技术,并不构成对本专利技术的不当限定。在附图中:图1为本专利技术的基于哈希值的代码克隆检测方法流程图;图2为本专利技术实施例的哈希值计算过程流程图。具体实施方式下面,结合附图以及具体实施方式,对本专利技术做进一步描述,需要说明的是,在不相冲突的前提下,以下描述的各实施例之间或各技术特征之间可以任意组合形成新的实施例。在一实施例中,给定一个需要进行检测的软件系统,其包含的所有源代码文件的集合为F=[f1,f2,...,fm],其中fi代表第i个源代码文件。在fi源代码文件中有fi(j)个代码片段[c1,c2,...,cfi(n)],其中代码片段c指需要检测代码克隆的最小粒度的代码块,比如COBOL中的paragraph,或者JAVA中的method,一个系统中所有的代码片段总数以m表示,其集合为C。代码克隆以对w的形式描述,一对代码克隆w=(c1,c2)。系统中所有的代码克隆的集合表示为W,其中W=[w1,w2,...,wp],wi代表第i个代码克隆对。基于哈希值的代码克隆检测方法,如图1所示,包括以下步骤:代码预处理,读取源代码,通过解析器抽取源代码中的代码库,比如COBOL中的paragraph,抽取后获得的源代码集合即为克隆检测对象C;解析器为能够将源代码中的抽象语法树抽取出来的程序,解析器可以是基于ANTLR的源码分析程序,比如可以设计覆盖了COBOL的语法,抽取COBOL的语法树,进而将paragraph解析出来。在一实施例中,优选的,代码预处理步骤还包括对克隆检测对象C进行噪音消除,消除对象主要为没有意义的注释与简单代码段,如只有一行的“退出”代码为简单代码段。优选的,代码预处理步骤还包括对克隆检测对象中不同的编码格式进行统一,比如将COBOL的行首多个空格替换成为一个,获得清理后的源代码C1。C1中有很多完全相同的代码克隆Wt,优选的,代码预处理步骤还包括通过哈希算法对克隆检测对象进行处理,获取克隆检测对象对应的全文哈希值,将全文哈希值中相同值对应的代码合并为同一代码段。本实施例中,如图2所示,优选的,哈希算法为SimHash算法,通过Si本文档来自技高网...

【技术保护点】
1.基于哈希值的代码克隆检测方法,其特征在于包括以下步骤:代码预处理,读取源代码,通过解析器抽取所述源代码中的代码库,得到克隆检测对象;克隆聚类,通过哈希算法对所述克隆检测对象进行处理,获得所述克隆检测对象对应的匿名哈希值,通过所述匿名哈希值进行聚类,获得若干代码克隆分组;克隆比较,将所述代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆。

【技术特征摘要】
1.基于哈希值的代码克隆检测方法,其特征在于包括以下步骤:代码预处理,读取源代码,通过解析器抽取所述源代码中的代码库,得到克隆检测对象;克隆聚类,通过哈希算法对所述克隆检测对象进行处理,获得所述克隆检测对象对应的匿名哈希值,通过所述匿名哈希值进行聚类,获得若干代码克隆分组;克隆比较,将所述代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆。2.如权利要求1所述的基于哈希值的代码克隆检测方法,其特征在于:所述代码预处理步骤还包括对所述克隆检测对象进行噪音消除。3.如权利要求2所述的基于哈希值的代码克隆检测方法,其特征在于:所述代码预处理步骤还包括对所述克隆检测对象中不同的编码格式进行统一。4.如权利要求3所述的基于哈希值的代码克隆检测方法,其特征在于:所述代码预处理步骤还包括通过哈希算法对所述克隆检测对象进行处理,获取所述克隆检测对象对应的全文哈希值,将所述全文哈希值中相同值对应的代码合并为同一代码段。5.如权利要求4所述的基于哈希值的代码克隆检测方法,其特征在于:所述代码预处理步骤中,所述哈希算法为SimHash算法;所述通过哈希算法对所述克隆检测对象进行处理具体为将所述克隆检测对象进行关键词抽取,得到若干关键...

【专利技术属性】
技术研发人员:陈秋远杨朝晖李善平
申请(专利权)人:浙江网新恒天软件有限公司
类型:发明
国别省市:浙江,33

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

1