文献阅读笔记 # 面向大规模多版本软件系统的代码克隆检测加速技术

news/2024/4/26 1:58:58/文章来源:https://blog.csdn.net/qq_33583069/article/details/129238757
  • 面向大规模多版本软件系统的代码克隆检测加速技术,方维康 吴毅坚 赵文耘,《计算机应用与软件》复旦大学软件学院、复旦大学上海市数据科学重点实验室
  • 2022 April

面向大规模多版本软件系统的代码克隆检测加速技术

摘要

很多代码克隆检测方法主要针对软件系统的单个版本进行检测,在多版本情况下效率较低。本文提出一种针对多版本软件系统的克隆检测加速技术,可以快速得到每个版本的克隆情况。

通过版本间方法映射技术为不同版本代码内容高度相似的同一方法构建方法版本组,选取每个方法版本组中最早的版本作为样本方法,样本方法的集合构成历史映像,对历史映像进行克隆检测,同时建立样本方法和方法版本组间的方法索引。根据历史映像克隆检测结果及方法索引恢复原始的全量克隆关系。

结论:与文本对比方法提速4倍。
这里的多版本不是组件的多版本…是指被测软件具有多个版本…!!
ps:本文加速的重点不是克隆检测本身,而是如何处理多版本之间的重复代码,标记重复代码、减少查询量,去重后的集合叫历史映像

0 引言

  • 代码克隆普遍存在,代码克隆与程序的缺陷率、软件稳定性、软件质量、软件维护成本存在关联;
  • 传统的代码克隆检测在多版本时对每个版本挨个比较,计算量较大,没有充分利用同项目多版本之间的信息(版本更新变化的代码量只占总代码量中的小部分);

本文方法:方法版本组 => 样本方法 => 历史映像 => 克隆检测 => 版本恢复
关键技术:

  • 1.如何快速分析出系统所有版本中的每个方法;
  • 2.基于局部相似性比较在前后版本快速建立演化关系;
  • 3.基于索引快速恢复所有克隆关系;

1 代码克隆

Ⅰ型克隆: 除去空白符和注释之外完全一样的代码片段;
Ⅱ型克隆: 除了空白符、注释、标识符、类型和字面值有可能不同之外,语法结构上完全一致的代码片段;
Ⅲ型克隆:除了空白符、注释、标识符、类型和字面值有可能不同之外,还有可能添加、修改或删除了一些代码行的代码片段;
Ⅳ型克隆: 功能上一致但代码本身相似度较低的代码片段(语义级克隆);

  • 从Ⅰ型克隆到 Ⅲ 型克隆,克隆片段之间的语法相似度逐渐降低。Ⅳ 型在语法级别相似度已经很低。

  • 克隆对:存在克隆关系的两个代码片段被称为一组克隆对;
  • 克隆组(类):一组存在克隆关系的代码片段被称为克隆组;
  • 克隆实例:克隆对或克隆组中的每一个代码片段都称为一个克隆实例;
  • 方法级克隆:如果两个或多个方法是彼此克隆的,则将这种克隆称为方法级克隆。方法级克隆的克隆实例是完整的方法(即函数级克隆);

代码克隆检测基本思路:基于文本、基于 token、基于程序依赖图、基于抽象语法树、基于代码底层表示等;

  • 但上面的方法里,在大规模克隆检测(亿行级),只有 SourcererCC 和 SAGA 表现相对还行。
  • 考虑多版本的克隆检测:
    • 比如分析一个多版本项目的克隆演化图谱时,只分析目标项目最初版本的克隆检测结果,然后再用版本管理工具的修改信息追踪克隆;缺点:丢失最初版本后续版本的所有克隆(检测不出);【?为啥会检测不出,这个和增量克隆检测有啥区别
    • 增量克隆检测:缺点:不适用于跨项目克隆检测。【和上面有啥区别?跨项目是指最开始检测出的克隆组件结果里面根据增量在这个组件结果集合里去定位克隆部分,而不去查引入的新组件么?那如果放到所有组件库里去查不行吗?

本文相比增量检测,相当于是对增量也做了压缩,没有扫全部的增量,而是扫低于阈值的增量,对于轻微修改某函数是不会额外去检测的,但对于新创建的函数或者大幅修改逻辑会重新扫

2 基于版本间代码压缩的多版本克隆检测加速技术

2.1 项目信息预处理

目标项目集:所有待检测的项目的集合

  • 对目标项目进行预处理,括项目版本信息提取和项目方法信息提取
    • 版本信息提取:该项目所有发布版本的相关信息,包括每个版本的名称、发布时间、各个版本的代码,同时将该项目的各个版本按照发布时间先后进行组织排序;
    • 方法信息提取:对目标项目每个版本,方法提取器提取代码中所有方法的相关信息,其中根据该项目所使用的编程语言采用了相关的语法解析工具(例如 JavaParser、TXL 等)包括方法签名、方法完全限定名、方法所在文件的路径、方法起止行,最后将这些信息以方法为单位保存到一个集合中,将其称为该版本的方法信息集合

