论文阅读-自动程序修复-DEAR: A Novel Deep Learning-based Approach for Automated Program Repair

一 研究背景

在现实情况下存在下面的问题: 

图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函数的调用)。由此可见,一个修复可以被分解成多个子树转换

  • 观察3bug修复通常依赖于周围代码的上下文。模型要学习line 5 -> line 6的修复,就必须包含line 11的代码。也就是说,修复一个错误语句的正确上下文必须包括另一个错误语句s'的修复代码,而不是s'本身。

论文作者解决了局限性:现有的基于dl的方法都不能通过同时对多个块中的多个语句进行依赖更改来自动修复错误。它们只支持修复单个语句。因为现在的工具大多是基于上下文来进行程序修复,如果上下文也同样存在漏洞,就会导致模型无法正确地修复漏洞。

 

二 论文贡献 

 

自动程序修复一般分三个阶段:

(1)软件缺陷定位

改进:使用了之前的基于频谱的缺陷定位技术+深度学习方法+数据流分析

(2)生成补丁

改进:采用双层的基于树结构的LSTM模型+循环训练+分治策略

(3)补丁评估 

三 实验

(1)第一大部分:模型的训练流程 (基于树的双层LSTM)

训练的输入为修复前/后的源代码的AST,输出包括:(1)用于上下文学习的模型和(2)用于树转换学习的模型(用于修复过程&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值