首页> 中国专利> 一种基于索引的Java软件代码克隆检测方法

一种基于索引的Java软件代码克隆检测方法

摘要

本发明公开了一种基于索引的Java软件代码克隆检测方法。本发明采用缓存代码段信息和内存索引比较相结合的策略,在克隆检测方法初启动时,预先将每个源文件的代码段信息存储在内存索引 和中,之后利用时间复杂度为的索引查找方法进行内存比较。该方法通过缓存代码段信息解决了传统方法每次运行克隆检测时都需要重建数据结构造成的低效率的问题,通过基于内存索引比较的方式有效解决了传统方法由于两两比较所带来的时间开销较大的问题。

著录项

  • 公开/公告号CN104572471A

    专利类型发明专利

  • 公开/公告日2015-04-29

    原文格式PDF

  • 申请/专利权人 杭州电子科技大学;

    申请/专利号CN201510043006.1

  • 发明设计人 俞东进;舒翔;陈真理;王杰;

    申请日2015-01-28

  • 分类号G06F11/36(20060101);G06F21/12(20130101);

  • 代理机构33100 浙江杭州金通专利事务所有限公司;

  • 代理人王佳健

  • 地址 310018 浙江省杭州市下沙高教园区2号大街

  • 入库时间 2023-12-18 08:25:28

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-10-03

    授权

    授权

  • 2015-05-27

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20150128

    实质审查的生效

  • 2015-04-29

    公开

    公开

说明书

技术领域

本发明属于程序理解技术领域,具体涉及到一种基于索引的Java软件代码克隆检测方法。

背景技术

软件工程领域的关注点之一是如何提高软件开发过程的开发效率和软件产品质量。在软件开发的整个周期中,软件维护占了其中大部分资源和时间,而软件维护中涉及读入源代码、扫描源代码和理解源代码所做的修改等工作又占了大部分的资源和时间。因此,要改善软件开发环境和提高软件产品质量,就必须重视软件维护,并给软件维护人员提供合适的理解程序的方法。

通过分析程序代码,挖掘出程序代码中出现的克隆现象,并借助克隆检测技术可以减少软件维护人员的工作量,提高软件维护过程的效率。例如,通过对软件代码的克隆情况进行检测,可以帮助开发人员和维护人员发现和修改软件系统中的bug。代码克隆检测技术也可以应用于代码抄袭检测、软件版本检测以及库函数重构。

然而,随着软件规模的不断增长,对克隆代码检测的效率要求也相应提高。例如,由于需要把由不同公司或者组织开发的上千万行的软件代码进行相似度的比较,如果不能在一个合适的时间范围内获取代码克隆将使检测方法的有效性大打折扣。

发明内容

本发明针对现有技术的不足,提供了一种基于索引的Java软件代码克隆检测方法。

本发明方法的具体步骤是:

步骤(1).在通用计算机上设置单独的键值数据库,用于存放全局代码段物理索引 和全局相似代码段物理索引,以及全局辅助物理索引,以上三个索引均为键值对结构;

步骤(2).以可用内存为限,依次读入Java软件中的源文件的源代码至通用计算机内存,通过词法分析将源代码中的每行语句解析为词项序列,再通过归一化操作将词项序列转换为字符序列表示,得到每个文件对应的“语句行号字符序列”键值对集合,读入文件的源代码的同时将“文件路径文件最新时间戳”键值对加入,其中文件路径为文件的全路径,包括文件名和扩展名;

步骤(3).遍历,将其中每隔行的字符序列作为一个代码段并计算该字符序列的代码段信息摘要,建立“文件路径代码段起始行,代码段终止行,代码段信息摘要”键值对并加入,建立“代码段信息摘要文件路径,代码段起始行,代码段终止行”键值对并加入,重复步骤(2)和(3)至软件中的所有源文件都已处理完毕;

步骤(4).在需要检测克隆代码的时候,从待检测的源文件集合中读入某个源文件的源代码至通用计算机内存,通过词法分析将源代码中的每行语句解析为词项序列,再通过归一化操作将词项序列转换为字符序列表示,得到每个文件对应的“语句行号字符序列”键值对集合,读入的同时建立“文件路径文件最新时间戳”键值对;

