欢迎您访问广东某某机械环保科有限公司网站,公司主营某某机械、某某设备、某某模具等产品!
全国咨询热线: 400-123-4567

新闻资讯

哈希游戏| 哈希游戏平台| 哈希游戏APP

HAXIYOUXI-HAXIYOUXIPINGTAI-HAXIYOUXIAPP

哈希游戏- 哈希游戏平台- 官方网站基于值的代码克隆检测方法、电子设备、存储介质与流程

作者:小编2025-02-10 18:39:23

  哈希游戏- 哈希游戏平台- 哈希游戏官方网站

哈希游戏- 哈希游戏平台- 哈希游戏官方网站基于哈希值的代码克隆检测方法、电子设备、存储介质与流程

  代码克隆(codeclone)是指软件源代码中重复出现的相同或相似的代码片断。这些代码片断可能完全相同,也可能经过了一些编辑性(如修改变量名)或逻辑性的修改(如修改为功能相似但功能不同的代码)。被认为互相克隆的代码片段往往具有相似的逻辑运算,实现了类似的功能。代码克隆一般是由于复制粘贴式的代码复用造成的,也可能是由于复用软件模式造成的。代码克隆大量存在于各种软件系统,特别是大型软件系统。代码克隆在软件工程中与许多问题密切相关。代码克隆检测有广泛的应用:首先,随着开源项目的发展、代码复用规模的扩大,代码复用的广泛程度可以作为代码质量的评判标准和选择所复用的代码模块的参考依据;其次,通过克隆代码检测可以找出大型系统中的代码克隆,并进行重构,从而消除代码克隆,提高源代码的质量。此外,代码的缺陷可能因为克隆而传播,代码克隆检测有助于定位并修复这种类型的缺陷。但是,现有的代码克隆检测工具缺乏对有标识符差异的代码检测的能力,缺乏对有行数差异的代码检测的能力,只能运行在特定平台上,缺乏迁移性,只能检测特定的编程语言。

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

  在一实施例中,给定一个需要进行检测的软件系统,其包含的所有源代码文件的集合为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个代码克隆对。

  在一实施例中,优选的,代码预处理步骤还包括对克隆检测对象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-min)/4+min。在每一个分组中进行下一步的克隆比较,分组能够避免全局的两两比较,从而不会是o(n2)的时间复杂度,将整体复杂度变为o(n),其中特定代码的克隆扫描复杂度为o(1)。

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