BugBuilder: 高质量大规模缺陷库自动构建方法
摘要:本文提出并开发了高质量大规模缺陷库全自动构建方法BugBuilder,自动从版本控制系统中的人为编写的补丁中提取完整且精准的缺陷修复补丁。
本文分享自华为云社区《BugBuilder: 高质量大规模缺陷库自动构建方法》,作者:华为云软件分析Lab 。
1. 问题场景
由于各种原因,例如错误定位、软件测试、程序修复和缺陷预测,软件工程界的研究迫切需要大规模高质量的缺陷库。首先,现实世界的缺陷及其精准修复补丁对于严格评估许多自动或半自动的错误语句定位、软件缺陷数量预测以及错误应用修复方法必不可少。我们希望这些方法在现实世界的应用程序上能很好地工作,因此在这些方法广泛应用之前,必须使用大量现实世界的缺陷及其修复补丁进行评估。虽然可以通过自动变异或手动注入缺陷也可以用于评估,但他们可能与现实世界的缺陷有本质的不同,因此,根据它们得出的结论可能不适用于现实世界的缺陷。其次,有了实际缺陷及修复补丁,也可以激励研究人员提出发现、定位和修复软件缺陷的新方法。例如,通过分析大量现实世界的缺陷,研究人员可能可以找出什么样的语句更容易出错,因此他们可以在自动修复时尝试先修复此类语句,以提高程序修复的效率。再如,通过阅读人工编写的补丁,研究人员已经发现了许多常见的修复模式,并反过来利用这些模式显著提高了自动修复能力。最后,数据驱动和基于学习的程序自动修复和缺陷检测方法通常依赖大量不同的真实缺陷及精准补丁。值得注意的是,这些缺陷的质量,例如缺陷的多样性和补丁的准确性,可能会显著影响此类数据驱动方法的效果。
现有手动或半自动构建的缺陷库(如SIR、BugBench、Defects4J等)构建成本较高,缺陷规模和多样性非常有限。而全自动构建的缺陷库(如iBUGS和ManyBugs)所包含的缺陷的修复补丁质量存疑,往往包含与缺陷无关的代码变更(如重构)。
2. 我们的贡献
为解决上述问题,我们联合北京理工大学的刘辉老师团队合作共同提出并开发了高质量大规模缺陷库全自动构建方法BugBuilder,自动从版本控制系统中的人为编写的补丁中提取完整且精准的缺陷修复补丁。其工作流程如下图所示。
![](https://pic1.zhimg.com/80/v2-e6eba8d9a13c06d3ea5c820dbd17b5e4_720w.webp)
具体而言,对于每个缺陷修复提交,它的工作原理如下。
• 首先,识别重构操作。通过现有工具(即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
相关文章
- PHPstorm8 自动换行设置方法
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
- TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对
- 【小程序】微信小程序修改后不自动编译的解决方法
- 最简单的让Python程序运行完后命令行窗口(cmd窗口)不自动关闭的方法
- JAVA类和方法的注释自定义自动生成(IDEA)
- C/C++中string和int相互转换的常用方法
- 已commit还没push,撤销commit方法
- ThinkPHP 3.2.3 自动加载公共函数文件的方法
- 页面加载时自动执行(加载)js的几种方法
- javascript中数组的map方法
- 连上Wi-Fi 热点自动弹窗的实现方法
- Eclipse输入Java和XML代码自动提示功能最简单的方法
- Linux自动登陆的设置方法
- 转 Windows 7设置定时自动执行任务方法
- iOS中AutoLayer自动布局流程及相关方法
- 《软件建模与设计: UML、用例、模式和软件体系结构》一一1.9 面向对象分析和设计方法的发展
- 再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(1) —— Firefox浏览器下自动运行游戏篇 (续)
- 【转载】 Ubuntu 中开机自动执行脚本的两种方法
- 加密算法使用(二):使用MD5加密字符串(另:byte数组转16进制自动补零方法写法)
- 自动驾驶轨迹预测20年发展全面回顾(物理方法/机器学习/深度学习/强化学习)
- Unity Android 之 在 Unity 中直接调用打开其他应用apk的方法实现
- 《C#零基础入门之百识百例》(三十二)方法参数 -- 引用&输出参数 -- 两数交换
- C#设计模式 之 工厂方法模式
- Linux系统下fd分配的方法
- jquery each函数对应的continue 和 break方法
- Mybatis自动生成Xml文件,针对字段类型为text等会默认产生XXXXWithBlobs的方法问题
- VS 性能优化方法
- 设计模式 - 模板方法
- 有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?