略读 # SourcererCC: Scaling Code Clone Detection to Big Code

news2024/12/23 18:46:47
  • 《SourcererCC: Scaling Code Clone Detection to Big Code》代码克隆检测基线方法之一;

ABSTRACT

面向的问题:代码克隆检测在海量源码的场景下的扩展性问题;
提出的解决方案:SourcererCC,a token-based clone detector that targets three clone types;

  • 采用了一种索引使用标准工作站来提高大型项目间存储库的可扩展性;
  • 一种优化的倒排索引来快速查询给定代码块的潜在克隆;
  • 基于 token ordering 的启发式过滤被用于减少 index size、code-block 比较数量、token比较次数

结论:本文方案召回率和精度都比较高,可扩展性好;

2 DEFINITIONS

Code Fragment:连续代码片段 ( l , s , e ) (l,s,e) (l,s,e),源文件 l l l,起始行 s s s,结束行 e e e
Clone Pair:相似代码 ( f 1 , f 2 , ϕ ) (f_1,f_2,\phi) (f1,f2,ϕ) f 1 f_1 f1, f 2 f_2 f2相似代码, ϕ \phi ϕ克隆类型;
Clone Class: 相似代码集合 ( f 1 , f 2 , . . , f n , ϕ ) (f_1,f_2,..,f_n,\phi) (f1,f2,..,fn,ϕ)
Code Block: 大括号中的一系列语句,local class、变量声明语句等;
Type-1(T1): 等效代码,只有空白符、layout 和 comments 的差异;
Type-2(T2): 等效代码,标识符和字面量有差异;
Type-3(T3): 语句级别不同但句法相似的代码,添加/修改/删除了部分语句;
Type-4(T4): 功能相同但句法不同的代码,语义相似;

3 THE PROPOSED METHOD: SourcererCC

3.1 Problem Formulation

项目P由一系列代码块 { B 1 , . . . , B n } \{B_1,...,B_n\} {B1,...,Bn}组成,一个代码块B由一系列tokens组成 { T 1 , . . , T k } \{T_1,..,T_k\} {T1,..,Tk}。Token 被视为编程语言的关键字、字面量、标识符等,string literal is split on whitespace,不包含运算符。由于代码块可能包含重复的 tokens,因此每个 token 被表示为 (token, frequency) pair。代码块相似度高于某个阈值的被识别为克隆。

函数相似度度量选择了 “Overlap”,因为其直观地捕获了代码块直接的重叠。
overlap similarity O ( B x , B y ) O(B_x,B_y) O(Bx,By) 计算为二者共有的token数量:
O ( B x , B y ) = ∣ B x ∩ B y ∣ O(B_x,B_y)=|B_x\cap{B_y}| O(Bx,By)=BxBy

项目 P x P_x Px P y P_y Py,相似函数 f f f,阈值 θ \theta θ,目标:
s.t. f ( P x . B , P y . B ) ≥ ⌈ θ ⋅ m a x ( ∣ P x . B ∣ , ∣ P y . B ∣ ) ⌉ f(P_x.B, P_y.B)\geq\lceil{\theta·max(|P_x.B|,|P_y.B|)}\rceil f(Px.B,Py.B)θmax(Px.B,Py.B)

  • ∣ P x . B ∣ |P_x.B| Px.B 指其 token 数量

在这个基础上,对所有代码块两两匹配计算复杂度为 O ( n 2 ) O(n^2) O(n2)(图中圆圈)。代码块的粒度这里被称为 method。其他的线是后续提出的算法对这个问题的优化。可以看到几乎线性,具有极大的性能提升。根据本文提出的启发式过滤来显著减少候选比较数量。

3.2 Overview

算法阶段:(i) partial index creation; (ii) clone detection;

  • 索引创建阶段:从源文件解析代码块,使用 scanner 进行 tokenize。然后从代码块构建倒排索引即 token 到 code block 的映射。基于后续的启发式过滤规则只对部分 token 构建 partial index;
  • 克隆检测阶段:遍历代码块,从索引中拿到候选比较对象;然后使用另一个启发式方法,根据 token 顺序来度量查询和候选块相似度得分的上下界。候选块的相似度上界小于阈值的直接被过滤不用比较。候选者相似度下界高于阈值即被作为候选对象。

3.3 Filtering Heuristics to Reduce Candidate Comparisons

3.3.1 Sub-block Overlap Filtering

when two sets have a large overlap, even their smaller subsets overlap

将代码块视为 bag-of-tokens (i.e. multiset),可以得到:

when two code blocks have large overlap, even their smaller sub-blocks should overlap

Property 1

  • 2个代码块公共块有 i i i个,那么其各自的子块(前t-i+1个tokens)至少需要match上一个块。

