Skip to main content
QUICK REVIEW

[论文解读] Self-Supervised Bug Detection and Repair

Miltiadis Allamanis, Henry Jackson-Flux|arXiv (Cornell University)|May 26, 2021
Software Engineering Research参考文献 33被引用 38
一句话总结

BugLab 共同训练一个 bug 选择器以生成难以检测的漏洞,以及一个漏洞检测器来定位并修复它们,在真实的 PyPI 漏洞上比随机漏洞基线表现更好,并在开源 Python 代码中发现了 19 个此前未知的漏洞。

ABSTRACT

Machine learning-based program analyses have recently shown the promise of integrating formal and probabilistic reasoning towards aiding software development. However, in the absence of large annotated corpora, training these analyses is challenging. Towards addressing this, we present BugLab, an approach for self-supervised learning of bug detection and repair. BugLab co-trains two models: (1) a detector model that learns to detect and repair bugs in code, (2) a selector model that learns to create buggy code for the detector to use as training data. A Python implementation of BugLab improves by up to 30% upon baseline methods on a test dataset of 2374 real-life bugs and finds 19 previously unknown bugs in open-source software.

研究动机与目标

  • 通过提出一个自监督框架来解决缺乏大规模带标注漏洞数据集的问题,以进行漏洞检测和修复。
  • 共同训练一个能够生成具有挑战性的漏洞的选择器,以及一个能够修复它们的检测器。
  • 在 Python 上通过真实漏洞测试集和开源项目展示有效性。
  • 提供一个 Python 实现(PyBugLab)并发布数据集以实现可复现性。

提出的方法

  • 将代码表示为实体及关系的异构图。
  • 使用两种神经网络模型:一个选择器 S_phi 用于选择引入漏洞的重写,和一个检测器 D_theta 用于定位和修复它们。
  • 构建一个极小极大训练目标,其中选择器近似检测器的最难重写(最大损失),检测器学习修复(最小化损失)。
  • 在位置 ell 处采用带有重写规则 rho 的概率重写,包括引发漏洞的重写和修复的重写,修复的逆规则 rho^{-1}。
  • 采用两种代码表示架构(GNN 和 GREAT transformer)来生成实体嵌入用于重写评分。
  • 提供一个 Python 实现(PyBugLab),处理四种漏洞类型:变量误用、参数交换、运算符错误和字面量错误,以及数据增强重写。

实验结果

研究问题

  • RQ1自监督的协同训练一个漏洞选择器和一个漏洞检测器,是否能提高检测和修复的性能,相较于有监督或随机漏洞基线?
  • RQ2在保持现实漏洞分布的同时,学习得到的重写能否生成更难检测的漏洞?
  • RQ3不同的代码表示(GNN vs GREAT)如何影响合成与真实漏洞集合上的定位与修复性能?
  • RQ4在真实世界漏洞数据集中,漏洞定位与修复的相对难度如何?
  • RQ5与 CuBERT 等现有方法相比,PyBugLab 在真实世界 PyPI 漏洞上的表现如何?

主要发现

  • 在合成数据 RandomBugs 集上,使用 BugLab 训练的检测器优于基于随机插入漏洞的基线。
  • 在 RandomBugs 上,PyBugLab(GNN)达到 Joint=69.6%,Loc=80.4%,Repair=84.2%;PyBugLab + Aug 达到 Joint=70.3%,Loc=81.1%,Repair=84.5%。
  • 在真实的 Bug 数据集 PyPIBugs 上,PyBugLab(GNN)达到 Joint=24.2%,Loc=31.3%,Repair=70.7%;PyBugLab + Aug 达到 Joint=26.4%,Loc=33.5%,Repair=72.0%。
  • 在五个 GNN 模型的集成提高了 RandomBugs 上的定位到 83.0% 和修复到 85.4%,并对 PyPIBugs 的 Loc/Repair 有所提升。
  • 在漏洞定位的召回方面,PyBugLab 通常优于 CuBERT,在跨漏洞类型的整体检测能力上具有更高的表现。
  • 进一步分析表明,检测 NoBug 尤为具有挑战性,在 PyPIBugs 测试集上的准确率未超过 ~63%。
  • 选择器随着时间学习生成更难诊断的漏洞,表明其在推动检测器鲁棒性方面具有成效。

更好的研究,从现在开始

从论文设计到论文写作,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。