步骤(5).从中取出与源文件对应的文件时间戳,若,即源文件未被修改,则从中取得源文件的文件路径对应的值集合记为,转入步骤(8);否则,在中更新源文件对应的文件时间戳为,并遍历,将其中每隔行的字符序列作为一个代码段并计算该字符序列的代码段信息摘要,建立“文件路径代码段起始行,代码段终止行,代码段信息摘要”键值对集合,并将键值对集合中该文件路径对应的值部分加入临时值集合;

步骤(6).取出中与对应的值集合并记为,将和做差集运算得到新增的值集合;遍历,取出其中每个元素的代码段信息摘要,建立“代码段信息摘要文件路径,代码段起始行,代码段终止行”键值对并将其加入;

步骤(7).将和做差集运算得到过期的值集合,遍历,取出其中每个元素的代码段信息摘要,并在中找到对应的“代码段信息摘要文件路径,代码段起始行,代码段终止行”键值对将其删除,在中删除与文件路径对应的键值对,并将键值对集合合并至,记为;

步骤(8).遍历集合中的每个元素获取该元素的代码段信息摘要,在中查找和代码段信息摘要匹配的键,并获得该键对应的值集合,从中的每一个元素中可以获得源文件克隆代码段所在文件名、代码段起始行号和终止行号;

步骤(9).重复步骤(4)、(5)、(6)、(7)、(8),至待检测的源文件集合中的所有源文件都已处理完毕;

本发明所提供的基于索引的软件代码克隆检测方法由一组功能模块组成,它们包括:预处理模块、克隆检测模块和克隆报告模块。假设对于一般的检测过程,内存中已按步骤(1)、(2)和(3)建立全局代码段物理索引和全局相似代码段物理索引,以及全局辅助物理索引。

预处理模块以可用内存为限,依次读入待检测Java源文件集合中每个源文件的源代码,对源代码执行词法分析和归一化操作,得到每个源文件对应的“语句行号字符序列”键值对集合,同时建立“文件路径文件最新时间戳”键值对,更新全局辅助物理索引。

克隆检测模块判断待检测的文件是否被修改过,如未被修改则直接从全局代码段物理索引中获取相应文件路径对应的值集合,否则将预处理模块的输出“语句行号字符序列”键值对集合建立“文件路径代码段起始行号,代码段终止行号,代码段信息摘要”键值对并且更新全局代码段物理索引;建立“代码段信息摘要文件路径,代码段起始行号,代码段终止行号”键值对并更新全局相似代码段物理索引;从中获取相应文件路径的值集合,根据集合中每个元素信息摘要字段在更新后的全局相似代码段物理索引中查找对应键的值的集合即为克隆类集合。

克隆报告模块根据代码段的文件路径、代码段起始行号和代码段终止行号信息向用户展示克隆的两段代码所在的文件以及两段代码的起始和终止行号。

本发明提出的基于索引的Java软件代码克隆检测方法采用缓存代码段信息和内存索引比较相结合的策略,在克隆检测方法初启动时,预先将每个源文件的代码段信息存储在内存索引和中,之后利用时间复杂度为的索引查找方法进行内存比较。该方法通过缓存代码段信息解决了传统方法每次运行克隆检测时都需要重建数据结构造成的低效率的问题,通过基于内存索引比较的方式有效解决了传统方法由于两两比较所带来的时间开销较大的问题。

附图说明

图1基于索引的代码克隆检测方法框架图;

图2全局代码段物理索引示意;

图3全局相似代码段物理索引示意;

图4全局辅助物理索引示意。

具体实施方式

本发明所提供的基于索引的Java软件代码克隆检测方法的具体实施方式主要分3步(如图1所示):

