一种基于子块过滤的分布式代码克隆检测与搜索方法、系统及介质技术方案

技术编号:26890315 阅读:20 留言:0更新日期:2020-12-29 16:06
本发明专利技术公开了一种基于子块过滤的分布式代码克隆检测与搜索方法、系统及介质,本发明专利技术方法包括对用户代码和代码库源代码分别分组并行进行预处理得到包含Token及其频率信息的中间文件;根据所有中间文件建立全局Token频率表;将代码库源代码的代码块利用全局Token频率表分组并行处理,建立索引得到索引库;利用子块过滤机制,从用户代码中提取出关键字查询索引库,得到用户代码的代码块所对应的候选集;针对用户代码中的每一个代码块,计算该代码块与其对应的候选集中的每一个候选代码块之间的相似度,若相似度超过预设则判定为克隆对。本发明专利技术具有检测语言无关的特性,检测和搜索效率高,适用于大规模代码的克隆检测及搜索,支持用户查询代码。

【技术实现步骤摘要】
一种基于子块过滤的分布式代码克隆检测与搜索方法、系统及介质
本专利技术涉及分布式计算、以及代码克隆检测与搜索
,具体涉及一种基于子块过滤的分布式代码克隆检测与搜索方法、系统及介质。
技术介绍
代码克隆是指将一个软件中的一段代码,直接复制或进行少量修改后,使用到其他软件中,作为后者代码的组成部分。代码克隆产生的原因有很多,主要的来源是开发人员为了降低工作量而进行的克隆,包括对已有的代码片段进行复制和修改,使用现成的开发框架设计模式等。代码克隆非常普遍,现今的代码片段中有5%到20%都包含复制或经过少量修改的克隆代码。高质量开源软件中的代码复用情况更为普遍,超过50%的代码被复用过。各种软件中使用开源组件的情况也很常见。2020年,Synopsys网络安全研究中心对17个行业中超过1250个商业代码库中的匿名数据进行了开源组件的复用分析和审计,涵盖大数据、企业软件、航空航天、生命科学、医疗保健、金融服务和金融科技、互联网和移动应用等行业。审计结果显示,被审计的代码库中,99%的被扫描代码存在开源组件,有9个在行业的代码库100%包含开源组件。大型软件的代码组成代码复用的现象也十分明显。代码克隆检测作为一个重要的软件工程领域,旨在自动化地检测一个或多个代码库中功能上等效的代码块或者代码段集合。正是因为存在如此高比例的代码复用,使得代码克隆检测在软件度量、剽窃检测、关注点挖掘、版权侵权检测、软件版本追踪、代码压缩、病毒检测等领域具有广泛而重要的用途。这其中,对于大规模代码的克隆检测应用领域较多,包括剽窃检测、在大型软件库中搜索相似代码段、软件脆弱性分析、新型API的挖掘、API推荐、开源社区软件的克隆关系等。代码克隆类型众多,目前Bellon等人提出的分类方法被广泛采用。该方法基于代码块之间相似性,按照克隆代码与原代码在词法、语法及语义层面上的区别,将代码克隆分成了以下4个级别:Type-1,克隆代码与原代码之间除了注释与空白之外,没有任何差异;Type-2,克隆代码与原代码之间除了注释与空白之外,只有变量名,变量类型和函数名等存在差别;Type-3,克隆代码与原代码之间的差别在Type-2的基础上,还包括少量语句的增删和修改;Type-4,克隆代码与原代码在词法和语法上不相似,但具有相同的功能,仅在语义上相似。从Type-1到Type-4,克隆代码检测的难度越来越高。目前,国内外学者提出了多种克隆检测方法,并基于此开发了众多的克隆检测工具。对于克隆检测来说,选取的代码特征将影响克隆检测的类型和性能。根据对源代码信息的利用层次及选取的对应特征的不同,上述方法可分为基于文本、基于标记(Token)、基于语法和基于语义四个类型。随着软件规模的迅速膨胀,针对大规模代码的克隆检测得到了广泛关注。已有的多种克隆检测工具,在大规模代码克隆检测效率等效果上存在不足。此外,相关研究表明,在软件开发过程中,开发人员会进行高频率的代码搜索操作。当前的代码搜索工具,如GoogleCodeSearch等,所能提供的检测等级较低,无法处理相似代码的检索及推荐。因此,提供一种快速的代码搜索功能是很有必要的。
技术实现思路
本专利技术要解决的技术问题:针对现有技术的上述问题,提供一种基于子块过滤的分布式代码克隆检测与搜索方法、系统及介质,本专利技术具有检测语言无关的特性,检测和搜索效率高,适用于大规模代码的克隆检测及搜索,支持用户查询代码。为了解决上述技术问题,本专利技术采用的技术方案为:一种基于子块过滤的分布式代码克隆检测与搜索方法,包括:1)对用户代码和代码库源代码分别分组并行进行预加工、分块为代码块转换Token并统计Token的频率,得到包含Token及其频率信息的中间文件;2)根据所有中间文件中的Token及其频率信息并行统计汇总建立全局Token频率表;3)将代码库源代码的代码块利用全局Token频率表分组并行处理,建立索引得到索引库;4)利用子块过滤机制,从用户代码中提取出关键字查询索引库,得到用户代码的代码块所对应的候选集;5)针对用户代码中的每一个代码块,计算该代码块与其对应的候选集中的每一个候选代码块之间的相似度,若相似度超过预设则判定该代码块、候选代码块对为克隆对。可选地,步骤1)中分组进行预加工、分块为代码块转换Token并统计Token的频率的步骤包括:1.1)将源文件进行分组得到多个源文件分组,分别将每个源文件分组输入到一个映射器Mapper中;1.2)通过映射器Mapper对输入的源文件分组依次进行下述处理:扫描预加工,所述扫描预加工包括去除注释、删除空格、制表符、换行符、标识符、变量重命名、字符串常量和函数调用替换中的至少一种操作;按照指定的函数级或文件级等分块粒度对源代码进行分块为代码块,并对代码块进行编号;利用词法分析工具对完成分块的源文件分组进行词法分析,并转换成Token序列;统计该源文件分组中各个Token的频率并表示为频率二元组<Token,频率>,将该源文件分组中所有Token的频率二元组输出到中间文件。可选地,步骤1.1)的步骤包括将所有源文件的文件路径写入一个路径文件,再对路径文件进行划分得到多个分组,分别将每个分组输入到一个映射器Mapper中,使得每一个一个映射器Mapper根据路径读取多个源文件。可选地,步骤2)的步骤包括:2.1)将用户代码和代码库源代码得到的所有中间文件进行分片得到中间文件分片,分别将每个中间文件分片输入到一个映射器Mapper中;2.2)通过映射器Mapper对输入的中间文件分片依次进行下述处理:首先统计该中间文件分片中各个Token的频率得到<Token,频率>键值对;然后按照对Token进行排序和汇总,相同的Token会被合并到一个新的键值对<Token,频率>中;2.3)读取合并后的键值对<Token,频率>,求和得出每个Token的总频率形成全局Token频率表,所述全局Token频率表包括每个Token及其总频率。可选地,步骤3)的步骤包括:3.1)将代码库源代码的代码块进行分组得到代码块分组,分别将每个代码块分组输入到一个映射器Mapper中;3.2)通过映射器Mapper对输入的代码块分组依次进行下述处理:首先根据全局Token频率表对输入该映射器Mapper中的代码块分组的所有Token序列进行排序,高频Token排在Token序列尾端,低频Token排在Token序列头部;然后根据设定的相似度阈值s和代码块分组中各个代码块的Token序列的长度L计算出乘积L*s,并将前L*s个Token组成的序列作为该代码块对应的子块;最后将子块中的每个Token作为键、整个代码块作为值,输出键值对;3.3)将汇总所有的键值对,存储到索引库中,所述索引库中的索引为一个个Token,其对应的值为以这个Token为索引的所有代码块组成的链表。可选地,步骤4)的步骤包括:...

