Automatic Software Repair: a Bibliography 自动软件修复概览(一)

原论文标题《Automatic Software Repair: a Bibliography》

原作者 Martin Monperrus,主页:https://www.monperrus.net/martin/

发表于 ACM Computing Surveys, 2017

原文链接:https://arxiv.org/pdf/1807.00515.pdf

此翻译已获得原作者授权

译者:ClarkC.

引用请注明出处

 

感谢原文作者Martin Monperrus教授提供翻译授权。鉴于原文较长,该翻译将分为四次上传。第一次为原文开头至第二节结尾,第二次为原文第三节,第三次为原文第四节,最后一次为原文第五、六、七节。原文中的参考文献可至原文中查看,原文链接附在开头与结尾。

 

自动软件修复:概览

Martin Monperrus

2017年6月3日发表在ACM Computing Surveys

摘要本文介绍了有关自动软件修复的研究。自动软件修复是指无需人工干预,自动找到软件bug并给出解决方案。本文考虑了各种修复方法。首先,我们讨论了行为修复,其中输入测试套件,规则,模型,崩溃作为预期结果(oracle)。其次,讨论了状态修复,也称为运行时修复或运行时恢复,其中包括检查点和重新启动,重新配置,不变还原等技术。本文的独特之处在于它涵盖了为这一知识体系做出贡献的多个研究社区,包括软件工程,软件可靠性,操作系统,编程语言和软件安全性。本文提供了有关文献中所使用的bug预见和修复操作的,新颖且结构化的概述。

 

1.引言

本文是有关自动软件修复的参考性综述。自动软件修复是指无需人工干预,自动找到软件bug并给出解决方案1。这种做法非常重要而且充满挑战性。说它重要是因为世界对软件的依赖度很高而且在逐步上升2,但是随之而来的是很多软件所携带的bug也越来越多。我们日常使用的软件有时会崩溃,有时会给出错误结果,最坏的时候甚至会导致人死亡[86]。目前的软件有数以百万记的bug,并且每天开发的大量新软件又会带有许多bug。综上所述,即使自动软件修复只能修复其中的少部分bug,它也将为人类和社会带来价值。

自动软件修复具有挑战性,因为修复bug本身就是一项艰巨的任务。当然,有些简单的小bug(如Knuth所说的“过失”[81])可以轻易解决。但是,无论对于专业人士还是业余爱好者,那些需要程序员花费数小时,几天甚至几周才能理解和修复的bug,才是最可怕的bug [42]。对于这种bug,自动修复是一项极具挑战性的任务。

本文的目的是描述自动软件修复的概况,旨在将自动修复技术的两大主要家族:行为修复与状态修复,结合在一起。前者是关于自动修改程序代码的,后者是关于在运行时自动修改执行状态。本文的主要受众是计算机科学领域的研究人员,重点关注为这一知识体系做出贡献的各种研究社区:软件工程,软件可靠性,操作系统,编程语言和软件安全性。针对不同的领域还提供了有关自动修复背后的关键概念的介绍性解释,对于从业者和好奇的学生来说,可能会引起极大的兴趣。这篇综述旨在涵盖自动软件修复领域中的所有重要研究,并强调经验主义:其涵盖的技术必须是已经应用于工业上的项目,以及在实践中发生的bug。研究包括以下内容:对于每篇论文,其重要性取决于其所刊载机构的知名度和声誉,或是论文中想法的新颖性。如果几篇论文包含相同的思想,则仅讨论和引用其中最具代表性的。要注意的是,同一概念“修复”在文献中有几种不同的叫法:“patch”, “fix”, “heal”, “recover”等。表I列出了主要术语,以及使用该术语的著名参考示例。本文中使用“repair”,是因为程序本质上具有机械性,非常适合“repair”一词的日常使用。同样,该领域大多数优秀论文也使用该名称。

据我所知,没有与本文相似的综述性文章。Le Goues等人[91]的回顾性论文很接近,但 只涵盖了本文的一小部分,并且仅涉及行为修复。与之相反的是,Rinard的论文[146]只专注于运行时修复。当然,相关领域中也有一些综述性论文,例如容错[178],故障定位[152, 190],算法调试[161]等。

综上所述,本文的贡献是对自动软件修复的综述:

  1. 该综述涉及不同的研究领域,涵盖了以下社区的贡献:软件工程,软件可靠性,操作系统,编程语言和软件安全性。同样,使用了抽象术语(自动修复,自我修复,自动恢复等)。

  2. 该综述根据读者执行的修复类型(行为修复与状态修复)和希望的预期结果为读者提供了深入的文献分析。

