Large Language Models for Test-Free Fault Localization

news2024/10/7 14:34:10

基本信息

这是24年2月发表在ICSE `24会议(CCF A)的一篇文章,作者团队来自美国卡内基梅隆大学。

博客创建者

武松

作者

Aidan Z.H. Yang,Claire Le Goues,Ruben Martins,Vincent J. Hellendoorn

标签

软件错误定位、大语言模型、深度学习、神经网络模型

1 摘要

软件错误定位 (Fault Localization,FL) 旨在自动定位有错误的代码位置,这是许多手动和自动调试任务中的第一步。一般的 FL 技术需要提供测试用例,并且通常需要大量的程序分析、程序检测或数据预处理。近年来涌现出一些将大型语言模型 (Large Language Model,LLM)用于代码相关工作的方法,比如代码生成、代码总结等任务,LLM表现出强大的性能和泛化能力。受此启发,文章研究了 LLM 在语句级别(Statement-levelLine-level)进行错误定位的有效性。文章主要有以下几个贡献:

  • 第一种基于大语言模型的错误定位方法,可在没有任何测试信息的情况下定位有缺陷的代码行;
  • 第一种能够在语句级别检测代码安全风险的方法;
  • 发现错误定位能力随着LLM规模的变大而提高。

1.1 相关工作

  • SBFL:基于频域的错误定位(Spectrum-based FL),利用程序执行多个失败的测试用例的覆盖信息计算语句怀疑度,然后进行排名。某个语句在失败的测试中执行的频率越高,在通过的测试中执行的频率越低,该元素的可疑程度就越高。SBFL存在并列排名的情况,如下图中,if语句块中的代码行实际上不能被覆盖信息区分出差异,因此其怀疑度分数是相同的,而真正出错行第7行则无法被准确定位出来。
SBFL失效的例子
  • MBFL:基于变异的错误定位(Mutation-based FL),来源于软件测试中的变异测试。变异测试的思想是使用测试用例执行变异体,测试用例执行结果与源程序执行结果不同,则称该测试用例被该变异体杀死(killed)。被杀死变异体数量与变异体总数的比值为该测试用例的变异分数,变异分数越高,则说明该测试用例更有效。将变异测试用于软件错误定位,基于思想:错误语句容易通过某种简单的变异方式被修复,变异被修复的比例越大,则该语句为错误语句的概率越高。MBFL的局限性在于有的语句可能无法生成变异体,以及执行效率过低的问题(一个程序要为每个语句生成多个变异体,并且要为每个变异体执行多个测试用例,因此该方法定位一个程序的错误行的复杂度为 O ( n 3 ) O(n^3) O(n3))。

  • MLFL:基于机器学习的错误定位(Mechaine Learning-based FL)。早期的机器学习称为Learning-to-Rank的方法,都基于代码信息和代码测试信息训练机器学习模型并预测语句怀疑度,从而进行排名。最近的深度学习方法将这些信息进一步融合、编码和提取特征,并结合一些其他的模型(如GNN、CNN)提升特征提取的效果。

  • LLMs for code:近年的LLMs通常用于代码表征、代码合成等领域,但由于大模型输出的不确定性,以及无法直接用于错误定位(需要prompt),目前还少由工作将LLM用于错误定位。

2. 方法

2.1 方法架构图

方法架构图

2.2 方法描述

2.2.1 Left-to-right Language Models(即大模型)

如各种用于编程领域的代码生成语言大模型,其模型架构都是基于自回归的自左向右的生成模型,也即decoder-only的transformer结构网络模型。这种模型架构适用于生成任务,例如常见的代码生成模型,如下图所示:

代码生成语言模型示例

图a中给定一个具有代码上文的片段,以及功能注释,可以让语言模型据此生成接下来的内容。文章方法主要是利用代码生成大模型提取代码特征,由于代码大模型基于大规模代码数据集训练,其已经具备了较好的代码理解能力。因此文章没有对大模型进行微调,直接使用了现有的代码生成大模型: C o d e G e n CodeGen CodeGen,这是目前效果较好的一个代码大模型。

2.2.2 Bidirectional Adapter(双向注意力适配器)

作者认为Left-to-right的代码生成大模型只能与先前的代码进行交互(单向注意力),对代码行之间的语义考虑不够充分,效果不够好。因此在大模型之后增加了几层Transformer encoder层,以进行双向注意力计算,由此使得每个句子可以与前后的句子都能交互信息。整体训练步骤如下图所示:

细节执行流程
  • 首先输入代码文本被序列化为一串代码 t o k e n s tokens tokens,记为 C = [ c 0 , c 1 , . . . , c N ] C = [c0, c1, . . . , cN ] C=[c0c1...cN] 。将代码 t o k e n s tokens tokens输入一个因果预训练(causally pretrained,即left to right)的 Transformer 模型(LLM,CodeGen),以将它们转换为向量表示,这些向量表示的维度为 S ∈ R N × D S∈\mathbb{R}^{N×D} SRN×D ,其中 D D D 表示预训练模型的每一个隐层输出的维度(即 d m o d e l d_{model} dmodel )。
  • 进而用每一行代码末尾的换行符的向量代表该行代码,此时每一行的向量表示即为 S N L ∈ R M × D = S [ c i = \ n ] S_{NL}∈R^{M×D}=S[c_i=\verb|\| n] SNLRM×D=S[ci=\n] ,其中 M M M 表示原始代码中的换行符数量, M M M<< N N N。作者认为该换行符向量可以准确而合理地捕捉到前一句的信息。
  • 对于 CodeGen 模型,16B版本模型的隐层维度 D 的高达 6144。然而由于文章所加入的适配器层仅基于少量数据训练,适配器的维度d远小于D,文章所使用的 d d d 维度为 d ∈ { 256 , 512 , 1024 } d∈{\{}{256,512,1024}{\}} d{256,512,1024}。因此为了将CodeGen的维度与适配器对接,使用一个全连接层将二者连接起来。文章中形式化表述为:“将原来的 S N L S_{NL} SNL约简为 R N L ∈ R M × d = S N L W d R_{NL}∈\mathbb{R}^{M×d}=S_{NL}W_d RNLRM×d=SNLWd,其中 W d ∈ R D × d W_d∈\mathbb{R}^{D×d} WdRD×d 是一个可学习的权重,相当于一个全连接层”。
  • 由此训练获得的适配器最终获得每一行的向量表示 A N L ∈ R M × d A_{NL}∈\mathbb{R}^{M×d} ANLRM×d 。适配器使用两层Transformer encoder层。最终使用Sigmoid激活函数将每行的表示向量转换为犯错概率估计值。使用二值交叉熵计算该概率值和ground truth之间的损失,即 L C E = T l n B + ( 1 − T ) l n ( 1 − B ) \mathcal{L}_{CE}=T {\rm{ln}} B+(1-T){\rm{ln}}(1-B) LCE=TlnB+(1T)ln(1B)

3. 实验

3.1 数据集

  • Defects4J V1.2.0:一个 Java 基准数据集,其中包含来自 6 个 Java 项目的 395 个 bug 。对于大多数基准测试,使用 V1.2.0 而不是最新版本 (V2.0.0),以便与大多数先前的 FL 技术在同一数据集上进行比较。
  • Defects4J V2.0.0:一个 Java 基准数据集,与 Defects4J V1.2.0 [21] 相比存在其他错误。这个数据集是为了证明我们的方法可以推广到其他未参与训练的数据集上。
  • BugsInPy:一个 Python 基准测试,其中包含来自 17 个不同项目的 493 个错误。
  • Devign:一个来自两个开源项目的 5,260 个 C 语言的benchmark。最初的Devign数据集包含来自四个不同项目的15,512个安全漏洞。

所有数据集都包含与每个故障相对应的修复提交。遵循先前的方法,文章将错误语句识别为在与每次提交相关的 git diff 中更改的语句。

3.2 基准方法

  • DeepFL:通过简单的多层神经网络融合多种测试信息提取代码行的表征然后预测错误概率;
  • DeepRL4FL:通过CNN融合多种测试信息、代码执行信息和代码表示信息;
  • TRANSFER-FL:也是融合多种测试信息和语义信息然后MLP做分类,但引入了迁移学习的概念,构建开源代码数据集训练语义提取器,然后用于错误定位代码的语义信息提取;
  • SBFL(Ochiai)。

3.3 评价指标

  • Top-N:测量在前 N 个位置 (N=1, 3, 5) 内至少有一个故障单元的故障数量。
  • AUC面积(Area Under the ROC Curve,AUC):即ROC 曲线下的面积,用于测试模型的有效性。AUC 是介于 0 和 1 之间的数字,越接近1越好。

3.4 结果分析

3.4.1 对比实验

由于文章针对语句级别(statement-level)的错误定位,而DeepFL是方法级别(method-level)的,因此遵循先前方法,DeepFL选取只利用覆盖信息和变异信息的版本进行对比。对比实验仅在Defects4J V1.2.0数据集上开展,针对java语言。
文章没有对比MBFL方法,原因可能是因为有的代码行无法进行变异。

图3.1 对比实验结果

实验结果显示该方法超越了之前的所有深度学习方法,以及SBFL方法。

3.4.2 cross-project验证(对新的项目代码的泛化性)

前面的对比实验测试集和训练集数据来自同一数据集,其分布相同,采用项目内的交叉验证。而cross-project验证将在未见过的项目上进行测试,性能都会较前者有所降低。cross-project验证在Defects4J V2.0.0数据集上进行,因为Defects4J V2.0.0包括了Defects4J V1.2.0没有涵盖的新的项目代码。

文中说明对比之前的深度学习方法DeepRL4FL和TRANSFER-FL,包括GRACE,性能都有所下降。从图3.1可以看出(new projects),本文方法也有相当程度的下降。但文中表明本文方法优势在于无需为新的项目重新训练模型,而其他模型的交叉验证要么重新训练了模型,要么只能在方法级别定位错误,因此本文方法泛化能力好更,计算成本更低。

3.4.3 消融实验结果

从上图的Ablation部分可以看出,大模型的预训练以及本文所加入的适配器起到了重要作用。
另外,未加入适配器的CodeGen尽管是一个生成模型(目标并非针对于文本理解任务),但其也具有相当于SBFL水平的代码错误理解能力,效果与SBFL相当(仅训练一层MLP接在大模型的输出用于分类)。但对比加入适配器后效果大大提升,说明所加入的双向适配器的有效性,也进一步证明作者考虑到的双向注意力的重要性。

3.4.4 对其他语言和领域的泛化性(generalization)

作者还评估了该方法在不同语言(other languages)和不同领域(other domains)上的错误定位能力,主要是在python数据集BugsInPy,以及C语言的风险预测Devign数据集上进行。其中,BugsInPy用于验证该方法对不同语言的泛化性,Devign用于验证对新的领域数据集上的泛化性,因为Devign是一个进行风险监测的数据集,没有测试信息作为数据输入,因此先前的基于测试信息的方法就不能适用了。

图3.2 Devign数据集的一个例子

实验结果:

图3.3 语言泛化性实验结果
图3.4 领域泛化性实验结果

实验结果表明:

  • LLMAO能泛化到其他的语言数据集上;
  • LLMAO的性能随着训练数据集大小的增加而提高;
  • LLMAO对于在测试用例不可用的 C 语言中查找安全漏洞特别有效;
  • LLMAO的性能随着CodeGen模型规模大小的增加而提高。

4. 总结

4.1 亮点

  • 利用了大模型的代码理解能力,并加入具有双向注意力的Tansformer层解决代码生成大模型的单向注意力在代码山下文理解上的局限性,相当于验证了双向注意力在该任务上的重要性;
  • 解决了传统方法和一般深度学习方法对测试信息的依赖(test-free),降低了数据预处理的成本。说明了代码理解角度直接进行错误定位是可行的。

4.2 不足

  • 在方法对比上没有对比传统方法MBFL;
  • 缺乏可解释性。

4.3 启发

  • 大模型是可以利用的,提取程序语义信息,基于程序和问题理解,进行错误定位。

5. 相关知识链接

  • 论文链接
  • 代码链接
  • BibTex
@inproceedings{yang2024large,
  title={Large language models for test-free fault localization},
  author={Yang, Aidan ZH and Le Goues, Claire and Martins, Ruben and Hellendoorn, Vincent},
  booktitle={Proceedings of the 46th IEEE/ACM International Conference on Software Engineering},
  pages={1--12},
  year={2024}
}

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

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

相关文章

C# 实现格式化文本导入到Excel

目录 需求 Excel 的文本文件导入功能 范例运行环境 配置Office DCOM 实现 组件库引入 OpenTextToExcelFile 代码 调用 小结 需求 在一些导入功能里&#xff0c;甲方经常会给我们一些格式化的文本&#xff0c;类似 CSV 那样的纯文本。比如有关质量监督的标准文件&…

ArrayList知识点详解

目录 1.简介 2.ArrayList的使用 &#xff08;1&#xff09;如何实例化ArrayList&#xff1f;&#xff08;如何创建&#xff1f;&#xff09; &#xff08;2&#xff09;如何构造使用&#xff1f; &#xff08;3&#xff09;为什么ArrayList的无参构造可以添加数据 &#…

【进收藏夹吃灰系列】算法学习指南

文章目录 [toc]分治算法 个人主页&#xff1a;丷从心 系列专栏&#xff1a;进收藏夹吃灰系列 分治算法 博客标题博客url【分治算法】【Python实现】Hanoi塔问题https://blog.csdn.net/from__2024_04_11/article/details/138093461?spm1001.2014.3001.5502

Flowable入门案例

资料地址1614912120/Flowable (github.com)https://github.com/1614912120/Flowable 步骤1&#xff1a;添加Flowable依赖 首先&#xff0c;您需要将Flowable引擎集成到您的项目中。您可以通过Maven、Gradle或手动下载jar包的方式来添加Flowable的依赖。 <?xml version&q…

CVPR 小样本土地覆盖制图 张洪艳教授团队获挑战赛冠军

提出了一个广义的基于少镜头分割的框架&#xff0c;以更新高分辨率土地覆盖制图中的新类&#xff0c;分为三个部分:(a)数据预处理:对基础训练集和新类的少镜头支持集进行分析和扩充;(b)混合分割结构:将多基学习器和改进的投影到正交原型(POP)网络相结合&#xff0c;增强基类识别…

公共 IP 地址与私有 IP 地址区别有哪些?

​  IP 地址是分配给互联网上每个设备的唯一数字 ID。 IP 地址可以在 Internet 上公开使用&#xff0c;也可以在局域网 (LAN)上私有使用。本文&#xff0c;我们主要探讨公共 IP 地址和私有 IP 地址之间的区别。 公共IP地址&#xff1a;公共IP地址是用于访问Internet的向外的I…

TouchGFX 总结

文章目录 使用中文字体多屏幕间交换数据UI to MCUMCU to UI API文档参考横竖屏切换 使用中文字体 添加一个textArea&#xff0c;默认的英文文本可见&#xff0c;输入中文字体后就看不见了&#xff0c;是因为这个默认的字体不支持中文&#xff0c;改一下字体就可以了&#xff1…

结构体反汇编解析

代码如下 #include<iostream> using namespace std; typedef struct Role {int HP;int MP; }*PRole; int main() {Role user;PRole puser;puser &user;puser->HP 1500;puser->MP 2000;user.HP 2500;user.MP 3000;return 0; }基础知识 如果是地址就是采用…

关于Centos 7/8 网络设置 与工具连接

网络三步曲的配置 1、首先更改虚拟机的网络配置 查看子网地址以及网关 如果有要求需要更改IP地址&#xff0c;规定第三位是指定数值&#xff0c;那么需要全部更改 例如&#xff0c;IP地址为192.168.200.30 其中200为重点&#xff0c;更改时为以下步骤 1、点击DHCP设置&#x…

红米1s 刷入魔趣 (Mokee)ROM(Android 7.1)

目录 背景准备工具硬件&#xff08;自己准备&#xff09;软件&#xff08;我会在文末提供链接&#xff09; 刷机步骤1. 重启电脑2. 安装驱动3. 刷入TWRP4. 清空数据5. 刷入魔趣6. 开机 结尾下载链接 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 B…

云计算技术概述_1.云计算相关概念

1.关于IBM“蓝云&#xff08;Blue Cloud&#xff09;”计划 IBM 推出的“蓝云&#xff08;Blue Cloud&#xff09;”计划为客户带来即可使用的云计算(Cloud Computing)。它包括一系列的云计算产品&#xff0c;使计算不仅仅局限在本地机器或远程Server Farms&#…

GPT3 终极指南(一)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 GPT-3&#xff0c;或者说是 Generative Pre-trained Transformer 3&#xff0c;是由 OpenAI 开发的基于 Transformer 的大型语言模型…

【R语言数据分析】数据类型与数据结构

R的数据类型有数值型num&#xff0c;字符型chr&#xff0c;逻辑型logi等等。 R最常处理的数据结构是&#xff1a;向量&#xff0c;数据框&#xff0c;矩阵&#xff0c;列表。 向量有数值型向量&#xff0c;字符型向量&#xff0c;逻辑型向量等&#xff0c;字符型向量就是反应…

书生·浦语 大模型(学习笔记-9)OpenCompass 大模型评测实战

目录 一、评测实现双赢 二、评测遇到的问题 三、如何评测大模型&#xff08;大概总结4大类方法&#xff09; 四、评测工具链及流水线 五、实战评测 GPU的环境安装 查看支持的数据集和模型 启动评测(会缺少protibuf库&#xff0c;提前安装&#xff09; 测评结果 一、评…

【linux学习指南】linux 环境搭建

文章目录 &#x1f4dd;前言&#x1f320; 云服务器的选择&#x1f320;阿里云&#x1f320;腾讯云&#x1f320;华为云 &#x1f320;使用 XShell 远程登陆到 Linux&#x1f309;下载 XShell &#x1f320;查看 Linux 主机 ip&#x1f309; XShell 下的复制粘贴&#x1f309; …

Linux下安装snaphu

1、官网下载安装包 2、解压&#xff0c;移动文件夹到/usr/local/下 3、在/usr/local/下创建man&#xff0c;在man下创建man1文件夹 4、进入到snaphu的src文件夹里&#xff0c;执行sudo make&#xff0c;如果报错 在这个 Makefile 中&#xff0c;-arch x86_64 是 macOS 特定的…

ai口语软件有合适的吗?分享4款!

在全球化日益深入的今天&#xff0c;英语作为国际通用语言&#xff0c;其重要性不言而喻。然而&#xff0c;传统的英语学习方式往往枯燥无味&#xff0c;难以持续。幸运的是&#xff0c;随着人工智能技术的快速发展&#xff0c;AI英语口语软件应运而生&#xff0c;为语言学习者…

PHP算命源码_最新测算塔罗源码_可以运营

众筹商城源码 众筹商品平台 商城加共识元富之路 网上商城众筹 前端是编译后的&#xff0c;后端PHP&#xff0c;带商城 运行截图 源码贡献 https://githubs.xyz/boot?app39 部分数据库表 CREATE TABLE ti_shopro_store (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,nam…

区块链论文总结速读--CCF B会议 ICDCS 2023 共8篇

Conference&#xff1a;IEEE 43rd International Conference on Distributed Computing Systems (ICDCS) CCF level&#xff1a;CCF B Categories&#xff1a;Computer Architecture/Parallel and Distributed Computing/Storage Systems 计算机体系结构/并行与分布计算/存储…

网络应用层之(6)L2TP协议详解

网络应用层之(6)L2TP协议 Author: Once Day Date: 2024年5月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…