Page 59 - 《软件学报》2021年第9期
P. 59
姜佳君 等:软件缺陷自动修复技术综述 2683
与 IntroClass 类似,CodeFlaws 数据集来自于在线编程竞赛平台 Codeforces.该数据集中共包含 3 902 个程序
缺陷,其中每个缺陷都存在对应的未通过测试.与其他数据集不同,CodeFlaws 根据程序的代码修改将所有的程
序缺陷划分为了 39 个缺陷类型,可以用来研究不同修复工具对特定类型缺陷的修复效果.
DroixBench 数据集包含来自 15 个开源 Android 软件的 24 个可复现的运行崩溃缺陷,特别地,该数据集中的
程序缺陷均涉及用户界面(UI).
QuixBugs 数据集包含 Python 和 Java 两种语言的缺陷程序,其中 40 个 Python 缺陷程序来自于 Quixey 公司
测试题目,程序代码为几行到几十行不等,且每个代码缺陷只涉及一行代码修改.其中的 Java 缺陷程序由人工编
写,与上述 Python 缺陷程序一一对应.与 IntroClass 类似,该数据集同样是采用“输入-输出”样例的形式描述程序
的规约.
Bugs.jar 是继 Defects4J 之后的一个更大的 Java 语言程序缺陷数据集,该数据集包含 8 个 Apache 开源项目
中的 1 158 个程序缺陷.为了提升缺陷程序的多样性,不同的项目涉及不同的应用场景,如数据库、常用库、Web
框架等.此外,除了包含触发程序缺陷的测试,Bugs.jar 中还包含对应缺陷的问题编号(issue id)以及缺陷报告(bug
report),可以用来追溯对应缺陷在项目问题追踪系统(issue tracking system)中的记录.
Bears 是由 Madeiral 等人 [113] 提出来的 Java 缺陷程序数据集.相比于上述的数据集,其特点是易于扩展.它通
过检测 GitHub 上开源项目的持续集成(continuous integration)构建结果,自动识别不能通过测试的缺陷代码版
本.因此,用户可以根据需要扩展数据集.其初始版本(v1.0)包含 72 个项目中的 251 个程序缺陷.
与 Bears 类似,BugSwarm 采用同样的策略不断扩展数据集的大小.截止其论文发表,BugSwarm 已经搜集了
3 091 个 Java 和 Python 程序缺陷,并执行周期性检测,不断扩展其数据集大小.
根据上面的介绍可以发现,缺陷程序的数据集在向着多语言、多种类、大规模演化.然而,目前使用较广泛
的数据集依然比较集中(Defects4J 居多).其原因可能包含以下两点:(1) 使用相同的数据集方便不同方法对比验
证;(2) 数据集的易用性.然而,单一的数据集可能会导致自动修复方法面临过拟合问题,而影响其效果的客观评
价.因此在未来的研究中,不同的数据集应该被利用起来,同时需要考虑实用化的工业生产环境.
4.2 开源缺陷修复工具
工具是验证算法有效性的重要支撑,可以为其他研究人员学习其方法以及对比新技术提供方便.自动修复
工具代码开源为后来研究者搭建了好的平台,可以促进该领域的发展.表 2 列出了 2016 年至今的一些开源缺陷
修复项目,包含自动修复工具的名称、对应发表论文、发表时间、针对的编程语言、所属的修复技术分类以及
下载链接.在该表格中,我们使用 HS(heuristic search)、MT(manual template)、SC(semantic constraint)和 SA
(statistical analysis)分别代表基于启发式搜索、人工修复模板、语义约束和统计分析的自动修复技术.特殊地,
DiffTGen 通过生成测试对候选的修复补丁进行过滤,该方法本身不能自动生成修复补丁,因此无分类项.此外,
一些开源项目(如 Astor)集成了多个自动修复工具,此时,其分类为所有工具分类的并集.根据表中的引用可以检
索对应修复工具的具体算法描述,下载地址可以方便阅读者检索和下载.
5 总 结
缺陷自动修复由于有希望将开发者从繁重的程序调试过程中解脱出来而受到越来越多的关注,众多的缺
陷修复技术被先后提出.本文针对缺陷自动修复相关的文献进行了系统的整理.对最近 10 年间论文的发表情况
进行了详细的分析.特殊地,本文针对 2016 年至今基于测试的缺陷自动修复技术进行了详细的分析和总结.根
据缺陷修复技术在补丁生成阶段所使用的不同方法,本文将自动修复技术系统性地分为 4 类.相比已有的综述
论文,本文首次提出了基于统计分析的缺陷修复技术类别,对已有的技术分类进行了补充.此外,本文对目前该
领域研究所面临的挑战做了分析和总结,对未来的研究具有指导意义.最后,本文对缺陷修复领域常用的数据集
和开源修复工具进行了整理和归纳,方便读者引用.