【技术保护点】
1.一种基于子块过滤的分布式代码克隆检测与搜索方法,其特征在于,包括:/n1)对用户代码和代码库源代码分别分组并行进行预加工、分块为代码块转换Token并统计Token的频率,得到包含Token及其频率信息的中间文件;/n2)根据所有中间文件中的Token及其频率信息并行统计汇总建立全局Token频率表;/n3)将代码库源代码的代码块利用全局Token频率表分组并行处理,建立索引得到索引库;/n4)利用子块过滤机制,从用户代码中提取出关键字查询索引库,得到用户代码的代码块所对应的候选集;/n5)针对用户代码中的每一个代码块,计算该代码块与其对应的候选集中的每一个候选代码块之间的相似度,若相似度超过预设则判定该代码块、候选代码块对为克隆对。/n

【技术特征摘要】
1.一种基于子块过滤的分布式代码克隆检测与搜索方法,其特征在于,包括:
1)对用户代码和代码库源代码分别分组并行进行预加工、分块为代码块转换Token并统计Token的频率,得到包含Token及其频率信息的中间文件;
2)根据所有中间文件中的Token及其频率信息并行统计汇总建立全局Token频率表;
3)将代码库源代码的代码块利用全局Token频率表分组并行处理,建立索引得到索引库;
4)利用子块过滤机制,从用户代码中提取出关键字查询索引库,得到用户代码的代码块所对应的候选集;
5)针对用户代码中的每一个代码块,计算该代码块与其对应的候选集中的每一个候选代码块之间的相似度,若相似度超过预设则判定该代码块、候选代码块对为克隆对。


