![](https://csdnimg.cn/release/download_crawler_static/15894944/bg2.jpg)
软件学报
程序 bug 是软件开发中不可避免的产物,其产生原因可以追溯到软件开发的各个阶段.历史数据表明,超过
45%的现代软件开发成本消耗于定位和修复 bug 过程中
[1]
.无论工业生产还是学术研究领域,定位和修复程序
bug 都是软件工程的核心问题.随着软件测试和调试技术的提高,自动化的程序 bug 定位技术已经得到了一定的
研究和发展
[2],[3]
,然而自动化的程序 bug 修复方法仍处在初级阶段.随着程序 bug 数量的日益积累,自动修复技
术的深入研究及应用已迫在眉睫.据已有数据显示在 2001 至 2010 十年间,开源软件项目 Eclipse 共接受了
333,371 个提交的 bug,平均每天新增 76 个 bug
[4]
.为了提高软件质量,并改进软件产品,开发者不得不耗费大量的
人力和资源修复软件中的问题.
为了降低修复过程中的时间和人力成本,自动程序修复(automatic program repair)方法应运而生.该方法依
据给定的程序问题,自动生成程序补丁(patch),进而修复程序中的错误.修复中产生的程序补丁既可以自动添加
到程序中,也可以用于指导开发者继续改进代码.与现代软件工业中的广泛出现的敏捷开发(agile development)
和持续集成(continuous integration)相结合,自动程序修复方法将有效的降低程序修复的成本.从技术角度,研究
者将程序修复看作从潜在的搜索空间(search space)中搜索补丁的过程,而优秀的修复技术可以大幅度提高补丁
搜索的准确率并减少用于搜索的时间消耗
[5],[6]
.该研究思路与基于搜索的软件工程契合
[7]
.例如,自动程序修复
中的先驱方法,GenProg,就是一种基于遗传规划(genetic programming)的 C 程序修复算法
[8]
.
由于程序自身的复杂性,自动程序修复的研究面临着一系列挑战.一方面,研究者尝试设计算法为程序自动
生成补丁,而所生成的补丁与真实人工添加的补丁尚存较大差别.另一方面,研究者正在探索自动修复的实证基
础(empirical foundation),然而该研究并非一帆风顺,曾在 2014 年
[9]
和 2015 年
[10],[11]
掀起了两次领域内的学术争
论.
本文中为避免歧义,如无特别说明,本文的研究主题( 即自动程序修复), 专指基于测试集的修复方法
(test-suite based repair)
[9]
.在基于测试集的修复中,测试集(test suite)用于描述并限定程序的正确行为(program
behavior).任何自动生成的补丁,应至少保障测试集正确运行(passing the test suite),以确认未违反程序的需求说
明.自动程序修复研究中的绝大多数成果都属于基于测试集的修复领域.
截至本文成文之际(2015 年 8 月 31 日),自动程序修复方法尚未有工业应用.本文回顾了该领域的研究历史,
从修复方法和实证研究基础两个主要方面,详述程序修复的现有研究进展,以及所面临的机遇和挑战.本文选取
的文献试图覆盖自动程序修复领域自 2008 年来累计八年的主流工作.需要提及的是,虽然该领域的国内研究相
对于国际同行较为滞后,但来自国防科技大学
[12],[13],[14],[15],[16]
和上海交通大学
[17]
的研究者已发表了优秀成果,
将在后文介绍.
本文首先概述了自动程序修复的研究背景;其次通过检索和筛选相关文献简要的回顾了研究历史;然后分
两个方面介绍了本文的主要部分,自动修复方法的研究进展和程序修复的实证研究基础;再次作为补充,简要介
绍了与程序修复直接相关的技术;最后,分析了自动程序修复研究面临的机遇和挑战.
1 概述
1.1 基于测试集的程序修复
基于测试集的程序修复(test-suite based repair,简称为程序修复),旨在自动生成能够通过测试集中全部测试
用例(test case)的程序补丁.该类方法主要以白盒(white-box)形式呈现,即被修复程序的源代码和测试用例对自
动修复方法完全可见.一个程序修复方法的输入通常是带有 bug 的程序(buggy program)和它当前的测试集,并
且至少有一个测试用例因为 bug 而无法通过(fail).修复方法的输出为零个或一个程序补丁(有的方法可以输出
多个补丁).生成零个补丁表示该方法无法自动修复程序.
处理程序并非易事.程序的需求信息(requirements)通常以自然语言描述,如项目文档或程序接口文档,这些
信息无法被直接翻译为程序输入;另一方面,程序的形式化的规格说明(specifications)也难以充分获取.因此,源
代码结构和测试集中的测试用例成为修复程序的主要输入来源.获得可修复 bug 的代码补丁,实际上就是生成
评论0
最新资源