摘要:本文提出并开发了高质量大规模缺陷库全自动构建方法BugBuilder,自动从版本控制系统中的人为编写的补丁中提取完整且精准的缺陷修复补丁。

本文分享自华为云社区《BugBuilder: 高质量大规模缺陷库自动构建方法》,作者:华为云软件分析Lab 。

1. 问题场景

由于各种原因,例如错误定位、软件测试、程序修复和缺陷预测,软件工程界的研究迫切需要大规模高质量的缺陷库。首先,现实世界的缺陷及其精准修复补丁对于严格评估许多自动或半自动的错误语句定位、软件缺陷数量预测以及错误应用修复方法必不可少。我们希望这些方法在现实世界的应用程序上能很好地工作,因此在这些方法广泛应用之前,必须使用大量现实世界的缺陷及其修复补丁进行评估。虽然可以通过自动变异或手动注入缺陷也可以用于评估,但他们可能与现实世界的缺陷有本质的不同,因此,根据它们得出的结论可能不适用于现实世界的缺陷。其次,有了实际缺陷及修复补丁,也可以激励研究人员提出发现、定位和修复软件缺陷的新方法。例如,通过分析大量现实世界的缺陷,研究人员可能可以找出什么样的语句更容易出错,因此他们可以在自动修复时尝试先修复此类语句,以提高程序修复的效率。再如,通过阅读人工编写的补丁,研究人员已经发现了许多常见的修复模式,并反过来利用这些模式显著提高了自动修复能力。最后,数据驱动和基于学习的程序自动修复和缺陷检测方法通常依赖大量不同的真实缺陷及精准补丁。值得注意的是,这些缺陷的质量,例如缺陷的多样性和补丁的准确性,可能会显著影响此类数据驱动方法的效果。

现有手动或半自动构建的缺陷库(如SIR、BugBench、Defects4J等)构建成本较高,缺陷规模和多样性非常有限。而全自动构建的缺陷库(如iBUGS和ManyBugs)所包含的缺陷的修复补丁质量存疑,往往包含与缺陷无关的代码变更(如重构)。

2. 我们的贡献

为解决上述问题,我们联合北京理工大学的刘辉老师团队合作共同提出并开发了高质量大规模缺陷库全自动构建方法BugBuilder,自动从版本控制系统中的人为编写的补丁中提取完整且精准的缺陷修复补丁。其工作流程如下图所示。

具体而言,对于每个缺陷修复提交,它的工作原理如下。

• 首先,识别重构操作。通过现有工具(即RefactoringMiner)识别缺陷修复提交中的重构操作,并将识别的重构操作重新应用于有缺陷的版本来去除重构。

• 其次,构造可能的修复补丁。通过枚举其余非重构变更的所有可能组合,自动生成所有潜在补丁。

• 最后,验证并选择补丁。通过执行测试用例来验证补丁的正确性,过滤掉那些未能通过测试的补丁。如果最终只有一个是有效补丁,则将其作为精准补丁。如果有多个补丁通过验证,则利用一系列启发式方法来选择最有可能的补丁(详细做法请参照论文[1])。

值得注意的是,如果人工编写的补丁由重构和缺陷修复组成,则BugBuilder会将其拆分为两个有序的补丁:重构补丁和缺陷修复补丁。这一点与Defects4J类似,Defects4J将人类编写的补丁拆分为与缺陷无关的补丁和缺陷修复补丁。

3. 方法有效性评估

本文从两个方面评估BugBuilder的有效性。

• 其一,将BugBuilder应用于Defects4J收集的809个真实缺陷修复提交中。对每一个提交,利用BugBuilder来自动提取精准补丁,如果得到了一个补丁,则将其与Defects4J中手动构造的补丁进行对比。在809个缺陷修复补丁中,BugBuilder自动生成了350个补丁,其中334个与Defects4J中手动构造的补丁完全相同。经人工分析,在剩下16个自动生成的补丁中有12个比Defects4J人工构造的补丁更完整更精确。只有4个是不准确的,主要原因是重构操作的检测不完整。可见,BugBuilder可以准确提取缺陷修复实例。

