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

文档序号:8258351阅读:297来源:国知局
一种基于索引的Java软件代码克隆检测方法
【技术领域】
[0001] 本发明属于程序理解技术领域,具体涉及到一种基于索引的Java软件代码克隆 检测方法。
【背景技术】
[0002] 软件工程领域的关注点之一是如何提高软件开发过程的开发效率和软件产品质 量。在软件开发的整个周期中,软件维护占了其中大部分资源和时间,而软件维护中涉及读 入源代码、扫描源代码和理解源代码所做的修改等工作又占了大部分的资源和时间。因此, 要改善软件开发环境和提高软件产品质量,就必须重视软件维护,并给软件维护人员提供 合适的理解程序的方法。
[0003] 通过分析程序代码,挖掘出程序代码中出现的克隆现象,并借助克隆检测技术可 以减少软件维护人员的工作量,提高软件维护过程的效率。例如,通过对软件代码的克隆情 况进行检测,可以帮助开发人员和维护人员发现和修改软件系统中的bug。代码克隆检测技 术也可以应用于代码抄袭检测、软件版本检测以及库函数重构。
[0004] 然而,随着软件规模的不断增长,对克隆代码检测的效率要求也相应提高。例如, 由于需要把由不同公司或者组织开发的上千万行的软件代码进行相似度的比较,如果不能 在一个合适的时间范围内获取代码克隆将使检测方法的有效性大打折扣。

【发明内容】

[0005] 本发明针对现有技术的不足,提供了一种基于索引的Java软件代码克隆检测方 法。
[0006] 本发明方法的具体步骤是: 步骤(1).在通用计算机上设置单独的键值数据库,用于存放全局代码段物理索引 Si;和全局相似代码段物理索引,以及全局辅助物理索引,以上三个索引均为键值 对结构; 步骤(2).以可用内存为限,依次读入Java软件中的源文件/的源代码至通用计算机 内存,通过词法分析将源代码中的每行语句解析为词项序列,再通过归一化操作将词项序 列转换为字符序列表示,得到每个文件/对应的"语句行号4字符序列"键值对集合 ,读入文件f的源代码的同时将"文件路径4文件最新时间戳"键值对加入5J,其中 文件路径为文件/的全路径,包括文件名和扩展名; 步骤(3).遍历将其中每隔£行的字符序列作为一个代码段并计算该字符序列 的代码段信息摘要sA ,建立"文件路径』*^ ^代码段起始行,代码段终止行,代码段信息 摘要sA "键值对并加入^i,建立"代码段信息摘要4文件路径乃G ,代码段起始行,代 码段终止行"键值对并加入,重复步骤(2)和(3)至软件中的所有源文件都已处理完毕; 步骤(4).在需要检测克隆代码的时候,从待检测的源文件集合中读入某个源文件/ 的源代码至通用计算机内存,通过词法分析将源代码中的每行语句解析为词项序列,再通 过归一化操作将词项序列转换为字符序列表示,得到每个文件/对应的"语句行号4字符 序列"键值对集合读入f的同时建立"文件路径4文件最新时间戳"键值 对; 步骤(5).从5J中取出与源文件f对应的文件时间戳,若^ = ^^2,即源文件/ 未被修改,则从中取得源文件/的文件路径乃匕对应的值集合记为^,转入步骤(8);否 贝U,在5T中更新源文件f对应的文件时间戳为'%,并遍历,即,,将其中每隔£行的字符 序列作为一个代码段并计算该字符序列的代码段信息摘要,建立"文件路径4代 码段起始行,代码段终止行,代码段信息摘要5* "键值对集合,并将键值对集合中 该文件路径对应的值部分加入临时值集合FaJuA ; 步骤(6) ?取出中与iW,对应的值集合并记为,将和1731£^做差集运 算得到新增的值集合;遍历FaJUea,取出其中每个元素的代码段信息摘要^,建立 "代码段信息摘要i 4文件路径At,代码段起始行,代码段终止行"键值对并将其加入 GI,; 步骤(7).将FaJue2和^^/%做差集运算得到过期的值集合,遍历,取出 其中每个元素的代码段信息摘要5^,并在中找到对应的"代码段信息摘要4文件路径 At,代码段起始行,代码段终止行"键值对将其删除,在Ci;中删除与文件路径对应的 键值对,并将键值对集合合并至.S',记为$ ; 步骤(8).遍历集合s'中的每个元素获取该元素的代码段信息摘要在中查找 和代码段信息摘要sA匹配的键,并获得该键对应的值集合r,从C1中的每一个元素中可以 获得源文件/克隆代码段所在文件名、代码段起始行号和终止行号; 步骤(9).重复步骤(4)、(5)、(6)、(7)、(8),至待检测的源文件集合中的所有源文件都 已处理完毕; 本发明所提供的基于索引的软件代码克隆检测方法由一组功能模块组成,它们包括: 预处理模块、克隆检测模块和克隆报告模块。假设对于一般的检测过程,内存中已按步骤 (1)、(2)和(3)建立全局代码段物理索引£?i;和全局相似代码段物理索引,以及全局辅 助物理索引SJ。
[0007] 预处理模块以可用内存为限,依次读入待检测Java源文件集合中每个源文件的 源代码,对源代码执行词法分析和归一化操作,得到每个源文件对应的"语句行号-字符 序列"键值对集合,同时建立"文件路径^文件最新时间戳"键值对,更新全局辅助物理索 引SJ。
[0008] 克隆检测模块判断待检测的文件是否被修改过,如未被修改则直接从全局代码段 物理索引Ci;中获取相应文件路径对应的值集合,否则将预处理模块的输出"语句行号^ 字符序列"键值对集合建立"文件路径4代码段起始行号,代码段终止行号,代码段信息摘 要"键值对并且更新全局代码段物理索引;建立"代码段信息摘要4文件路径,代码段 起始行号,代码段终止行号"键值对并更新全局相似代码段物理索引中获取相 应文件路径的值集合,根据集合中每个元素信息摘要字段在更新后的全局相似代码段物理 索引中查找对应键的值的集合即为克隆类集合。
[0009] 克隆报告模块根据代码段的文件路径、代码段起始行号和代码段终止行号信息向 用户展示克隆的两段代码所在的文件以及两段代码的起始和终止行号。
[0010] 本发明提出的基于索引的Java软件代码克隆检测方法采用缓存代码段信息和内 存索引比较相结合的策略,在克隆检测方法初启动时,预先将每个源文件的代码段信息存 储在内存索引^^和^七中,之后利用时间复杂度为汉1)的索引查找方法进行内存比较。该 方法通过缓存代码段信息解决了传统方法每次运行克隆检测时都需要重建数据结构造成 的低效率的问题,通过基于内存索引比较的方式有效解决了传统方法由于两两比较所带来 的时间开销较大的问题。
【附图说明】
[0011] 图1基于索引的代码克隆检测方法框架图; 图2全局代码段物理索引示意; 图3全局相似代码段物理索引示意
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1