利用这个性质,我们根据阈值算出需要 match 多少个 token(即 i i i),然后计算前 t-i+1 个tokens构成的子集是否满足至少有一个相交元素。 性质一可以让我们不用所有 tokens 做比较。为了使用这个性质,代码块中的 tokens 需要遵循一个预设的全局顺序。虽然有很多方法设置这个顺序,但一个问题是哪个排序方式最有效?一个直观的想法是让 rare token 在前,这样做会消除大量的 FPs(图1中的🔺)。

但性质一在某些情况下(两个集合的阶不一致时)可能无效,这种情况还需要引入另一个启发式过滤策略来消除 FPs。

3.3.2 Token Position Filtering

考虑position,可以对overlap做一个估计,估计出 current matched tokens 总数和 minimum number of unseen tokens。比如假设此时后面的全匹配中,最大可能匹配的 token 上限可以得到(两个块后续的 tokens 的最小值)如果这个已经小于阈值,那么可以pass这次匹配(已经可以确定无法满足要求)。同理,如果没匹配完已经超出阈值,可以接受这个候选块。

这个规则的效果如图1的“+”所示,可以看到更稳定。

3.4 Clone Detection Algorithm

Partial Index Creation:SourcererCC 根据性质1创建 Partial Index;
名词:global token frequency map (GTP)

Clone Detection

3.5 Detection of Near-miss (Type-3) clones

Type-3 克隆在检测的 bags-of-tokens level 上保留了足够的相似性,基于 token-seqence 的匹配方案则难以处理。

4 EVALUATION

LOC:lines of code

  • 使用不同size的输入来检测 SourcererCC 执行和检测的性能。

4.1 Execution Time and Scalability

4.2 Experiment with Big IJaDataset

4.3 Recall

4.3.1 Recall Measured by The Mutation Framework

4.3.2 Recall Measured by BigCloneBench

4.4 Precision

5 THREATS OF VALIDITY

6 RELATED WORK

7 CONCLUSION

扩展性实验数据集:IJaDataset,a Big Data inter-project repository containing 25,000 open-source Java systems, and 250MLOC;
评估Benchmarks:1)Mutation Framework;2)BigCloneBench;
结论:在 Type-3 克隆检测上取得了当年的 SOTA;

相关资源

  1. Code1 | Code2

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java面试题【1】

