首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

【发明授权】基于哈希值的代码克隆检测方法、电子设备、存储介质_浙江网新恒天软件有限公司_201811308117.0 

申请/专利权人:浙江网新恒天软件有限公司

申请日:2018-11-05

公开(公告)日:2024-06-21

公开(公告)号:CN109445844B

主分类号:G06F8/75

分类号:G06F8/75

优先权:

专利状态码:有效-授权

法律状态:2024.06.21#授权;2020.12.18#实质审查的生效;2019.03.08#公开

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

主权项:1.基于哈希值的代码克隆检测方法,其特征在于包括以下步骤:代码预处理,读取源代码,通过解析器抽取所述源代码中的代码库,得到克隆检测对象;克隆聚类,通过哈希算法对所述克隆检测对象进行处理,获得所述克隆检测对象对应的匿名哈希值,通过所述匿名哈希值进行聚类,获得若干代码克隆分组;克隆比较,将所述代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆;所述代码预处理步骤还包括通过哈希算法对所述克隆检测对象进行处理,获取所述克隆检测对象对应的全文哈希值,将所述全文哈希值中相同值对应的代码合并为同一代码段;所述哈希算法为SimHash算法;所述通过哈希算法对所述克隆检测对象进行处理具体为将所述克隆检测对象进行关键词抽取,得到若干关键词与权重对,计算每个所述关键词与权重对中关键词的哈希值,对哈希值与权重对进行位的纵向累加,得到所述全文哈希值;所述代码预处理步骤还包括对所述克隆检测对象进行变量名替换;所述克隆聚类步骤中,所述哈希算法为SimHash算法;所述通过哈希算法对所述克隆检测对象进行处理具体为对变量名替换后的克隆检测对象进行关键词抽取,得到若干关键词与权重对,计算每个所述关键词与权重对中关键词的哈希值,对哈希值与权重对进行位的纵向累加,得到所述匿名哈希值;所述克隆聚类步骤中,将所述匿名哈希值中所有哈希值从高位到低位进行排列,将海明距离在聚类阈值内的代码片段分入同一组中,所述海明距离为将所述匿名哈希值中的两个哈希值进行异或,获得结果中所有1的和。