(1)假设已按照步骤(1)、(2)和(3)在内存中建立、和。预处理阶段以可用内存为限,依次读入待检测源文件集合中每个源文件的源代码,对源代码进行词法分析和归一化操作,得到每个源文件对应的“语句行号字符序列”键值对集合,建立“文件路径文件最新时间戳”键值对并更新。(2)克隆检测阶段判断若待检测的文件未修改过,则直接从中获取相应文件的值集合,否则将“语句行号词项序列”键值对集合中每隔行语句作为一个代码段,并获取代码段所在文件的文件路径、代码段起始行号、代码段终止行号和代码段信息摘要四个字段建立“文件路径代码段起始行号,代码段终止行号, 代码段信息摘要”键值对,并更新,建立“代码段信息摘要文件路径, 代码段起始行号,代码段终止行号”键值对,并更新。接着,从中获取相应文件的值集合,根据集合中每个元素的代码段信息摘要字段在更新后的中查找对应的键的值集合即为克隆类集合。(3)克隆报告阶段根据代码段的文件路径、代码段起始行号和代码段终止行号信息向用户展示克隆的两段代码所在的文件以及两段代码的起始和终止行号。

为叙述方便,定义相关符号如下(、和结构分别如图2、图3和图4所示):

:键值对集合,键为文件路径,值为代码段起始行号、代码段终止行号和代码段信息摘要三个字段组成的记录集合。

:键值对集合,键为代码段信息摘要,值为文件路径、代码段起始行号和代码段终止行号三个字段组成的记录集合。

:键值对集合,键为文件路径,值为文件最新修改时间戳。

:文件的文件全路径,包括文件名和扩展名。

:代码段起始行号。

:代码段终止行号。

:代码段信息摘要。

:文件的最新时间戳。

(1)预处理阶段

第一步在通用计算机上设置单独的键值数据库,用于存放、和;第二步以可用内存为限,依次读入Java软件中的源文件的源代码至通用计算机内存,通过词法分析将源代码中的每行语句解析为词项序列,再通过归一化操作将词项序列转换为字符序列表示,转换规则如表1所示。

表1 转换规则

得到每个文件对应的“语句行号字符序列”键值对集合,读入文件的源代码的同时将键值对加入;第三步遍历,将其中每隔行的字符序列作为一个代码段并计算该字符序列的代码段信息摘要,建立键值对并加入,建立键值对并加入,重复第二步和第三步至软件中的所有源文件都已处理完毕。内存中建立、和后,在需要检测克隆代码时,从待检测的源文件集合中读入某个源文件的源代码至通用计算机内存,通过词法分析将源代码中的每行语句解析为词项序列,再通过归一化操作将词项序列根据表1所示的转换规则转换为字符序列表示,得到每个文件对应的“语句行号字符序列”键值对集合,读入的同时建立键值对。

(2)克隆检测阶段

从中取出与待检测源文件对应的文件时间戳,若,即待检测源文件未被修改,则从中取得源文件的文件路径对应的值集合记为,遍历集合中的每个元素获取该元素的代码段信息摘要,在中查找和代码段信息摘要匹配的键,并获得该键对应的值集合,集合即为具有相同的相似代码段集合。否则,在中更新源文件对应的文件时间戳为,并遍历,将其中每隔行的字符序列作为一个代码段并计算该字符序列的代码段信息摘要,建立键值对集合,并将键值对集合中该文件路径对应的值部分加入临时值集合;取出中与对应的值集合并记为,将和做差集运算得到新增的值集合;遍历,取出其中每个元素的代码段信息摘要,建立键值对并将其加入;将和做差集运算得到过期的值集合,遍历,取出其中每个元素的代码段信息摘要,并在中找到对应的键值对将其删除,在中删除与文件路径对应的键值对,并将键值对集合合并至,记为;遍历集合中的每个元素获取该元素的代码段信息摘要,在中查找和匹配的键,并获得该键对应的值集合,集合即为具有相同的相似代码段集合。

(3)克隆报告阶段

为了方便用户获知软件中的克隆检测情况,该阶段将克隆检测阶段产生的所有相似代码段集合中的元素还原为源代码中克隆代码段的位置。根据相似代码段集合中每个元素的、和字段来确定每个代码段的文件路径、代码段起始行号和代码段终止行号信息,向用户展示互为克隆的两段代码所在的文件以及两段代码的起始和终止行号。

本发明可用于大规模Java软件代码的克隆检测,以帮助软件开发和维护人员更加有效地管理软件代码。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号