LLM可以解密Bug报告吗?

互联不一般哥 2024-06-28 18:56:39

Can LLMs Demystify Bug Reports?

Laura Plein1, Tegawendé F. Bissyandé1

1University of Luxembourg

引用

Plein L, Bissyandé T F. Can llms demystify bug reports?[J]. arXiv preprint arXiv:2310.06310, 2023.

论文:https://arxiv.org/pdf/2310.06310

摘要

本研究的主要焦点为:如果ChatGPT能够理解漏洞报告并复现它们会怎样?为了评估ChatGPT是否能够捕捉漏洞报告的语义,我们使用了流行的Defects4J基准测试和其漏洞报告。我们的研究表明,ChatGPT能够解密并复现50%的报告漏洞。ChatGPT能够自动处理一半报告的漏洞,显示出将机器学习应用于漏洞处理的潜力,并且只需一个人参与报告漏洞。

1 引言

软件用户应该提供他们运行程序的经验反馈。这样的反馈通常会促使开发人员对功能请求和错误报告进行各种改进。在这方面,开发平台(例如 GitHub)提供了工具支持,用于收集报告并持续监控开发人员如何处理它们。不幸的是,各种研究表明错误报告被低估了。事实上,研究人员和从业者经常指出这些报告的一般质量问题:开发人员投入了大量精力来“理解”和复现报告的潜在错误;研究人员努力构建自动捕捉自然语言文本语义并将其转化为现有(测试)框架可执行输入的工具。

随着自然语言处理技术的最新进展,例如大型语言模型(LLMs)的出现,许多任务已经看到机器学习实现甚至超越了人类的表现。机器翻译特别活跃,已经超越了语言翻译。例如,在软件工程领域,已经有几个研究方向探讨了利用自然语言输入生成编程工件及反之的可行性。文献中已经记录了代码摘要、程序修复甚至程序合成等领域的一些里程碑。然而,对错误报告的研究却很少。然而,通过分析错误报告自动化错误重现具有巨大的价值。在这项工作中,我们提出研究利用LLM来重现错误的可行性。我们将重点放在ChatGPT上,这个模型最近受到了很多关注,并且具有其模型在大量自然语言文本和软件程序源代码上进行训练的优势。但是,ChatGPT能否揭示错误报告的奥秘呢?我们将错误报告的管理视为一个示例案例,机器学习可以在其中帮助,同时保持人类参与。

“揭示错误报告的奥秘”暗示了最终可能重现报告的错误的可能性。因此,我们的提示集中在要求ChatGPT利用错误报告的文本内容(用自然语言)生成一个正式的测试用例(用编程语言)。我们假设如果ChatGPT能够生成一个不仅可执行而且在相关错误版本的程序上失败的测试用例,那么ChatGPT可能已经“揭示了”(在“捕捉用户报告的不希望的执行行为的语义”意义上)错误报告的内容。显然,这个假设过于粗略,因为生成的失败测试用例可能基于与报告的错误无关的随机输入。然而,这将是基于用户输入的自动生成测试用例的第一个里程碑,反映了一个真实而复杂的用户体验。

2 实验评估

2.1 实验设置

研究问题。在本文中,我们研究以下研究问题:

RQ1:评估ChatGPT是否能够从错误报告中生成测试用例?

评估数据集。我们考虑了Defects4J代码库,其中包含了来自各种Java软件开发项目的真实故障,如表1所列。我们收集了与这些故障相关的错误报告。必须提及并非所有的错误报告都是可用的,有些错误报告可能会引用同一个错误,这种情况下,我们只考虑一次,以避免结果因重复而产生偏差。我们选择Defects4J是因为它在软件测试和软件研究社区中被广泛采用。

对比方法。我们依赖于ChatGPT API(版本3.5)进行实验。我们构造的提示信息由两部分组成:指示和错误报告。对于所有查询ChatGPT的请求,指示都是唯一的,并且如下所示:“为以下错误报告编写一个Java测试用例:”。对于错误报告,我们的可行性研究考虑不对错误报告进行预处理,并且信息中不包括跟进评论或附件。对于每个提示,我们请求ChatGPT五次,并评估生成的不同测试用例。在实践中,在运行生成的测试用例之前,ChatGPT的输出将被解析以清除其中的自然语言文本(例如解释),以避免编译失败。然后,测试用例被系统地包含在测试套件中,并由Defects4J测试管道完全执行。然后记录执行结果,以便我们计算可执行性和有效性指标。

评估指标。可执行性:ChatGPT生成的测试用例可能甚至在语法上都不正确,无法编译和执行。虽然通常情况下,经过手动进行一些小修改(例如,添加相关的导入),生成的测试用例可以被制作成可执行的,但我们保守地认为可执行性是一个二元指标,并且在ChatGPT输出产生后自动计算(不添加任何手动更改)。

有效性:可执行的测试用例可能会在目标错误程序上成功或失败。我们遵循程序修复中的补丁验证惯例,并且仅当生成的测试用例确实在错误程序上失败时才将其视为有效。否则,将其视为无效。

表1: 本研究使用的Defects4J中的Java项目

RQ2 评估CHatGPT是否能够从错误报告中生成测试用例

实验设计。图2提供了一个Bug报告(来自CLI项目)及其相关的正式测试用例(在Defects4J中的真实情况以及由ChatGPT生成的情况)的示例。正如我们在这个例子中所看到的,ChatGPT能够从Bug报告中复现出一个正式测试用例,这可以启用各种软件自动化任务,如基于频谱的故障定位、程序修复中的补丁验证,以及更一般的自动化软件测试。

结果。在Defects4J数据集上,我们计算了ChatGPT能够成功生成测试用例的Bug报告的比例。表2总结了这些指标。在所有项目中,平均而言,对于50%的Bug报告,我们获得了可执行的测试用例。生成的测试用例的有效性在不同项目之间变化很大,这可以通过用户编写的Bug报告的不同来源和格式来解释。不幸的是,一些Math项目版本的一个普遍问题是测试套件可以编译,但其执行却永无止境。因此,有10个Math Bug报告我们无法确定生成的测试用例的有效性,这解释了该项目的较低有效性结果。总的来说,我们为30%的Bug报告得到了有效的测试用例,这是非常令人鼓舞的。在可执行的测试用例中,我们观察到59%是有效的。这表明一旦初始的可执行性挑战被克服,由ChatGPT生成的测试实际上是有效的,突显了其理解能力。这意味着ChatGPT能够捕捉用户编写的Bug报告的语义,并将其转换为触发Bug的测试用例。这些结果极大地激励了进一步在这个领域的研究。进一步的手动调查还表明,在大多数情况下,可执行性和有效性都可以通过一些微小的修改来修复(例如,添加相关的导入或更改重复的函数名称)。此外,一些Bug报告非常简短(只有一行),并且不描述问题;这些情况大多会导致不可执行和无关紧要的测试用例。

(a)Bug报告

(b)生成测试用例

(c)原始的错误触发测试案例

图2: 来自Defects4J的Cli 17示例

转述:丁自民

0 阅读:0

互联不一般哥

简介:感谢大家的关注