BugBuilder: 高质量大规模缺陷库自动构建方法
摘要:本文提出并开发了高质量大规模缺陷库全自动构建方法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: 高质量大规模缺陷库自动构建方法的更多相关文章
- 软件测试面试-如何高质量提交缺陷bug?
从实际工作中整理,如下:如有补充可以讨论! 所以会发现现在的面试题大部分问的都是工作中出现的场景了,而不是单纯的背诵 1:充分理解需求规则.原型图,知道预期结果,操作时判断是否为bug 解析:预期结果 ...
- 第二章 设计高质量的React组件
第二章 设计高质量的React组件 高质量React组件的原则和方法: 划分组件边界的原则: React组件的数据种类: React组件的生命周期. 2.1 易于维护组件的设计要素 1.高内聚:指的是 ...
- Wuss Weapp 一款高质量,组件齐全,高自定义的微信小程序 UI 组件库
Wuss Weapp 一款高质量,组件齐全,高自定义的微信小程序 UI 组件库 文档 https://phonycode.github.io/wuss-weapp 扫码体验 使用微信扫一扫体验小程序组 ...
- 编写高质量Python程序(四)库
本系列文章为<编写高质量代码--改善Python程序的91个建议>的精华汇总. 按需选择 sort() 或者 sorted() Python 中常用的排序函数有 sort() 和 sort ...
- R语言的高质量图形渲染库Cairo(转)
前言 R语言不仅在统计分析,数据挖掘领域,计算能力强大.在数据可视化上,也不逊于昂贵的商业.当然,背后离不开各种开源软件包的支持,Cairo就是这样一个用于矢量图形处理的类库. Cairo可以创建高质 ...
- Gitlab源码库里代码提交后,如何触发jenkins自动构建?
版本库里代码提交后,如何触发jenkins自动构建?这是一个面试题,感觉自己回答的并不好,因为并没有用过这个功能,之前公司实际项目用的是svn版本管理,一般都用立刻构建,和定时任务构建(不管代码是否有 ...
- 基于Jenkins自动构建系统开发
1 绪论 1.1 课题的研究背景 随着IT行业的不断发展,软件开发的复杂度也随着不断提高.与此同时,软件的开发团队也越来越庞大,而如何更好地协同整个团队进行高效准确的工作,从而确保软件开发的质量已经 ...
- Yeoman自动构建js项目
Aug 19, 2013 Tags: bowergruntJavascriptjsnodejsyeomanyo Comments: 10 Comments Yeoman自动构建js项目 从零开始nod ...
- iOS书摘之编写高质量iOS与OS X代码的52个有效方法
来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...
- Effective Python之编写高质量Python代码的59个有效方法
这个周末断断续续的阅读完了<Effective Python之编写高质量Python代码 ...
随机推荐
- DevOps2023现状报告|注重文化、以用户为中心是成功的关键
Google Cloud DORA 团队的一份新研究报告强调了企业文化和关注用户作为成功软件交付支柱的重要性. 2023 DevOps 状况报告分析了过去 9 年来通过此类最大规模调查收集的全球 36 ...
- AI图形算法的应用之一:仪表识别
目前AI智能算法如火如荼,各大型厂商对此趋之若鹜般加大开发力度,比如大华.海康这些视频处理类,以及百度.腾讯这些IT软件厂商,因为业务开展需要,我也把研发方向转向于此,小有成绩,在此展示一下. 最近研 ...
- .Net中的内存泄露
.Net中的内存泄露 说明: 虽然已经有GC垃圾回收器在工作,但是还是会出现内存泄露. 内存碎片 费托管内存泄露比托管内存泄露更加严重.GC可以移动托管内存,为其他对象腾空间.但是非托管内存将永远的卡 ...
- 一文读懂强化学习:RL全面解析与Pytorch实战
在本篇文章中,我们全面而深入地探讨了强化学习(Reinforcement Learning)的基础概念.主流算法和实战步骤.从马尔可夫决策过程(MDP)到高级算法如PPO,文章旨在为读者提供一套全面的 ...
- 自定义xunit测试用例的执行顺序
有的时候我们会对程序进行单元测试, 为了测试的效果以及后期的维护, 我一般会将各个测试拆开, 根据需要测试的类分到各个类型中, 不过在实际操作的时候就出现了一些意想不到的问题, 各个测试的执行是乱序的 ...
- 字符串转换整数(atoi)(4.3leetcode每日打卡)
一堆if不及python的一个正则表达式系列 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止.接下来的转化规 ...
- C++ MiniZip实现目录压缩与解压
Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法.它最初由Jean-Loup Gailly和Mark Adler开发,旨在成为一个高效.轻量级的压缩库,其被广泛应用于许多领域,包括 ...
- Mysql报:error while loading shared libraries libtinfo.so.5的解决办法
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin #.今天闲来无事,想在Anolis8的系统上装一个MySQL8.0玩.前期在安装和配置的过程中没有什么问题,但是在我想 ...
- 黑客玩具入门——2、Kali常用命令与简单工具
一.Linux常用命令 首先,我们启动kali系统,然后点击这里的命令行工具. 就可以使用下面学习的命令了,另外,如果你有过计算机基础,那么Mac的terminal和Git的gitbash,都是可以练 ...
- Visual Studio安装教程
一.官网下载 地址:下载 Visual Studio Tools - 免费安装 Windows.Mac.Linux (microsoft.com) 二.安装 1.双击开始安装 2.等待一段时间,打开配 ...