全文数据:基于哈希值的代码克隆检测方法、电子设备、存储介质技术领域本发明涉及代码克隆检测技术领域,尤其涉及基于哈希值的代码克隆检测方法、电子设备、存储介质。背景技术代码克隆CodeClone是指软件源代码中重复出现的相同或相似的代码片断。这些代码片断可能完全相同,也可能经过了一些编辑性如修改变量名或逻辑性的修改如修改为功能相似但功能不同的代码。被认为互相克隆的代码片段往往具有相似的逻辑运算,实现了类似的功能。代码克隆一般是由于复制粘贴式的代码复用造成的,也可能是由于复用软件模式造成的。代码克隆大量存在于各种软件系统,特别是大型软件系统。代码克隆在软件工程中与许多问题密切相关。代码克隆检测有广泛的应用:首先,随着开源项目的发展、代码复用规模的扩大,代码复用的广泛程度可以作为代码质量的评判标准和选择所复用的代码模块的参考依据;其次,通过克隆代码检测可以找出大型系统中的代码克隆,并进行重构,从而消除代码克隆,提高源代码的质量。此外,代码的缺陷可能因为克隆而传播,代码克隆检测有助于定位并修复这种类型的缺陷。但是,现有的代码克隆检测工具缺乏对有标识符差异的代码检测的能力,缺乏对有行数差异的代码检测的能力,只能运行在特定平台上,缺乏迁移性,只能检测特定的编程语言。发明内容为了克服现有技术的不足,本发明的目的之一在于提供基于哈希值的代码克隆检测方法,解决了现有的代码克隆检测工具缺乏对有标识符差异的代码检测的能力,缺乏对有行数差异的代码检测的能力,无法针对COBOL进行检测,只能运行在特定平台上,缺乏迁移性,只能检测特定版本的语言的问题。本发明提供基于哈希值的代码克隆检测方法,包括以下步骤:代码预处理,读取源代码,通过解析器抽取所述源代码中的代码库,得到克隆检测对象;克隆聚类,通过哈希算法对所述克隆检测对象进行处理,获得所述克隆检测对象对应的匿名哈希值,通过所述匿名哈希值进行聚类,获得若干代码克隆分组;克隆比较,将所述代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆。进一步地,所述代码预处理步骤还包括对所述克隆检测对象进行噪音消除。进一步地,所述代码预处理步骤还包括对所述克隆检测对象中不同的编码格式进行统一。进一步地,所述代码预处理步骤还包括通过哈希算法对所述克隆检测对象进行处理,获取所述克隆检测对象对应的全文哈希值,将所述全文哈希值中相同值对应的代码合并为同一代码段。进一步地,所述代码预处理步骤中,所述哈希算法为SimHash算法;所述通过哈希算法对所述克隆检测对象进行处理具体为将所述克隆检测对象进行关键词抽取,得到若干关键词与权重对,计算每个所述关键词与权重对中关键词的哈希值,对哈希值与权重对进行位的纵向累加,得到所述全文哈希值。进一步地,所述代码预处理步骤还包括对所述克隆检测对象进行变量名替换。进一步地,所述克隆聚类步骤中,所述哈希算法为SimHash算法;所述通过哈希算法对所述克隆检测对象进行处理具体为对变量名替换后的克隆检测对象进行关键词抽取,得到若干关键词与权重对,计算每个所述关键词与权重对中关键词的哈希值,对哈希值与权重对进行位的纵向累加,得到所述匿名哈希值。进一步地,所述克隆聚类步骤中,将所述匿名哈希值中所有哈希值从高位到低位进行排列,将海明距离在聚类阈值内的代码片段分入同一组中,所述海明距离为将所述匿名哈希值中的两个哈希值进行异或,获得结果中所有1的和。一种电子设备,包括:处理器;存储器;以及程序,其中所述程序被存储在所述存储器中,并且被配置成由处理器执行,所述程序包括用于执行上述基于哈希值的代码克隆检测方法。一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行上述基于哈希值的代码克隆检测方法。相比现有技术,本发明的有益效果在于:本发明提供基于哈希值的代码克隆检测方法,包括以下步骤:代码预处理,读取源代码,通过解析器抽取源代码中的代码库,得到克隆检测对象;克隆聚类,通过哈希算法对克隆检测对象进行处理,获得克隆检测对象对应的匿名哈希值,通过匿名哈希值进行聚类,获得若干代码克隆分组;克隆比较,将代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆。本发明涉及电子设备与可读存储介质,用于执行基于哈希值的代码克隆检测方法。本发明能够检测到有标识符差异的代码克隆与有行数差异的代码克隆,能够针对COBOL源代码进行代码克隆检测,无平台及特定版本语言的限制,迁移性好,通过对哈希值进行聚类,将方法的整体复杂度变为On,其中特定代码的克隆扫描复杂度为O1。上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,并可依照说明书的内容予以实施,以下以本发明的较佳实施例并配合附图详细说明如后。本发明的具体实施方式由以下实施例及其附图详细给出。附图说明此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:图1为本发明的基于哈希值的代码克隆检测方法流程图;图2为本发明实施例的哈希值计算过程流程图。具体实施方式下面,结合附图以及具体实施方式,对本发明做进一步描述,需要说明的是,在不相冲突的前提下,以下描述的各实施例之间或各技术特征之间可以任意组合形成新的实施例。在一实施例中,给定一个需要进行检测的软件系统,其包含的所有源代码文件的集合为F=[f1,f2,...,fm],其中fi代表第i个源代码文件。在fi源代码文件中有fij个代码片段[c1,c2,...,cfin],其中代码片段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算法,通过SimHash算法对C1进行处理,获得其哈希值S1=[s1,s2,...,sm],S1即全文哈希值,具体过程为将Doc图2中的Doc为清理后的源代码C1进行关键词抽取,其中包括分词和计算权重,抽取出n个关键词,权重对,图2中,以feature表示关键词,以weight表示权重,计算每个feature_weight_pairs,即关键词,权重对,中feature的哈希值,然后对hash_weight_pairs,即哈希值,权重对,进行位的纵向累加即图2中的add,累加规则为:1则减一,0则减一,若最后结果为正则取值为1,若最后结果为非负则取值为0,获得最后的SimHash值,即图2中的fingerprint指纹,将S1中相同SimHash值所对应的代码合并起来作为同一个代码段处理,此步骤可以提前合并完全相同的代码片段,减少计算量。优选的,代码预处理步骤还包括对克隆检测对象进行变量名替换,比如用v1,v2。。。vn等符号代替原有变量名,获得替换变量名的源代码C2。克隆聚类,对替换变量的源代码C2再次通过SimHash算法进行处理,获得克隆检测对象对应的匿名哈希值S2,其中S2∈S1,S2=[s1,s2,...,sq]q≤m,S2经过了合并与变量替换处理,故称为匿名哈希值,与C2一一对应,是对C进行抽象表示的集合,通过匿名哈希值S2进行聚类,获得若干代码克隆分组;优选的,克隆聚类步骤中,对变量名替换后的克隆检测对象进行关键词抽取,得到若干关键词与权重对,计算每个关键词与权重对中关键词的哈希值,对哈希值与权重对进行位的纵向累加,得到最终的SimHash值。优选的,克隆聚类步骤中,将匿名哈希值S2中所有哈希值从高位到低位进行排列,即从大到小排序,使用海明距离进行聚类,其中海明距离的定义如下:在信息编码中,两个SimHash代码对应位上编码不同的位数称为码距,具体为将两个SimHash值进行异或,获得结果中所有1的和作为海明距离。将海明距离在聚类阈值内的代码片段分入同一组中。本实施例中,聚类阈值设定为最大距离max即SimHash的位数和最小距离min排序后相邻的不同simhash值的海明距离的最小值,实施中一般取为3的四分位,即t=max-min4+min。在每一个分组中进行下一步的克隆比较,分组能够避免全局的两两比较,从而不会是On2的时间复杂度,将整体复杂度变为On,其中特定代码的克隆扫描复杂度为O1。克隆比较,克隆聚类之后,各个分组内的代码有一定程度的相似性,将代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,如50%,是则判定为相似的代码克隆,否则判定不是代码克隆。一种电子设备,包括:处理器;存储器;以及程序,其中程序被存储在存储器中,并且被配置成由处理器执行,程序包括用于执行上述基于哈希值的代码克隆检测方法。一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行上述基于哈希值的代码克隆检测方法。本发明提供基于哈希值的代码克隆检测方法,包括以下步骤:代码预处理,读取源代码,通过解析器抽取源代码中的代码库,得到克隆检测对象;克隆聚类,通过哈希算法对克隆检测对象进行处理,获得克隆检测对象对应的匿名哈希值,通过匿名哈希值进行聚类,获得若干代码克隆分组;克隆比较,将代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆。本发明涉及电子设备与可读存储介质,用于执行基于哈希值的代码克隆检测方法。本发明能够检测到有标识符差异的代码克隆与有行数差异的代码克隆,能够针对COBOL源代码进行代码克隆检测,无平台及特定版本语言的限制,迁移性好,通过对哈希值进行聚类,将方法的整体复杂度变为On,其中特定代码的克隆扫描复杂度为O1。以上,仅为本发明的较佳实施例而已,并非对本发明作任何形式上的限制;凡本行业的普通技术人员均可按说明书附图所示和以上而顺畅地实施本发明;但是,凡熟悉本专业的技术人员在不脱离本发明技术方案范围内,利用以上所揭示的技术内容而做出的些许更动、修饰与演变的等同变化,均为本发明的等效实施例;同时,凡依据本发明的实质技术对以上实施例所作的任何等同变化的更动、修饰与演变等,均仍属于本发明的技术方案的保护范围之内。

