CN104572471A - 一种基于索引的Java软件代码克隆检测方法 - Google Patents
一种基于索引的Java软件代码克隆检测方法 Download PDFInfo
- Publication number
- CN104572471A CN104572471A CN201510043006.1A CN201510043006A CN104572471A CN 104572471 A CN104572471 A CN 104572471A CN 201510043006 A CN201510043006 A CN 201510043006A CN 104572471 A CN104572471 A CN 104572471A
- Authority
- CN
- China
- Prior art keywords
- code segment
- key
- file
- code
- value pair
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Devices For Executing Special Programs (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于索引的Java软件代码克隆检测方法。本发明采用缓存代码段信息和内存索引比较相结合的策略,在克隆检测方法初启动时,预先将每个源文件的代码段信息存储在内存索引 和中,之后利用时间复杂度为的索引查找方法进行内存比较。该方法通过缓存代码段信息解决了传统方法每次运行克隆检测时都需要重建数据结构造成的低效率的问题,通过基于内存索引比较的方式有效解决了传统方法由于两两比较所带来的时间开销较大的问题。
Description
技术领域
本发明属于程序理解技术领域,具体涉及到一种基于索引的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软件代码的克隆检测,以帮助软件开发和维护人员更加有效地管理软件代码。
Claims (1)
1.一种基于索引的Java软件代码克隆检测方法,其特征在于该方法的具体步骤是:
步骤(1).在通用计算机上设置单独的键值数据库,用于存放全局代码段物理索引
和全局相似代码段物理索引,以及全局辅助物理索引,以上三个索引均为键值对结构;
步骤(2).以可用内存为限,依次读入Java软件中的源文件的源代码至通用计算机内存,通过词法分析将源代码中的每行语句解析为词项序列,再通过归一化操作将词项序列转换为字符序列表示,得到每个文件对应的“语句行号字符序列”键值对集合,读入文件的源代码的同时将“文件路径 文件最新时间戳”键值对加入,其中文件路径为文件的全路径,包括文件名和扩展名;
步骤(3).遍历,将其中每隔行的字符序列作为一个代码段并计算该字符序列的代码段信息摘要,建立“文件路径 代码段起始行,代码段终止行,代码段信息摘要”键值对并加入,建立“代码段信息摘要 文件路径,代码段起始行,代码段终止行”键值对并加入,重复步骤(2)和(3)至软件中的所有源文件都已处理完毕;
步骤(4).在需要检测克隆代码的时候,从待检测的源文件集合中读入某个源文件的源代码至通用计算机内存,通过词法分析将源代码中的每行语句解析为词项序列,再通过归一化操作将词项序列转换为字符序列表示,得到每个文件对应的“语句行号字符序列”键值对集合,读入的同时建立“文件路径 文件最新时间戳”键值对;
步骤(5).从中取出与源文件对应的文件时间戳,若 ,即源文件未被修改,则从中取得源文件的文件路径对应的值集合记为,转入步骤(8);否则,在中更新源文件对应的文件时间戳为,并遍历,将其中每隔行的字符序列作为一个代码段并计算该字符序列的代码段信息摘要,建立“文件路径 代码段起始行,代码段终止行,代码段信息摘要”键值对集合,并将键值对集合中该文件路径对应的值部分加入临时值集合;
步骤(6).取出中与对应的值集合并记为,将和做差集运算得到新增的值集合;遍历,取出其中每个元素的代码段信息摘要,建立“代码段信息摘要 文件路径,代码段起始行,代码段终止行”键值对并将其加入;
步骤(7).将和做差集运算得到过期的值集合,遍历,取出其中每个元素的代码段信息摘要,并在中找到对应的“代码段信息摘要文件路径,代码段起始行,代码段终止行”键值对将其删除,在中删除与文件路径对应的键值对,并将键值对集合合并至,记为;
步骤(8).遍历集合中的每个元素获取该元素的代码段信息摘要,在中查找和代码段信息摘要匹配的键,并获得该键对应的值集合,从中的每一个元素中可以获得源文件克隆代码段所在文件名、代码段起始行号和终止行号;
步骤(9).重复步骤(4)、(5)、(6)、(7)、(8),至待检测的源文件集合中的所有源文件都已处理完毕。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510043006.1A CN104572471B (zh) | 2015-01-28 | 2015-01-28 | 一种基于索引的Java软件代码克隆检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510043006.1A CN104572471B (zh) | 2015-01-28 | 2015-01-28 | 一种基于索引的Java软件代码克隆检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104572471A true CN104572471A (zh) | 2015-04-29 |
CN104572471B CN104572471B (zh) | 2017-10-03 |
Family
ID=53088603
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510043006.1A Active CN104572471B (zh) | 2015-01-28 | 2015-01-28 | 一种基于索引的Java软件代码克隆检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104572471B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106294139A (zh) * | 2016-08-02 | 2017-01-04 | 上海理工大学 | 一种软件代码中重复片段的检测提取方法 |
CN106919403A (zh) * | 2017-03-16 | 2017-07-04 | 杭州承方信息科技有限公司 | 云环境下基于Java字节码的多粒度代码克隆检测方法 |
CN107066262A (zh) * | 2017-03-10 | 2017-08-18 | 苏州棱镜七彩信息科技有限公司 | 源代码文件克隆邻接表合并检测方法 |
CN109976806A (zh) * | 2019-01-03 | 2019-07-05 | 杭州电子科技大学 | 基于字节码序列匹配的Java语句块克隆检测方法 |
CN111078540A (zh) * | 2019-11-29 | 2020-04-28 | 四川九洲空管科技有限责任公司 | 基于qt开发通用航空飞行服务软件内存异常检测定位方法 |
CN111240740A (zh) * | 2020-01-23 | 2020-06-05 | 复旦大学 | 基于演化历史分析的代码克隆危害性评估方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2012079230A1 (en) * | 2010-12-15 | 2012-06-21 | Microsoft Corporation | Intelligent code differencing using code clone detection |
CN103729580A (zh) * | 2014-01-27 | 2014-04-16 | 国家电网公司 | 一种检测软件抄袭的方法和装置 |
-
2015
- 2015-01-28 CN CN201510043006.1A patent/CN104572471B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2012079230A1 (en) * | 2010-12-15 | 2012-06-21 | Microsoft Corporation | Intelligent code differencing using code clone detection |
CN103729580A (zh) * | 2014-01-27 | 2014-04-16 | 国家电网公司 | 一种检测软件抄袭的方法和装置 |
Non-Patent Citations (1)
Title |
---|
梁正平等: "软件克隆检测技术研究", 《计算机应用研究》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106294139A (zh) * | 2016-08-02 | 2017-01-04 | 上海理工大学 | 一种软件代码中重复片段的检测提取方法 |
CN106294139B (zh) * | 2016-08-02 | 2018-08-31 | 上海理工大学 | 一种软件代码中重复片段的检测提取方法 |
CN107066262A (zh) * | 2017-03-10 | 2017-08-18 | 苏州棱镜七彩信息科技有限公司 | 源代码文件克隆邻接表合并检测方法 |
CN106919403A (zh) * | 2017-03-16 | 2017-07-04 | 杭州承方信息科技有限公司 | 云环境下基于Java字节码的多粒度代码克隆检测方法 |
CN106919403B (zh) * | 2017-03-16 | 2019-12-13 | 杭州鹿径科技有限公司 | 云环境下基于Java字节码的多粒度代码克隆检测方法 |
CN109976806A (zh) * | 2019-01-03 | 2019-07-05 | 杭州电子科技大学 | 基于字节码序列匹配的Java语句块克隆检测方法 |
CN109976806B (zh) * | 2019-01-03 | 2022-06-14 | 杭州电子科技大学 | 基于字节码序列匹配的Java语句块克隆检测方法 |
CN111078540A (zh) * | 2019-11-29 | 2020-04-28 | 四川九洲空管科技有限责任公司 | 基于qt开发通用航空飞行服务软件内存异常检测定位方法 |
CN111240740A (zh) * | 2020-01-23 | 2020-06-05 | 复旦大学 | 基于演化历史分析的代码克隆危害性评估方法 |
CN111240740B (zh) * | 2020-01-23 | 2021-09-17 | 复旦大学 | 基于演化历史分析的代码克隆危害性评估方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104572471B (zh) | 2017-10-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104572471A (zh) | 一种基于索引的Java软件代码克隆检测方法 | |
US11361013B2 (en) | System for organizing and fast searching of massive amounts of data | |
Ray et al. | The uniqueness of changes: Characteristics and applications | |
CN104866580A (zh) | 一种数据库变更对现有业务影响的快速侦测方法 | |
US11599539B2 (en) | Column lineage and metadata propagation | |
CN103020494B (zh) | 一种利用程序代码编程模式著作权归属检测模型检测著作权归属的方法 | |
CN104965735A (zh) | 用于生成升级sql脚本的装置 | |
US20140358492A1 (en) | Systems and methods for synchronizing geographic information system (gis) network models | |
CN103473409A (zh) | 一种基于知识库的fpga故障自动诊断方法 | |
CN101499063A (zh) | 基于跟踪的数据库模式演进方法及系统 | |
CN104915262A (zh) | 一种基于excel数据结构的校验系统及其方法 | |
Taelman et al. | Triple storage for random-access versioned querying of RDF archives | |
Mostajabi et al. | A Systematic Review of Data Models for the Big Data Problem | |
WO2023279684A1 (zh) | 一种基于命名规则和缓存机制的知识图谱构建的操作方法 | |
Cheng et al. | Rule-directed code clone synchronization | |
CN104636401A (zh) | 一种scada系统数据回滚的方法及装置 | |
Wei et al. | Loggrep: Fast and cheap cloud log storage by exploiting both static and runtime patterns | |
CN115373889A (zh) | 数据同步中的数据比对校验及数据修复的方法及装置 | |
CN105487912A (zh) | 公共问题修改多分支维护系统及方法 | |
CN104572802A (zh) | 用于加载具有复杂关系的数据的方法和系统 | |
Huang et al. | Ymir: A rapid data-centric development platform for vision applications | |
CN114461454A (zh) | 数据恢复方法、装置、存储介质及电子设备 | |
Lu et al. | Assessment of urban water supply system based on query optimization strategy | |
Zada et al. | Large-scale Data Integration Using Graph Probabilistic Dependencies (GPDs) | |
Ma et al. | Live data migration approach from relational tables to schema-free collections with mapreduce |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
EE01 | Entry into force of recordation of patent licensing contract | ||
EE01 | Entry into force of recordation of patent licensing contract |
Application publication date: 20150429 Assignee: Hangzhou Zhimai Technology Co.,Ltd. Assignor: HANGZHOU DIANZI University Contract record no.: X2020330000125 Denomination of invention: An index based method for detecting Java software code clone Granted publication date: 20171003 License type: Common License Record date: 20201230 |