2.2 构建历史映像

历史映像:为不同版本中方法名及所属文件路径一致且代码内容相同或高度相似的同一方法( 下文简称为相同方法) 构建方法版本组。再选取每个方法版本组中最早的版本作为样本方法,样本方法的集合则称为历史映像

  • 方法版本组:方法映射器将含有多个版本的项目基于方法名及文件路径构建将不同版本、代码内容相同或高度相似的相同方法构建方法版本组。(不一定是完全一致,相似的方法/函数也作为一个方法版本组);
    • 规则: 版本按发布时间排序,对于每个方法,判断其是否已经属于某个方法版本组,否则新建一个组,对于该方法,提取其方法名与所在文件的相对路径,查找所有后续版本中与该相对路径、方法名都相同且文本高度相似的方法,将这些方法添加到该新的方法版本组。
    • 规则:相同方法判断依据:方法完全限定名相同/相似、方法所在的文件的路径一致且方法源代码间有非常高的文本相似度,本文采用最长公共子序列长度识别相似度。
      • 这种方式会导致方法移动、文件重命名的需要重新参与计算,但这个效率的损失相比不加路径限定考虑的代码带来的性能损失少很多。
  • 选择样本方法:本文统一选取所有方法版本组中最早的版本作为样本方法;

2.3 克隆检测

本文采用了 Saga;支持Ⅰ型到 Ⅲ 型克隆的检测;
Li G,Wu Y,Roy C K,et al. Saga: Efficient and largescale detection of near-miss clones with GPU acceleration [C]/ /2020 IEEE 27th International Conference on Software Analysis,Evolution and Reengineering ( SANER) . IEEE,2020: 272 - 283

2.4 恢复全量克隆关系

2.5 优化方案

方法版本组构建时用多线程对构建算法并行化改造,不同方法的版本组之间构建互不影响因此满足并行的前提。并行粒度(即线程池的核心数量)是 CPU 可用核数的两倍。

function FUNCVEGROUPCONSTRUCT(FuncInfoSetList)coreSize←availableProcessors( ) * 2exec←Executors.newFixedThreadPool(coreSzie)for currentVer∈AllVers dofor currentFunc∈currentVers.getFuncInfoSet() doif currentFunc.isUnmarked() thencurrentFunc.mark()exec.submit(DetectSameFunc())end ifend forend forexec.shutdown()return funcVerGroupMap
end functionfunction DETECTSAMEFUNC()for i from currentVer to lastVer dotargetVer←FuncInfoSetList.get(i)if targetVer.getFuncInfoSet().contains(currentFunc) thentargetFunc←targetVer.getFuncInfoSet().get(currentFunc)if getSimilarity(currentFunc, targetFunc) > threshold thenfuncVerGroupMap.get(currentFunc).add(targetFunc)targetFunction.mark()end ifend ifend for
end function

3 实验

设备:英特尔 i7-7820X 型 CPU(8 核心 16 线程), 32 GB 主存, 1 TB 固态存储硬盘, CentOS7 操作系统。
数据:github stars > 50, total 251 Java projects, date 2004~2019, 约 3 亿行。
结论:预处理后的查询量减少了87%,速度提升4倍。

4 结语

略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_75208.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【博学谷学习记录】超强总结,用心分享丨人工智能 多场景实战 常用英文缩写概念总结

