技术新讯 > 计算推算,计数设备的制造及其应用技术 > 一种基于多表征的大规模代码克隆检测方法及系统  >  正文

一种基于多表征的大规模代码克隆检测方法及系统

  • 国知局
  • 2024-08-05 12:04:31

本发明属于软件复用与代码质量管理,具体涉及一种基于多表征的大规模代码克隆检测方法及系统。

背景技术:

1、代码克隆指的是在软件中存在高度相似或相同的代码片段,它可能源自于复制粘贴、模板应用或者独立的相似设计。代码克隆的存在可能导致维护难度增加、bug传播加剧以及代码变更的不一致性。为了解决这些问题,研究者们开发了代码克隆检测技术。图1为代码克隆检测的一般流程。

2、根据代码之间的相似度,代码克隆通常分为以下四种类型:1)type-1(t1):源代码中完全相同的代码片段,除了空白、格式和注释;2)type-2(t2):在t1克隆的基础上,允许变量名、变量取值等改变,但整体的结构和语法保持不变;3)type-3(t3):在前两种克隆的基础上,允许添加、删除或更改部分代码行;4)type-4(t4):在功能上相似或相同,但在代码实现上可能完全不同的代码片段。基于不同的代码表征,目前的代码克隆检测技术主要分为四个类别,分别是基于文本、字符(token)、抽象语法树(ast)和图(控制流图(cfg)以及程序依赖图(pdg))的方法。

3、基于文本方法:这种方法将源代码视为文本,通过文本相似性度量(如编辑距离、余弦相似性等)来判断代码片段的相似性。这类方法简单直观,易于实现,执行速度快,适用于检测t1类型克隆,但难以准确检测存在变量替换或语义相似但结构不同的克隆。

4、基于token方法:这种方法会通过词法分析从源代码中提取token并形成序列以供后续的比较算法进行检测。比如将源代码令牌化为token序列后被输入到后缀树中,并对标识符和常量进行归一化,从而能有效检测t2类型克隆。这类方法在保证执行效率的同时提升了代码克隆的检测精度,能够捕捉一定的语法结构信息,适用于检测t1/t2类型克隆,但仍然难以处理语义上相似但结构不同的克隆;同时对于不同编程语言的适应性较差。

5、基于抽象语法树方法:通过构建源代码的抽象语法树(ast),将代码结构表示为树状结构。然后,通过比较这些树的结构和节点,判断代码片段之间的相似性。相较于token,语法树包含了源代码的句法和结构信息,但基于树的工具在分析大型源代码库时会消耗较长的执行时间。这类方法更关注代码结构,能够捕捉语法和一定层度上的语义信息,适用于捕捉结构相似但细节不同的克隆。但其对于代码的变换和重构仍然可能不够灵活而且计算复杂度相对较高。

6、基于图方法:cfg和pdg是用于表示程序控制流和依赖关系的图形结构,由于能有效地捕捉源代码的语义信息,在复杂克隆的检测中它们更加有效。这类方法能够更全面地表示代码结构、流程和依赖关系,对于复杂的克隆结构有更好的适应性,而且对代码变换和重构更敏感。但计算复杂度较高,需要更多的计算资源,不能用于大规模代码克隆检测。而且该类方法对图的建模和比较需要设计更复杂的算法。

7、综上所述,利用代码的浅层信息可以更加快速的找到克隆代码,但召回率和精确率较低。利用代码的深层信息可以发现更多的潜在克隆,但同时也会消耗更多的计算资源,导致其难以处理大规模输入。

技术实现思路

1、针对现有技术的不足,本发明充分利用不同表征的独特优势,目的是实现对大规模输入中克隆代码片段的精确且高效的识别,以降低维护成本、改善代码质量,并预防因克隆代码引发的潜在问题,并具体提出了一种多表征的大规模代码克隆检测方法及系统。

2、为了达到前述发明目的,本发明采用了以下方案:

3、本发明的一个方面提供了一种基于多表征的大规模代码克隆检测方法,包括:

4、步骤s1、利用解析工具从源文件中提取所有函数作为代码克隆检测的基本单位,得到函数集合,并获取对应的字符和抽象语法树信息;

