软件缺陷自动修复技术

软件缺陷自动修复技术综述

2.1基于启发式搜索

(1) 利用变异算子

采用遗传算法,通过定义代码片段的交叉和变异操作实现已有代码片段的重新组合,增大补丁的搜索空间
随机搜索
对遗传算法的优化
对遗传算法中的表示方法进行了优化
加速
通过对遗传算法的种群初始化以及变异过程进行优化来
补丁空间进行了扩充
面向字节码

(2) 利用历史修复补丁

引入修复历史从历史修复中挖掘的代码修改操作指导补丁生成
考虑了代码修改的上下文信息来约束搜索空间
基于AST直接应用历史中人工修复的模板。

(3) 利用相似代码

与缺陷代码过于相似的代码可能存在同样的错误,在复用代码时考虑过滤条件
将代码的搜索范围扩展到了其他的项目但需要人工确认补丁的正确性
细粒度
同一个项目中的代码具有更好的参考价值+修改操作可以进行组合应用,并且同时使用历史修复中的常用修改操作对候选补丁进行过滤优化
包含了代码重构部分,使得语义相近的代码尽可能在结构上相似

小结:

基于启发式搜索的自动修复方法是到目前为止研究最为广泛的一类方法.该类方法的优点是具有较强的
通用性,适用于不同种类的程序缺陷.然而,其缺点是容易产生似真补丁而降低补丁的准确率.因此,其核心是如何定义合适的补丁搜索空间以提升补丁的质量.如前所述,修复方法的召回率和准确率是两个相互制约的指标,在保证准确率达到一定指标要求的情况下提升自动方法的修复数量,是搜索空间定义的重大挑战.

2.2 基于人工修复模板

(1) 利用模板生成补丁

根据开发者或研究人员的经验预定义一些补丁模板或者补丁生成策略用于指导修复的过程
PAR 人工定义了 10 个修复模板,涵盖 6 大类的代码修改
通过静态分析在程序的控制流图上检测出错路径和未出错路径,通过对比差异为修复提供指导
主要是针对一些特定类型的缺陷
从 Stack Overflow 上的缺陷代码修复中提取代码修改操作,然后由人工总结成修复模板
主要关注的是缺陷修复技术中的效率问题
基于模板的补丁生成技术扩展到了多位置修复
集成了已有方法中大部分的补丁模板,在实验验证中实现了更多正确的修复

(2) 利用补丁模板优化候选补丁

增加了补丁过滤条件

小结:

基于人工修复模板的方法较大可能地应用了开发者或研究者的领域知识.修复模板因具有较强的目标性,
即修复特定类型的缺陷,因此其优点是生成的补丁质量较高,不会产生晦涩难懂的代码修改.然而,其缺点也很明显.由于依赖人工定义修复模板,模板的种类受开发者经验限制,人工成本大.所以,该类方法主要针对一些比较常见的、特征比较明显的缺陷类型,比如空指针缺陷等.

2.3 基于语义约束

(1) 基于组件的补丁综合

通过符号执行技术在缺陷代码位置搜集使测试通过的程序语义约束信息,然后使用基于组件(component-based)的程序合成方法生成修复补丁
已有方法仅仅通过代码的语法变化来衡量补丁的复杂度来对补丁进行排序并不是有效的手段,进而提出基于代码结构和语义特征的补丁排序方法
通过使用受控的符号执行技术使其具有更好的延展性(scalability),可以用于修复较大规模项目中的缺陷
通过指定循环展开次数和递归深度将代码转换为无循环代码
针对 Java 程序中条件语句错误的修复技术,该技术针对出错语句的类型定义了不同修复策略
根据程序运行过程中的表达式取值来推断程序的规约以确定出错位置
将测试执行的约束映射为程序中的未知条件语句,然后可以使用可达性问题的求解方法进行计算
为不同的代码修改操作预定义了优先次序
修复 C 语言中的内存释放错误

(2) 基于语义的代码搜索和复用

在项目中搜索满足上述规约的代码段,直接复用其作为正确修复补丁
首先使用符号执行技术搜集满足程序测试的规约,然后在代码库中搜索满足对应程序规约的代码段
采用了一种新的代码编码方式来存储代码,以加速在修复过程中代码的搜索过程

