Page 58 - 《软件学报》2021年第9期
P. 58
2682 Journal of Software 软件学报 Vol.32, No.9, September 2021
• 工业场景中的实用性问题
根据之前的介绍,现有的通用自动修复方法主要是基于测试的方法.然而在真实的工业生产环境中,依赖的
未通过测试用例并不能保证存在.另一方面,由于自动修复方法生成补丁的正确率和质量(可读性和可维护性)
依然难以保证,其补丁最终依赖于人工验证.相比于人工修复,使用自动化的修复方法是否会更高效,目前缺少
系统性的对比研究.此外,已有的研究主要在实验环境下、少数的数据集上验证方法的有效性.已有研究 [104] 将自
动修复工具应用到工业场景中,实验结果与实验环境相差较大.因此,更加全面地验证自动修复方法的有效性,
是评估其实用性的重要方面.近几年,尽管更多丰富的实验数据集被提出(参考第 4.1 节),但被使用的频率相对较
低.其中的一个主要原因是不同的数据集所依赖环境不兼容,适配对应的方法会引入较大的时间开销.因此,设
计和开发统一的、易于扩展的、模拟真实工业生产环境的通用缺陷修复平台,有利于验证和对比不同自动修复
方法的有效性,促进修复技术的实用化研究进程.
4 缺陷修复数据集和开源修复工具总结
本节总结缺陷自动修复研究领域常用的基准数据集(benchmark)以及重要的开源缺陷自动修复工具.
4.1 常用缺陷数据集
表 1 中列出了自动修复领域常用的缺陷数据集,表中给出了每个数据集所对应的参考文献、发表时间、缺
陷程序涉及语言、数据来源以及下载地址链接,方便之后的研究人员下载使用.
Table 1 Benchmarks for automatic program repair
表 1 缺陷修复验证数据集
名称 参考文献 发表时间 语言 数据来源 下载地址
Defects4J [43] 2014 Java 开源项目 https://github.com/rjust/defects4j
ManyBugs [108] 2015 C/C++ 开源项目 https://github.com/squaresLab/ManyBugs
IntroClass [108] 2015 C/C++ 学生作业 https://github.com/BugZooOrg/IntroClass
IntroClassJava [109] 2016 Java IntroClass 的 Java 版本 https://github.com/Spirals-Team/IntroClassJava
CodeFlaws [110] 2017 C/C++ Codeforces 编程竞赛 https://codeflaws.github.io/
DroixBench [62] 2017 Java 开源项目 https://github.com/stan6/droixbench
QuixBugs [111] 2017 Java/Python Quixey 公司测试题目 https://github.com/jkoppel/QuixBugs
Bugs.jar [112] 2018 Java 开源项目 https://github.com/bugs-dot-jar/bugs-dot-jar
Bears [113] 2019 Java 开源项目 https://github.com/bears-bugs/bears-benchmark
BugSwarm [114] 2019 不限 开源项目 http://www.bugswarm.org/
目前,使用最为广泛的是 2014 年 Just 等人 [43] 提出的 Defects4J 数据集.该数据集早期版本(v0.1.0)包含来自
5 个开源项目的 357 个真实程序缺陷,该部分缺陷也是目前被广泛使用验证缺陷修复工具效果的对象.该数据集
中的每个程序缺陷包含至少一个未通过的测试可以触发程序中的缺陷,其中部分未通过测试来自于原始的程
序缺陷报告,部分未通过测试是开发者在修复对应缺陷时新添加的(详见第 3 节中的讨论).近几年,该数据集在
不断地扩充,最新的 v2.0.0 版本已经扩展到 17 个项目共 835 个缺陷.
ManyBugs 数据集是由 LeGoues 等人 [108] 提出来的 C/C++语言程序缺陷,该数据集中共包含来自 7 个开源项
目的 185 个真实程序缺陷.其中,每个缺陷程序都有至少一个未通过的测试触发程序中的缺陷,且未通过测试均
由项目的开发者编写.相比表 1 中其他 C/C++语言缺陷数据集,ManyBugs 中的项目规模最大.与此不同,LeGoues
等人同时提出的 IntroClass 数据集来自于本科生的课程编程任务,共包含 998 个学生提交的缺陷程序,涉及 6 个
编程任务.此外,程序代码的规模比较小,一般仅有 5 行~20 行代码.类似地,IntroClass 中的每个任务通过多个“输
入-输出”样例来描述程序的规约.每个缺陷程序被至少一个测试样例所触发.
IntroClassJava 是 IntroClass 数据集的 Java 语言版本,由 Durieux 和 Monperrus [109] 通过人工定义转换规则,
使用脚本自动化将 C/C++语言程序转换为 Java 程序.此外,他们将 IntroClass 中的“输入-输出”样例转换成了可
执行的 Junit 单元测试.在转换的过程中,由于删除了其中的部分重复程序以及未能正确转换的程序,最终数据集
中包含 297 个缺陷程序.