Skip to content

CONCORD:Clone-aware Contrastive Learning for Source Code

约 1203 个字 预计阅读时间 4 分钟

Abstract

  • 人类开发者喜欢参考代码库和网络上的已有代码(好像确实也是这样,这导致了大量的重复代码
  • 不正确的复制会导致恶意的结果
  • 目标是找到一个自监督预学习模型以移除恶意的克隆,提升良性的克隆的比例

Introduction

Limitation of Existing Work

  • BERT Model 是 Google 的一个预训练模型,最早用于NLP,从现有代码库(如github)学习,尝试去捕获新代码的统计学特征,从而评判代码的质量
  • 原先的模型的大多数都是在关注字典序或者语法性质,有些过分依赖语法上的相似性
  • 在人类程序员调整原有代码的过程中错误是难以避免的,比如错误的标识符和溢出
  • 新的模型应该关注程序员的克隆实践,这面临如下两个问题:
  • 缺乏克隆变体,人为的去收集海量的克隆变体是极为不现实的
  • 需要去理解克隆的机制,两段代码,可能长的不太像,但本质功能是等价的

Approach

  • 本篇论文选择的方法:
  • 解决第一个问题:使用启发式练习,在数据库中生成了两个变体,一个是语义克隆有相同函数功能,另一个是引入了精妙的bug的程序
  • 解决第二个问题:使用增强数据集,在克隆直接中嵌入嵌入不同的错误,使相似度最大化,差距最小化

Reult

  • 只用了1.55GB 多语言的 code 相对CodeBERT 和 GraphCodeBERT 来说很少
  • 结果显示CONCORD在克隆检测和bug检测上表现得更好,还测试了模型的可扩展性,发现对当前的模型的提升也很大
  • Summary:
  • 我们设计了一个数据强化的手段,去自动生成相似的克隆代码(语义克隆,错误克隆和程序员日常的代码)
  • 我们的检测方法表明CONCORD在需要的更少的情况下表现得更好
  • 我们把新模型应用在了现有模型上,发现效果很好
  • 数据和代码在github上开源

Overview

CONCORD是建立在BERT的基础上,包含了三个主要的步骤: 1. Data Augmentation : 要克隆原始代码,一个是在保留语义的情况下改变语法,另一个是在有相同结构的情况下注入bug 2. Pretraining to learn code representation : 全面捕获代码性质,从总体和统计学的视角到结构和语义的特征。第一阶段使用了MLM,这个阶段旨在训练模型识别代码以便选择正确的token,;阶段二执行多任务比对,学会更好地捕获代码的结构和语义。用到了LTSP(Local Tree Structure Prediction) and contractive learning(CLR) 1. LTSP训练模型根据源代码构建抽象语法树 2. CLR训练模型根据代码语义生成代表表征 3. Fine-tuning for Downstream Tasks

CONCORD

State-1:Data Augmentation

Generating Clones

Real-world clones are commonly classified into four categories: 1. 只有空格和注释不同 2. 语法相似但是使用了不同的标识符 3. 还是语法相似但是相比2有更多的调整 4. 语法不一定相似,但在功能上等价

Identifier Renaming
  1. 单字母,比如i,用另一个单字母j重命名
  2. 复合名称,删除某些子串,或者改变顺序
  3. 重写代码块:
  4. 重写循环,for改while,while改for
  5. 交换if-else块
  6. 插入不可能被执行的代码
  7. 声明和初始化排列组合
Generating Clone-deviants
  1. Operator Bugs:把比较运算符换成相反的,替换算数运算符
  2. Data-type Bugs:改变数据类型
  3. Varible Bugs:在同一个循环中用另一个变量替代一个变量;移除初始化表达式
  4. Value Bugs:用相反值替换布尔表达式,随机数替换算术表达式
  5. Pointer Bugs:随机移除一些指针的声明,或者把一些指针置为NULL
  6. Statement Bugs:移除一些情况监测语句和块,比如移除访问容器元素之前的下标检测
  7. Function-call Bugs:随机选择函数对于它的形参,添加、移除、交换或者赋值为NULL

State-2:pre-training

Input Representation

Divide m sourse code into k sub-tokens($m\leq k $)

Phase1:Learning Code Texts

利用MLM去捕获代码文段的本质,并保证相似度最大化

Phase2:Learning Code Structure Prediction

给每个代码符号一个local AST label,解析数据然后构建AST-Label vocabulary

Stage-3:Fine-tuning

Semantic Clone Detection

符号重叠并且语法结构并不总是很相像,模型需要从数千份随机的程序中挑选出与query相似的程序

Bug Detection

测试模型在函数层面挑选出错误的能力