1.一种基于索引的Java软件代码克隆检测方法,其特征在于该方法的具体步骤是:步骤(1).在通用计算机上设置单独的键值数据库,用于存放全局代码段物理索引 和全局相似代码段物理索引 ,以及全局辅助物理索引 ,以上三个索引均为键值对结构;
步骤(2).以可用内存为限,依次读入Java软件中的源文件 的源代码至通用计算机内存,通过词法分析将源代码中的每行语句解析为词项序列,再通过归一化操作将词项序列转换为字符序列表示,得到每个文件 对应的“语句行号 字符序列”键值对集合,读入文件 的源代码的同时将“文件路径 文件最新时间戳”键值对加入 ,其中文件路径 为文件 的全路径,包括文件名和扩展名;
步骤(3).遍历 ,将其中每隔 行的字符序列作为一个代码段并计算该字符序列的代码段信息摘要 ,建立“文件路径 代码段起始行,代码段终止行,代码段信息摘要 ”键值对并加入 ,建立“代码段信息摘要 文件路径 ,代码段起始行,代码段终止行”键值对并加入 ,重复步骤(2)和(3)至软件中的所有源文件都已处理完毕;
步骤(4).在需要检测克隆代码的时候,从待检测的源文件集合中读入某个源文件的源代码至通用计算机内存,通过词法分析将源代码中的每行语句解析为词项序列,再通过归一化操作将词项序列转换为字符序列表示,得到每个文件 对应的“语句行号 字符序列”键值对集合 ,读入 的同时建立“文件路径 文件最新时间戳 ”键值对;
步骤(5).从 中取出与源文件 对应的文件时间戳 ,若 ,即源文件未被修改,则从 中取得源文件 的文件路径 对应的值集合记为 ,转入步骤(8);否则,在 中更新源文件 对应的文件时间戳为 ,并遍历 ,将其中每隔 行的字符序列作为一个代码段并计算该字符序列的代码段信息摘要 ,建立“文件路径 代码段起始行,代码段终止行,代码段信息摘要 ”键值对集合 ,并将键值对集合 中该文件路径 对应的值部分加入临时值集合 ;
步骤(6).取出 中与 对应的值集合并记为 ,将 和 做差集运算得到新增的值集合 ;遍历 ,取出其中每个元素的代码段信息摘要 ,建立“代码段信息摘要 文件路径 ,代码段起始行,代码段终止行”键值对并将其加入;
步骤(7).将 和 做差集运算得到过期的值集合 ,遍历 ,取出其中每个元素的代码段信息摘要 ,并在 中找到对应的“代码段信息摘要 文件路径,代码段起始行,代码段终止行”键值对将其删除,在 中删除与文件路径 对应的键值对,并将键值对集合 合并至 ,记 为 ;
步骤(8).遍历集合 中的每个元素获取该元素的代码段信息摘要 ,在 中查找和代码段信息摘要 匹配的键,并获得该键对应的值集合 ,从 中的每一个元素中可以获得源文件 克隆代码段所在文件名、代码段起始行号和终止行号;
步骤(9).重复步骤(4)、(5)、(6)、(7)、(8),至待检测的源文件集合中的所有源文件都已处理完毕。