目录PV(Page View)UV(Unique Visitor)CPM(Cost Per Mille)CPC(Cost Per Click)CPA(Cost Per Action)CPI(Cost Per Install)ACU(Average concurrent users)PCU(Peak concurrent users)ARPU(Average Revenue Per User)ARPPU(Average Revenue Per Paying User)LTV(Life Time Value…

Linux命令之lz4命令

一、lz4命令简介 LZ4是一种压缩格式,特点是压缩/解压缩速度超快(压缩率不如gzip),如果你特别在意压缩速度,或者当前环境的CPU资源紧缺,可以考虑这种格式。lz4是一种非常快速的无损压缩算法,基于字节对齐LZ77系列压缩方…

西电计算机通信与网络(计网)简答题计算题核心考点汇总(期末真题+核心考点)

文章目录前言一、简答计算题真题概览二、网桥,交换机和路由器三、ARQ协议四、曼彻斯特编码和差分曼彻斯特编码五、CRC六、ARP协议七、LAN相关协议计算前言 主要针对西安电子科技大学《计算机通信与网络》的核心考点进行汇总,包含总共26章的核心简答。 【…

【Linux】Linux根文件系统扩容

场景:根文件系统需要至少100GB的剩余空间,但是目前就剩余91GB。因此,我们需要对根文件系统进行扩容。# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 3.9G 0 3.9G 0% /dev tmpfs …

密码暴力破解

密码的暴力破解准备工具功能简介Burp Intruder工作原理Intruder应用场景爆破实操准备工具 首先准备好BurpSuite和Dvwa作为测试工具和实验对象。 功能简介 Burp Intruder工作原理 Intruder在原始请求数据的基础上,通过修改各种请求参数,以获取不同的请…

flutter 微信聊天输入框

高仿微信聊天输入框,效果图如下(目前都是静态展示,服务还没开始开发): 大家如果观察仔细的话 应该会发现,他输入框下面的高度 刚好就是 软键盘的高度;所以在这里就需要监听软键盘的高度。还要配…

Hbase资源隔离操作指南

1.检查集群的环境配置 1.1 HBase版本号确认> 5.11.0 引入rsgroup的Patch: [HBASE-6721] RegionServer Group based Assignment - ASF JIRA RegionServer Group based Assignment 社区支持版本:2.0.0 引入rsgroup的CDH版本 5.11.0 https://www.…

购买运动耳机应该考虑什么问题、运动达人必备的爆款运动耳机

喜欢运动的小伙伴都知道,运动和音乐是最配的,在运动中伴随着节奏感的音乐能够让自己更兴奋,锻炼的更加起劲儿。在运动耳机方面我也一直都有所研究,购买运动耳机最重要的就是要满足我们运动时候听音乐的需求,从佩戴舒适…

《C++ Primer Plus》(第6版)第5章编程练习

《C Primer Plus》(第6版)第5章编程练习《C Primer Plus》(第6版)第5章编程练习1. 计算闭区间内的整数和2. 重新编写程序清单5.43. 累加4. 投资价值5. 销售情况6. 销售情况27. 汽车8. 销售情况29. 销售情况210. 销售情况2《C Prim…

【技术美术图形部分】简述主流及新的抗锯齿技术

电脑的世界里没有曲线,都是三角面组成一个个模型的,因此一定会出现走样(锯齿)的情况,只是严重与否的问题,而AA也是实时渲染最难解决的问题之一。 Sampling&Artifacts Lecture 06 Rasterization 2 (An…

MAML算法详解(元学习)

文章目录回顾元学习MAML算法MAML和预训练模型的区别数学推导MAML实施细节总结回顾元学习 元学习的基本知识参考这篇博客元学习和机器学习的对比 MAML算法 学习初始化参数,所有任务的初始化的参数都是一样的 MAML和预训练模型的区别 MAML使用的是ϕ\phiϕ…

阶段十:总结专题(第六章:缓存篇)

阶段十:总结专题(第六章:缓存篇)Day-第六章:缓存篇1. Redis 数据类型**String****List****Hash****Sorted Set**2. keys 命令问题3. 过期 key 的删除策略4. Redis 持久化**AOF 持久化****AOF 重写****RDB 持久化****混…

Python 中 openpyxl 模块封装,读写 Excel 文件中自动化测试用例数据

只有测试数据和错误提示信息不同,其他代码都是一样的,不这样不易修改数据和维护,会有两点痛点 1.代码冗余极其严重, 程序可读性不佳 2.程序拓展性很差 往往我们在自动化测试汇总,会将数据放在 Excel 文件、CSV文件、数据库 Py…

Python-scatter散点图及颜色大全

# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as pltplt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False #matplotlib画图中中文显示会有问题,需要这两行设置默认字体plt.xlabel(X) plt.ylabel(Y) plt.xlim…

【IP技术】ipv4和ipv6是什么?

IPv4和IPv6是两种互联网协议,用于在互联网上标识和寻址设备。IPv4(Internet Protocol version 4)是互联网协议的第四个版本,是当前广泛使用的互联网协议。IPv4地址由32位二进制数构成,通常表示为4个十进制数&#xff0…

大数据技术之Hive(四)分区表和分桶表、文件格式和压缩

一、分区表和分桶表1.1 分区表partitionhive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择式选择查询所需要的分区,这样的查询效率辉提高很多。1.1.1 分区表基本语…

2023年蜂巢科技最新面试题

2023年蜂巢科技最新面试题 bio与nio的区别 bio同步阻塞io:在此种⽅式下,⽤户进程在发起⼀个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,⽤户进程才能运⾏。JAVA传统的IO模型属于此种⽅式&#xff0…

flink常用算子介绍

flink任务中【Transformation 数据转换】是对数据进行操作,有 Map、FlatMap、Filter、KeyBy 、Reduce 、Fold 、Aggregations、Window 、WindowAll 、Union 、Window join 、Split 、Select 、Project 等,通过对数据的操作,转换成想要的数据&…

HttpRunnerManager部署

基于HttpRunner的接口自动化测试平台: HttpRunner, djcelery and Django_. HttpRunner手册: http://cn.httprunner.org/git地址:httprunner/HttpRunnerManager: 基于 HttpRunner 的 Web 测试平台,已停止维护。 (github.com)部署机器:linux部署…

vue3+rust个人博客建站日记4-Vditor搞定MarkDown

即然是个人博客,那么绝对不能丢给自己一个大大的输入框敷衍了事。如果真是这样,现在就可以宣布项目到此结束了。如今没人享受用输入框写博客。作为一个有追求的程序员,作品就要紧跟潮流。 后来,Markdown 的崛起逐步改变了大家的排…