5、步骤s2、将所述函数集合分为m组,选定其中一分组g,为分组g内所有函数的相邻n行代码生成哈希值用以构建倒排索引,所述索引的键为哈希值,索引的值为包含该键的函数id;

6、步骤s3、遍历步骤s1中的所有函数,对于选中的函数f,为其所有相邻n行代码生成哈希值,获取所有哈希值在倒排索引中的值,作为初始克隆函数候选集;

7、步骤s4、依次计算所述选中的函数f与所述初始克隆函数候选集中各函数h的字符级别的相似度;若相似度小于阈值θ1,则将对应的初始克隆函数候选集中的函数h从初始克隆函数候选集中移除,并生成过滤后克隆函数候选集;若相似度大于阈值μ1,则将由所述选中的函数f和对应的初始克隆函数候选集中的函数h所构成的函数对(h,f)加入最终的代码克隆检测结果中;

8、步骤s5、依次计算所述选中的函数f与过滤后克隆函数候选集中各函数h′的抽象语法树级别的相似度;若相似度大于阈值μ2,则将由所述选中的函数f和对应的过滤后克隆函数候选集中的函数h′所构成的函数对(h′,f)加入最终的代码克隆检测结果中;

9、步骤s6、重复步骤s2至s5,直到m组函数均检测完毕。

10、本发明的另一个方面提供了一种基于多表征的大规模代码克隆检测系统,包括:

11、函数提取及规范化模块,用于利用解析工具从源文件中提取所有函数作为代码克隆检测的基本单位,得到函数集合,并获取对应的字符和抽象语法树信息;

12、倒排索引构建模块,用于将所述函数集合分为m组,选定其中一分组g,为分组g内所有函数的相邻n行代码生成哈希值用以构建倒排索引,所述索引的键为哈希值,索引的值为包含该键的函数id;

13、初始克隆函数候选集生成模块,用于遍历函数提取及规范化模块中所提取的所有函数,对于选中的函数f,为其所有相邻n行代码生成哈希值,获取所有哈希值在倒排索引中的值,作为初始克隆函数候选集;

14、字符过滤模块,用于依次计算所述选中的函数f与所述初始克隆函数候选集中各函数h的字符级别的相似度;若相似度小于阈值θ1,则将对应的初始克隆函数候选集中的函数h从初始克隆函数候选集中移除,并生成过滤后克隆函数候选集;若相似度大于阈值μ1,则将由所述选中的函数f和对应的初始克隆函数候选集中的函数h所构成的函数对(h,f)加入最终的代码克隆检测结果中;

15、抽象语法树验证模块,用于依次计算所述选中的函数f与过滤后克隆函数候选集中各函数h′的抽象语法树级别的相似度;若相似度大于阈值μ2,则将由所述选中的函数f和对应的过滤后克隆函数候选集中的函数h′所构成的函数对(h′,f)加入最终的代码克隆检测结果中。

16、与现有技术相比,本发明至少具有如下优点:(1)本发明综合考虑了token和ast信息,这可以有效提高代码克隆检测的精确率和召回率,以应对不同层次和类型的代码克隆。这是因为token信息可以更准确地捕捉代码的细节,包括标识符、关键字和操作符等,提高了对词法相似性的敏感性,尤其是处理t1/t2类型的克隆。同时,ast提供了代码的语法结构信息,进一步提高了对代码相似性的感知,尤其是处理t3类型的克隆;(2)本发明通过引入倒排索引和递进式过滤操作,大大加快了代码克隆检测的速度和提高了处理大规模输入的能力。倒排索引通过以代码片段中若干连续行关键词建立索引,快速定位具有相似代码片段的函数,使得搜索空间大幅降低。同时,递进式过滤操作先利用执行速度更快、对计算资源需求更小的token级别相似度计算算法进行初步过滤,进一步减少了需要检查的候选函数。最后再利用时空复杂度较高的ast级别相似度计算算法进行最终验证,使得本发明所提出的检测方法兼备高效性和准确性。

本文地址:https://www.jishuxx.com/zhuanli/20240802/260952.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。