关键词:
自动缺陷修复
深度学习
开源仓库
摘要:
软件缺陷制约软件产业发展,严重影响软件质量。探索高效、自动的软件缺陷修复方法是目前软件工程领域的重要课题之一。深度学习技术的发展和大规模开源代码库的出现为改进传统基于“生成-验证”的缺陷修复方法带来了可能,正在成为目前研究的热点方向。目前基于深度学习的缺陷修复方法主要依赖来自开源代码库中的数据集构建模型,尽管与传统基于手工提取缺陷修复模式的修复方法相比,能够生成可通过配套测试用例集的有效补丁,但生成的补丁往往偏离了原始程序的语义,正确性依然有待提升,其主要原因在于:(1)因为这些方法使用简单的规则从开源仓库中获取数据,由于开源仓库的多样性,这种单一的数据筛选方式获取的训练数据质量低,影响模型的学习效果;(2)现有方法忽略关注程序中的控制流和数据流信息;(3)现有方法在序列化处理源代码时粒度单一,并且对其中的用户自定义标识符抽象表示,使生成的词汇表中损失了一部分程序语义信息,影响模型生成补丁的效果。本文针对以上问题对现有缺陷修复方法进行改进,并提出一种基于深度学习技术的缺陷修复解决方案,具体研究内容总结如下:(1)面对开源仓库的数据存在质量分布不均衡的挑战,本文提出了一种基于大规模开源仓库的数据优化方法,通过数据筛选过程对开源仓库中的数据进行提纯,并且为了捕获程序上下文中对缺陷修复有意义的重点特征,构建一种基于程序控制流和数据流的程序切片方法对数据进行预处理,提升从开源仓库获取数据的质量。(2)提出一种使用编码器-解码器结构的程序缺陷修复模型。针对现有方法在源码序列化过程中存在粒度单一、损失部分程序信息的问题,本文使用基于子词表示的序列化方法对源码进行处理,尽可能多的保留程序上下文中的用户自定义标识符信息。再通过基于局部注意力机制的编码器-解码器模型学习缺陷的修复模式,实现补丁的自动生成。考虑到每种缺陷的修复操作具有相似性,本文通过构建一个基于程序抽象语法树(Abstract Syntax Tree,AST)结构特征的缺陷预分类模型,为待修复缺陷选择最匹配的补丁生成模型。(3)设计并实现了一个基于Github的Java程序缺陷修复原型系统VulRepair。并且为了验证VulRepair的缺陷修复效果,还设计并实现了一组评估对比实验,从多个角度评估验证本文提出的缺陷修复模型和系统。实验结果表明,本文提出的缺陷修复方法在基准数据集和来自开源仓库的数据集上,相比已有的缺陷修复方法,VulRepair生成的有效补丁和正确补丁数量更多,并且具有修复多行缺陷的潜力。