权利要求:1.基于哈希值的代码克隆检测方法,其特征在于包括以下步骤:代码预处理,读取源代码,通过解析器抽取所述源代码中的代码库,得到克隆检测对象;克隆聚类,通过哈希算法对所述克隆检测对象进行处理,获得所述克隆检测对象对应的匿名哈希值,通过所述匿名哈希值进行聚类,获得若干代码克隆分组;克隆比较,将所述代码克隆分组中的代码在组内两两进行比较,判断两段代码各自的行数或者有差异的代码行数是否小于阈值,是则判定为相似的代码克隆,否则判定不是代码克隆。2.如权利要求1所述的基于哈希值的代码克隆检测方法,其特征在于:所述代码预处理步骤还包括对所述克隆检测对象进行噪音消除。3.如权利要求2所述的基于哈希值的代码克隆检测方法,其特征在于:所述代码预处理步骤还包括对所述克隆检测对象中不同的编码格式进行统一。4.如权利要求3所述的基于哈希值的代码克隆检测方法,其特征在于:所述代码预处理步骤还包括通过哈希算法对所述克隆检测对象进行处理,获取所述克隆检测对象对应的全文哈希值,将所述全文哈希值中相同值对应的代码合并为同一代码段。5.如权利要求4所述的基于哈希值的代码克隆检测方法,其特征在于:所述代码预处理步骤中,所述哈希算法为SimHash算法;所述通过哈希算法对所述克隆检测对象进行处理具体为将所述克隆检测对象进行关键词抽取,得到若干关键词与权重对,计算每个所述关键词与权重对中关键词的哈希值,对哈希值与权重对进行位的纵向累加,得到所述全文哈希值。6.如权利要求4所述的基于哈希值的代码克隆检测方法,其特征在于:所述代码预处理步骤还包括对所述克隆检测对象进行变量名替换。7.如权利要求4所述的基于哈希值的代码克隆检测方法,其特征在于:所述克隆聚类步骤中,所述哈希算法为SimHash算法;所述通过哈希算法对所述克隆检测对象进行处理具体为对变量名替换后的克隆检测对象进行关键词抽取,得到若干关键词与权重对,计算每个所述关键词与权重对中关键词的哈希值,对哈希值与权重对进行位的纵向累加,得到所述匿名哈希值。8.如权利要求7所述的基于哈希值的代码克隆检测方法,其特征在于:所述克隆聚类步骤中,将所述匿名哈希值中所有哈希值从高位到低位进行排列,将海明距离在聚类阈值内的代码片段分入同一组中,所述海明距离为将所述匿名哈希值中的两个哈希值进行异或,获得结果中所有1的和。9.一种电子设备,其特征在于包括:处理器;存储器;以及程序,其中所述程序被存储在所述存储器中,并且被配置成由处理器执行,所述程序包括用于执行权利要求1-8任意一项所述的方法。10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于:所述计算机程序被处理器执行如权利要求1-8任意一项所述的方法。

百度查询: 浙江网新恒天软件有限公司 基于哈希值的代码克隆检测方法、电子设备、存储介质

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。