小结:

基于语义约束的修复技术通过将补丁生成过程转换成约束求解问题,可以充分利用已有的优化求解算法,
避免反复执行测试来验证候选补丁的正确性.但是该类方法由于依赖于符号执行和约束求解技术,在比较复杂的大规模程序上难以适用.此外,基于组件的补丁综合方法容易产生过拟合以及可阅读性差的代码片段,从而降低代码可维护性.虽然最新的研究通过复用已有代码可以在一定程度上提升补丁的可读性,但大量的求解过程会导致修复过程的低效,限制了可复用代码片段的粒度,进而约束了修复方法所能修复的缺陷数量.

2.4 基于统计分析

指利用统计的方法或学习的技术指导补丁生成的过程或对候选补丁进行优化

(1) 补丁排序模型

根据修复前后的代码特征训练了一个排序模型对 SPR 生成的修复补丁进行排序
通过预定义补丁模板指导修复过程;同时,应用机器学习模型对候选的修复补丁进行排序
使用神经网络模型对项目中的相似代码进行排序,以供复用生成补丁

(2) 提取补丁模板用于修复

用了 3 种技术手段优化生成补丁的质量:首先,ACS 利用代码的局部性原理,根据变量之间的依赖拓扑关系对修复条件中的变量选取进行排序,在拓扑图中,距离代码修改位置比较近的变量优先使用;此外,ACS 通过分析代码中的自然语言注释内容,挖掘程序特征来补充测试所定义的不完整程序规约;最后,ACS 通过统计分析相似项目中常用的条件谓词,用来对修复补丁所使用的表达式类型进行筛选和排序
针对每类缺陷分别准备数据集,然后应用整数线性规划(ILP)算法为不同的缺陷类型分别推断代码修改模板
从代码修改样例中学习修改模板.为了方便描述代码的修改操作,提出了一个领域特定语言
针对给定的程序缺陷推荐对应的修改操作
不依赖历史修复样例,而是直接聚类相同功能的正确代码
在代码的语法树级别提取代码修改操作以及代码修改所涉及到的上下文信息
同样依赖于聚类算法对从历史中提取的补丁模板进行抽象
过迭代式聚类算法,从相似的代码修改中挖掘可以复用的代码修改模板
基于单个历史修复的补丁模板提取技术

(3) 端到端补丁生成模型

不依赖外部的缺陷定位过程,通过神经网络直接预测程序中的缺陷代码并产生修复补丁推荐
不仅修复程序的语法错误,同时修复程序的语义错误,方法是:首先,使用神经网络模型修复缺陷代码的语法错误得到语法正确程序;然后,借助基于语义约束的程序修复技术,使程序满足语义规约.
使用联合预测(joint prediction)模型修复程序中的变量使用错误,即应该使用其他变量替换程序中的某些变量使用
探索了使用自然语言处理中的 NMT(neural maching translation)技术为程序缺陷预测修复补丁的效果
简单描述为,可以将模型的输入端数据直接复制到输出端.这样做的好处是可以实现部分代码的直接复用,缓解模型不准带来的巨大误差

小结:

基于统计分析的修复技术在最近几年发展迅速,其优点是可以利用海量的开源代码数据指导修复过程,处
理各种不同类型的缺陷,具有较强的通用性,并且不依赖人工精心设计启发式搜索方法以及人工定义修复模板,有希望成为未来的实用化修复方法.然而,该类方法依赖于训练数据的质量.如何从海量的开源数据中准确提取代码特征,是提升其修复能力的关键.尽管已有方法已经取得了初步成效(如 GetaFix 和 GenPat 等),但依然具有很大的提升空间.特别是对于端到端的补丁生成模型,已有方法主要适用于分类任务或自然语言处理的应用场景,在自动修复场景中表现并不理想.研究针对代码生成任务的高效方法,依然需要更多探索.基于统计分析的修复技术存在一个固有的能力约束:依赖于代码或代码修改的重复性.而开发者的开发以及修复过程常常伴随较高的创新性.目前的方法从数据中所学习到的领域知识依然十分有限,在缺陷修复中主要起辅助作用,距离实用化尚存较大鸿沟.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值