一 研究背景
在现实情况下存在下面的问题:
图1所示代码的缺陷体现在:(1)开发人员没有处理UID为空的情况,(2)没有对UID进行大小写转换,(3)没有对password进行hash运算。通过该Motivation可以得到3个观察:
观察1:图1中的bug需要在同一个程序中对多条具有依赖关系的语句进行修改,即:(1)对于line 4的if分支,添加else分支,以处理UID为空的情况;(2)在line 6对UID进行大写转换;(3)在line 11添加hash操作。由此可以看出:对单个语句进行一次调整并不能很好地修复bug。一般来说,一个bug可能需要在同一个修复中对多个语句进行调整。
观察2:对该bug的修复涉及多个AST子树的调整,如对line 4 if语句的修改,就涉及到在if语句的AST子树中,添加else子树。同时,对该bug的修改还涉及到将2条bug语句(line 5和Line 10)调整成4条语句(if的else分支,line 8的return语句,line 6对toUpperCase函数的调用,line 11对passwordHash函数的调用)。由此可见,一个修复可以被分解成多个子树转换。
观察3:bug修复通常依赖于周围代码的上下文。模型要学习line 5 -> line 6的修复,就必须包含line 11的代码。也就是说,修复一个错误语句的正确上下文必须包括另一个错误语句s'的修复代码,而不是s'本身。
论文作者解决了局限性:现有的基于dl的方法都不能通过同时对多个块中的多个语句进行依赖更改来自动修复错误。它们只支持修复单个语句。因为现在的工具大多是基于上下文来进行程序修复,如果上下文也同样存在漏洞,就会导致模型无法正确地修复漏洞。
二 论文贡献
自动程序修复一般分三个阶段:
(1)软件缺陷定位
改进:使用了之前的基于频谱的缺陷定位技术+深度学习方法+数据流分析
(2)生成补丁
改进:采用双层的基于树结构的LSTM模型+循环训练+分治策略
(3)补丁评估
三 实验
(1)第一大部分:模型的训练流程 (基于树的双层LSTM)
训练的输入为修复前/后的源代码的AST,输出包括:(1)用于上下文学习的模型和(2)用于树转换学习的模型(用于修复过程&#x