Page 55 - 《软件学报》2021年第9期
P. 55
姜佳君 等:软件缺陷自动修复技术综述 2679
型的项目代码中,具有更好的延展性;但其缺点是仅针对变量使用错误,应用范围受限.
2019 年,Tufano 等人 [95] 探索了使用自然语言处理中的 NMT(neural maching translation)技术为程序缺陷预
测修复补丁的效果.在该论文中,作者采用了编码器-解码器模型,模型的输入和输出分别是出错的代码片段和
正确的代码片段.需要注意的是:为了降低变量名称和常量值等带来的干扰,模型输入的代码首先需要抽象处
理,为每个变量和常量等设定唯一的标识符,例如变量 a 为 VAR_1,常量 0 为 INT_1 等.特殊地,为了反映程序的语
义特征,在抽象的过程中,作者预定义了一些常用的惯用词(idioms),例如 size,min 等,在抽象过程中被保留.由于
上述已经介绍过编码器-解码器模型,基本思路相同,此处不再赘述.为了提升最终预测结果的准确率,作者采用
了束搜索(beam search)算法对修复的预测进行调优.最终输出的代码通过还原标识符对应的原始值可得.实验
结果表明,使用 NMT 模型对修复补丁的预测准确率在 12.0%左右.相比之前的工作,准确率比较低,其中一个主
要原因是其针对的缺陷类型更广、复杂度更高.
[9]
2019 年,Chen 等人 在 Tufano 等人工作之后提出了针对 Java 语言代码缺陷自动修复技术 SequenceR,同样
采用编码器-解码器模型.相比之前的工作,其主要的不同在于:SequenceR 采用了复制机制(copy mechanism) [96] ,
简单描述为,可以将模型的输入端数据直接复制到输出端.这样做的好处是可以实现部分代码的直接复用,缓解
模型不准带来的巨大误差.实验证明,SequenceR 的预测准确率高于上述 Tufano 等人提出的 NMT 模型.此外,将
SequenceR 用于修复 Defects4J 数据集中的 75 个单行代码缺陷,正确修复了 14 个.该实验结果表明:尽管相比已
有基于搜索的修复方法效果还有差距,但使用机器学习的方法有希望正确修复大型项目中的真实程序缺陷.其
优点是不依赖任何人工定义模板以及启发式规则.
(4) 本节小结
基于统计分析的修复技术在最近几年发展迅速,其优点是可以利用海量的开源代码数据指导修复过程,处
理各种不同类型的缺陷,具有较强的通用性,并且不依赖人工精心设计启发式搜索方法以及人工定义修复模板,
有希望成为未来的实用化修复方法.然而,该类方法依赖于训练数据的质量.如何从海量的开源数据中准确提取
代码特征,是提升其修复能力的关键.尽管已有方法已经取得了初步成效(如 GetaFix 和 GenPat 等),但依然具有
很大的提升空间.特别是对于端到端的补丁生成模型,已有方法主要适用于分类任务或自然语言处理的应用场
景,在自动修复场景中表现并不理想.研究针对代码生成任务的高效方法,依然需要更多探索.基于统计分析的
修复技术存在一个固有的能力约束:依赖于代码或代码修改的重复性.而开发者的开发以及修复过程常常伴随
较高的创新性.目前的方法从数据中所学习到的领域知识依然十分有限,在缺陷修复中主要起辅助作用,距离实
用化尚存较大鸿沟.
3 自动修复技术面临挑战与启示
根据第 2 节最新相关研究的介绍,目前的自动修复工具所能修复的缺陷依然占所有缺陷的小部分.根据我
们对已有缺陷修复工具在通用缺陷数据集 Defects4J 上的修复结果统计,所有修复工具可以正确修复的缺陷总
数仅有 101 个,还不到完整数据集的 30%(v1.2.0 版本包含 395 个缺陷).不仅如此,自动修复工具所产生的修复补
丁准确率依然难以达到工业应用的要求.因此,自动化的修复技术目前依然面临巨大挑战.本节根据之前相关研
究的介绍,对目前面临的问题和挑战,以及未来可能研究方向进行总结.
• 低召回率问题
Motwani 等人 [97] 通过对早期 7 种自动修复工具所修复的缺陷进行分析发现,正确修复的缺陷通常比较简
单,例如空指针异常、修改变量等,不涉及大段代码或多文件修改,更不涉及生成复杂的代码结构(例如循环等).
影响召回率的因素是多方面的,其中比较重要的原因可以归结为以下两点.
(1) 缺陷定位准确率低.有研究表明 [11,98,99] ,定位的准确率会直接影响缺陷修复的数量,通过提升定位的准
确率可以有效提升修复召回率;
(2) 补丁空间受限.已有的自动修复技术主要依赖于人工定义的修复模板或启发式规则约束补丁的空间,
导致目前仅仅针对比较常见的简单缺陷进行修复,如 NPEfix 仅修复空指针缺陷.