本文的其余部分内容如下。第2节简要介绍了自动修复的核心概念。第3节讨论行为修复的主要方法,第4节讨论状态修复。第5节专门介绍了旨在了解自动修复基础的经验性工作。第6节是对与自动修复非直接相关论文的说明。

 

1对硬件错误的自动修复和容错超出了本文的范围。

2硅谷的企业家Marc Andreessen这样说(software has eaten the world)。

 

 

2. 自动修复的核心概念

自动修复是与bug紧密相关的。文献中充斥着“bug”的同义词:“defect”,“fault”,“error”,“failure”,“mistake”等。关于“fault”,“error”,“failure”有着公认的定义[9]:“failure”是指一种被观察到的不可接受的行为;“error”是指“failure”之前正在传播的错误状态(尚未引起注意);“fault”是指引发“error”的根本原因(尤其是错误代码)。尽管这三个概念相对清晰,但很难说所有论文(甚至包括最新发布的)都遵循了这些定义。此外,如果仅考虑与修复相关的文献,则“自动修复failures”,“自动修复errors”和“自动修复faults”之间绝对不会出现歧义。但是在本文中,我们需要一个通用的术语来概括前面单词的含义。“bug”由于其直观性和广泛用途而被使用,其定义如下:“bug”是程序执行中实际发生的情况与预期行为之间的偏差3

“bug”的这种定义涉及“行为”,“执行”,“程序”的概念,但其中还一个隐含要素:判断行为是否是意料之外的观察者或参考点。这里的“观察者”显然可以是人类用户,说“此输出不正确”。从一般的意义上讲,“观察者”也是一种规范(specification),指一组预期的行为。规范有多种存在形式:它可以是自然语言文档,形式逻辑公式,测试套件等。它甚至可以是隐式的,例如对于许多程序而言,“任何输入都不能使得程序崩溃”的规范适用于许多程序,而通常不会被写明。在某种程度上,用户说“此输出不正确”,其实是在说其不符合规范。因此,自动修复始终是基于规范的,于是我们可以给出自动修复定义:自动修复是根据规范将程序执行的不可接受行为转换为可接受的行为。

预期结果是一种比较接近规范的概念。简而言之,预期结果决定程序执行的结果是否正确[169]。从这个角度理解,规范和预期结果有着相同的概念:期望,可接受性与正确性。然而,两者之间存在着较大差异。预期结果只是规范的一部分,与预期输出相关的部分(如果存在)。除此之外,规范还包含与输入范围,非功能属性等相关的信息。例如,测试套件是一个规范,其中包含测试用例,而测试用例本身包含断言,这个断言就是预期结果。

对于修复的预期结果分为两种:bug检测预期结果(bug oracle)是指检测非预期行为的预期结果;回归预期结果(regression oracle)是指预测在修复过程中没有引入新bug。这样分类的原因是修复后的程序已经满足所有回归预期结果,但是修复过程可能会偶然引入新的bug。参考文献中有更多关于规范和预期结果的正式定义[169,11],但对于本文帮助不大。

最后,修复技术通常针对错误类(bug class4)。错误类是一个抽象的概念,指的是一系列具有共同特点的bug:相同的错法,相同的引发原因以及相同的解决方案[124]。例如,众所周知的错误类包括大小差一错误(off-by-one errors),内存泄漏等。但是,许多错误类在文献中没有明确的范围和定义,有些甚至没有名称。尽管现在已经有了一些初步分类法[180,41],但要建立一个完整的针对错误类的分类法还需要多年的研究。

 

3请注意,对于“预期”有些作者使用“expected”而不是“intended”,本文之所以选择前者,是因为真正重要的是用户或客户的观点,而不是设计和开发软件的工程师的观点。

4或者是“fault class”,“error class”等。

(未完待续)

其余部分:(二):https://blog.csdn.net/ClarkCC/article/details/106108728

                  (三):https://blog.csdn.net/ClarkCC/article/details/106178275

                  (四):https://blog.csdn.net/ClarkCC/article/details/106178322

若发现翻译问题,可直接评论或与我联系:cheng.yifan@qq.com

原论文标题《Automatic Software Repair: a Bibliography》

原作者 Martin Monperrus,主页https://www.monperrus.net/martin/

发表于 ACM Computing Surveys, 2017

原文链接:https://arxiv.org/pdf/1807.00515.pdf

此翻译已获得原作者授权

译者ClarkC. 

引用请注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值