摘要:本文提出并开发了高质量大规模缺陷库全自动构建方法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. 虹科技术|Redis企业版数据库:实现金融服务IT现代化!

    随着新冠肺炎和技术创新推动企业进入新的数字时代,金融行业客户现在需要一种快速.简单且根据需求量身定制的数字银行体验.这就需要银行进行转型,以提供更加数字化的服务,但无论战略.方法,还是满足消费者极高期 ...

  2. RLChina2022公开课-博弈论

    纯博弈: 单纯的动机组合,离散的集合 混合博弈: 加入了概率论,以百分比的概率执行不同的的动机.,概率分布 零和博弈.合作博弈.协同博弈 扩展博弈和非完美信息 扩展博弈.贝叶斯博弈 纳什均衡 任何一位 ...

  3. List、Set与 Map

    目录 1. List接口和常用方法 1.1 List接口基本介绍 1.2 List接口的三种遍历方式 2. ArrayList 2.1 注意事项 2.2 ArrayList的底层操作机制源码分析(重点 ...

  4. C++对拍模版

    Windows check.cpp #include <bits/stdc++.h> using namespace std; int main() { while( true ) { s ...

  5. 记录一下我的ctf比赛的web题目

    Web之getshell: 具体代码如下 <?php highlight_file(__FILE__); error_reporting(0); echo "<h1>WEL ...

  6. 递归与分治思想:治思想 && 折半查找法(迭代 && 递归)

    1 //分治思想:将大问题拆成小问题逐一解决 2 //折半查找法:不断缩小一半查找的范围,知道达到目的,效率较高. 详情见:https://fishc.com.cn/thread-27964-1-1. ...

  7. .NET8 Blazor的Auto渲染模式的初体验

    .NET8发布后,Blazor支持四种渲染方式 静态渲染,这种页面只可显示,不提供交互,可用于网页内容展示 使用Blazor Server托管的通过Server交互方式 使用WebAssembly托管 ...

  8. 手把手教Electron+vue,打包vue项目,打包成桌面程序。

    1.现如今前端框架数不胜数,尤其是angular.vue吸引一大批前端开发者,在这个高新技术快速崛起的时代,自然少不了各种框架的结合使用.接下来是介绍electron+vue的结合使用. 2.Elec ...

  9. Codeforces Round 903 (Div. 3)

    Codeforces Round 903 (Div. 3) A. Don't Try to Count 大概题意给你两个字符串a,b.a串可进行的操作为将整个a串复制到之前的a串后面(直接用a+a即可 ...

  10. Kernel Memory 入门系列:文档预处理

    Kernel Memory 入门系列:文档预处理 Embedding为我们提供了问题理解和文档检索的方法,但是面对大量的文档,如果在用于提问的时候再进行文档的Embedding的话,那这个过程是非常耗 ...