2.根据权利要求1所述的基于子块过滤的分布式代码克隆检测与搜索方法,其特征在于,步骤1)中分组进行预加工、分块为代码块转换Token并统计Token的频率的步骤包括:
1.1)将源文件进行分组得到多个源文件分组,分别将每个源文件分组输入到一个映射器Mapper中;
1.2)通过映射器Mapper对输入的源文件分组依次进行下述处理:扫描预加工,所述扫描预加工包括去除注释、删除空格、制表符、换行符、标识符、变量重命名、字符串常量和函数调用替换中的至少一种操作;按照指定的函数级或文件级等分块粒度对源代码进行分块为代码块,并对代码块进行编号;利用词法分析工具对完成分块的源文件分组进行词法分析,并转换成Token序列;统计该源文件分组中各个Token的频率并表示为频率二元组<Token,频率>,将该源文件分组中所有Token的频率二元组输出到中间文件。


3.根据权利要求2所述的基于子块过滤的分布式代码克隆检测与搜索方法,其特征在于,步骤1.1)的步骤包括将所有源文件的文件路径写入一个路径文件,再对路径文件进行划分得到多个分组,分别将每个分组输入到一个映射器Mapper中,使得每一个一个映射器Mapper根据路径读取多个源文件。


4.根据权利要求1所述的基于子块过滤的分布式代码克隆检测与搜索方法,其特征在于,步骤2)的步骤包括:
2.1)将用户代码和代码库源代码得到的所有中间文件进行分片得到中间文件分片,分别将每个中间文件分片输入到一个映射器Mapper中;
2.2)通过映射器Mapper对输入的中间文件分片依次进行下述处理:首先统计该中间文件分片中各个Token的频率得到<Token,频率>键值对;然后按照对Token进行排序和汇总,相同的Token会被合并到一个新的键值对<Token,频率>中;
2.3)读取合并后的键值对<Token,频率>,求和得出每个Token的总频率形成全局Token频率表,所述全局Token频率表包括每个Token及其总频率。


5.根据权利要求1所述的基于子块过滤的分布式代码克隆检测与搜索方法,其特征在于,步骤3)的步骤包括:
3.1)将代码库源代码的代码块进行分组得到代码块分组,分别将每个代码块分组输入到一个映射器Mapper中;
3.2)通过映射器Mapper对输入的代码块分组依次进行下述处理:首先根据全局Token频率表对输入该映射器...

【专利技术属性】
技术研发人员:任怡杨立明谭郁松汪哲李宝阳国贵黄辰林魏旭鹏周洁陈梓榕王瑞董攀张建锋王晓川丁滟谭霜蹇松雷
申请(专利权)人:中国人民解放军国防科技大学
类型:发明
国别省市:湖南;43

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

1