Java面试题 文章目录 Java面试题Java基础以及api程序题1.下面sum的值是( D )2.下面程序的运行结果( A )3.若x是float类型变量,x10/4; 则x的值是( B )4.以下程序的输出结果是(x 99 , …

Redis 缓存数据库双写不一致怎么处理?

一、概述: Redis 缓存数据库可能会出现双写不一致的情况,这是因为在进行缓存更新时,同时有多个线程或进程对同一个缓存键进行读写操作,导致了数据的不一致性。 具体来说,假设有两个线程 A 和 B 都要对同一个缓存键进…

【C语言】常用的字符串函数使用 模拟实现

前言字符串的组成 strlen模拟实现stlen strcpy模拟实现strcpy strcmp模拟实现strcmp strcat模拟实现strcat 前言 在使用下面介绍的库函数时声明以下头文件 #include <string.h>字符串的组成 如下字符数组 str 看似只包含abcde五个字符&#xff0c;实际上由6个字符组成…

随着人工智能时代的到来,算力需求的成倍增长成为新的趋势

方向一&#xff1a;AI与算力相辅相成 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。…

python 时间操作

写代码的时候&#xff0c;我建议还是要使用准确的时间刊一下这个结果&#xff0c;然后再减去开始的计数操作 我之前的操作是 time package from time import sleep from time import time import sys t0 time() sleep(3) t1 time()print(" cost {} s".format(…

如何使用Fiddler对手机进行弱网测试?(干货教程)

1.首先&#xff0c;fiddler连接手机 1)Tools->Options->Connections->设置端口8888&#xff0c;勾选Allow remote computers to connect 2)配置手机 注&#xff1a;手机和电脑需要在同一局域网下 手机进入网络详情&#xff0c;将代理改为手动 设置主机名、端口 主机…

python 多任务详解

1、线程① 函数方式创建线程② 自定义类创建线程 2、队列① 普通队列 Queue② 堆栈 LifoQueue③ 优先级 PriorityQueue 3、互斥锁4、进程① 函数方式创建进程② 类方式创建进程③ 进程中的队列④ 进程间通信 5、 线程与进程区别① 线程共享全局变量&#xff0c;进程不共享② 所…

Tomcat部署相关问题汇总

一.Jar包冲突 由于项目当中依赖了一些框架&#xff0c;而这些框架无法直接修改时&#xff0c;就直接本地代码写了一个同名同包路径的类&#xff0c;可以直接覆盖框架的类,但是心里不免有疑问&#xff0c;为啥本地写的同名同路径的类&#xff0c;可以覆盖三方框架的类呢&#x…

分层解耦相关知识点

这里写目录标题 三层架构简介具体案例原始代码DAO层代码service层controller层总结 分层解耦思想IOC&DI 入门简介控制反转依赖注入 IOC详解详细种类 DI详解 三层架构 简介 具体案例 原始代码 DAO层代码 分别是一个接口实现类以及一个接口&#xff0c;用接口是为了提高程…

Python pyqt5 qss美化窗口

效果 QSS QWidget#widget{background-color:#eef0f6;border-left:0.5px solid lightgray;border-right:0.5px solid lightgray;border-top:0.5px solid lightgray;border-bottom:0.5px solid #e5e5e5;border-top-left-radius: 5px;border-top-right-radius: 5px;}QWidget#widge…

Google测试之道丨如何从角色出发谈谈漫游测试?

谈到“漫游测试”&#xff0c;想必大多数人想起的都是James A.whittaker提出的全局探索性测试方法。他将软件测试比如为城市旅游&#xff0c;并划分了不同的区域&#xff08;如&#xff1a;商业区、历史区、娱乐区等等&#xff09;&#xff0c;将测试人员比喻为旅游者进行城市旅…

vue3组件通信之pinia

简述 在vue3&#xff0c;vue的状态管理也迎来了新的变更&#xff0c;在vue3使用新的组件pinia来代理原有的vuex。pinia相比vuex&#xff0c;功能收敛了不少&#xff0c;比如不直接暴露setter方式&#xff0c;外部直接修改数据 两者的概念区别 vuex:集中式管理状态容器,可以实…

java之路—— Spring IOC 的详解与基本应用

创作不易&#xff0c;给个小支持一下呗 文章目录 前言一、IOC 基本概念二、理解IOC三、基本步骤 前言 首先在了解ioc之前&#xff0c;我们要先了解Spring的基本概念。 Spring是一个开源的Java应用程序开发框架&#xff0c;它提供了一套全面的解决方案&#xff0c;用于开发企业…

从此告别网速慢,轻松掌握浏览器缓存知识点!

文章目录 I. 介绍浏览器缓存的作用提高网页加载速度减少网络带宽消耗优化用户体验 II. 浏览器缓存的原理缓存机制缓存分类1. 强缓存2. 协商缓存 III. 强缓存缓存操作流程缓存过期机制如何设置强缓存 IV. 协商缓存304 Not Modified状态码缓存操作流程如何设置协商缓存 V. 缓存失…

kubernetes核心概念 Pod

Kubernetes集群核心概念 Pod 一、工作负载(workloads) 参考链接&#xff1a;https://kubernetes.io/zh/docs/concepts/workloads/ 工作负载&#xff08;workload&#xff09;是在kubernetes集群中运行的应用程序。无论你的工作负载是单一服务还是多个一同工作的服务构成&…

第2章-Java基本语法

Java基础知识图解 1. 关键字与保留字 关键字 Java保留字&#xff1a; 现有Java版本尚未使用&#xff0c; 但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字 goto 、 const 2. 标识符 Java 对各种变量、 方法和类等要素命名时使用的字符序列称为标识符…

Elasticsearch:增量快照如何工作?

作者&#xff1a;Lutf ur Rehman Elastic 提供许多由讲师指导的面对面和虚拟现场培训以及点播培训。 我们的旗舰课程是 Elasticsearch 工程师、Kibana 数据分析和 Elastic 可观测性工程师。 所有这些课程都会获得认证。如果你想更多了解这些认证方面的知识&#xff0c;请阅读文…

【CXP协议与CXP测试套件】

CXP协议 CoaXPress (简称CXP)是指一种采用同轴线缆进行互联的相机数据传输标准&#xff0c;主要用于替代之前的Camera Link协议&#xff0c;常见于科学相机、工业相机、医学图像、航空防务等场景。CXP是一个非对称的高速点对点串行传输协议&#xff0c;主要用于传输视频和静态…

GO 微信支付V3SDK回调踩坑

通过微信官网提示安装sdk外部库 SDK&#xff0c;工具 | 微信支付商户平台文档中心 下面只讲解微信支付回调部分 先成功下一单微信支付拿到支付回调的数据&#xff0c;方便后续调试 因为在go里面打印请求参数不方便我使用的php打印全部参数&#xff0c; 圈起来的部分是我们需…

centos8.x系统安装K8S,kubernetes集群v1.23.9,docker支持的最后一个版本

1. 部署环境主机&#xff08;条件说明&#xff09; 卸载podman&#xff0c;centos默认安装了podman容器&#xff08;不管有没有&#xff0c;执行下总没错&#xff09;&#xff0c;可能与docker存在冲突 #环境准备 master 192.168.186.128 CentOS Linux release 8.5 (Core) n…