• 其二,应用上述方法构造了大规模的缺陷库GrowingBugs(https://github.com/liuhuigmail/GrowingBugRepository),包含从169个广为人知的Java应用中自动收集的1916个真实缺陷及精准修复补丁。缺陷数量是著名缺陷库Defects4J的2倍多,且在持续增长中。

4. 总结

本工作所提出的方法使得全自动构造高质量大规模缺陷库成为可能。基于该方法构建的缺陷库也可以作为Benchmark来促进缺陷相关研究。

参考文献:

[1] Jiang Y, Liu H, Luo X, Zhu Z, Chi X, Niu N, Zhang Y, Hu Y, Bian P, and Zhang L. BugBuilder: An Automated Approach to Building Bug Repository[J]. IEEE Transactions on Software Engineering, 2022.

文章来自:PaaS技术创新Lab,PaaS技术创新Lab隶属于华为云,致力于综合利用软件分析、数据挖掘、机器学习等技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。我们将聚焦软件工程领域硬核能力,不断构筑研发利器,持续交付高价值商业特性!加入我们,一起开创研发新“境界”!

PaaS技术创新Lab主页链接:https://www.huaweicloud.com/lab/paas/home.html

点击关注,第一时间了解华为云新鲜技术~

BugBuilder: 高质量大规模缺陷库自动构建方法的更多相关文章

  1. 软件测试面试-如何高质量提交缺陷bug?

    从实际工作中整理,如下:如有补充可以讨论! 所以会发现现在的面试题大部分问的都是工作中出现的场景了,而不是单纯的背诵 1:充分理解需求规则.原型图,知道预期结果,操作时判断是否为bug 解析:预期结果 ...

  2. 第二章 设计高质量的React组件

    第二章 设计高质量的React组件 高质量React组件的原则和方法: 划分组件边界的原则: React组件的数据种类: React组件的生命周期. 2.1 易于维护组件的设计要素 1.高内聚:指的是 ...

  3. Wuss Weapp 一款高质量,组件齐全,高自定义的微信小程序 UI 组件库

    Wuss Weapp 一款高质量,组件齐全,高自定义的微信小程序 UI 组件库 文档 https://phonycode.github.io/wuss-weapp 扫码体验 使用微信扫一扫体验小程序组 ...

  4. 编写高质量Python程序(四)库

    本系列文章为<编写高质量代码--改善Python程序的91个建议>的精华汇总. 按需选择 sort() 或者 sorted() Python 中常用的排序函数有 sort() 和 sort ...

  5. R语言的高质量图形渲染库Cairo(转)

    前言 R语言不仅在统计分析,数据挖掘领域,计算能力强大.在数据可视化上,也不逊于昂贵的商业.当然,背后离不开各种开源软件包的支持,Cairo就是这样一个用于矢量图形处理的类库. Cairo可以创建高质 ...

  6. Gitlab源码库里代码提交后,如何触发jenkins自动构建?

    版本库里代码提交后,如何触发jenkins自动构建?这是一个面试题,感觉自己回答的并不好,因为并没有用过这个功能,之前公司实际项目用的是svn版本管理,一般都用立刻构建,和定时任务构建(不管代码是否有 ...

  7. 基于Jenkins自动构建系统开发

    1  绪论 1.1 课题的研究背景 随着IT行业的不断发展,软件开发的复杂度也随着不断提高.与此同时,软件的开发团队也越来越庞大,而如何更好地协同整个团队进行高效准确的工作,从而确保软件开发的质量已经 ...

  8. Yeoman自动构建js项目

    Aug 19, 2013 Tags: bowergruntJavascriptjsnodejsyeomanyo Comments: 10 Comments Yeoman自动构建js项目 从零开始nod ...

  9. iOS书摘之编写高质量iOS与OS X代码的52个有效方法

    来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...

  10. Effective Python之编写高质量Python代码的59个有效方法

                                                         这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码 ...

随机推荐

  1. Kubernetes:kube-apiserver 之 scheme(二)

    接 Kubernetes:kube-apiserver 之 scheme(一). 2.2 资源 convert 上篇说到资源版本之间通过内部版本 __internal 进行资源转换.这里进一步扩展介绍 ...

  2. Python 潮流周刊#24:no-GIL 提案正式被采纳了!

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中两则分享,不代表全部内容都是该主题,特此声明. 微信 | 博客 | 邮件 | Github | Tel ...

  3. 🔥🔥面试官:你会如何设计QQ中的网络协议?

    引言 在设计QQ这道面试题时,我们需要避免进入面试误区.这意味着我们不应该盲目地开展头脑风暴,提出一些不切实际的想法,因为这些想法可能无法经受面试官的深入追问.因此,我们需要站在前人的基础上,思考如何 ...

  4. 题解 CF277A

    题目大意: 有 \(n\) 名员工,一共有 \(m\) 种语言,每名员工都会其中 \(k_i\) 种语言(\(m \ge \boldsymbol{k_i \ge 0}\)),现规定两名员工可以交流的条 ...

  5. Spring Cloud Seata 系列:Seata-Server (1.7.1)安装与配置(集成 Nacos)

    目录 一.简介 术语 事务模式 XA 模式 AT 模式 TCC 模式 Sage 模式 说明 二.Seata Server 存储模式 1.file 模式 ①修改application.xml ②启动Se ...

  6. 自学 --day9---js中的数学操作和时间日期

    typora-copy-images-to: media 一.数学处理 1.Math常用API 圆周率 Math.PI // 3.1415926535 生成随机数 Math.random() 生成的是 ...

  7. 如何理解微服务体系结构中的 CQRS

    本文翻译自 How To Understand CQRS In Microservices Architecture,原作者 OLEKSII. 问题描述 在典型的软件应用程序中,有一个负责写入和读取操 ...

  8. 【GKCTF 2020】ez三剑客

    [GKCTF 2020]ez三剑客 收获 gopher协议SSRF 多利用github搜索已存在的函数漏洞 CMS审计的一些方法 1. ezweb 打开题目给了一个输入框,能够向输入的url发送htt ...

  9. maven 配置(cmd 黑窗口执行 mvn 时默认的 settings 文件和 idea maven 相关配置)

    写在前面: 本文章用于记录博主平时遇到的问题,步骤略粗糙,目的在于记录一边后续博主自己查找,如果能帮助到其他人更好.文章中用到的链接均为自行引入,侵删,谢谢(2I2Rc*@JY8) 问题说明:在一次使 ...

  10. vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程

    这章我们讲回调,英文名:Beyond callbacks 一.章节覆盖: 回调函数及其限制,如网关/边缘服务示例所示 未来和承诺--链接异步操作的简单模型 响应式扩展--一个更强大的模型,特别适合组合 ...