程序自动修复相关工作总结

思维导图
原文出处

0.背景

  • (1) 传统维护面临成本和维护能力不足问题
    • 软件维护占用了软件开发成本的 50%~75%[1],其中,成本消耗最大的就是程序错误定位和修复
  • (2) 不可控条件下无法维护问题
    • 由于软件逻辑设计复杂性和运行环境的限制,当软件发生错误时,维护人员可能无法远程修复该类错误.在航天领域中应用的软件系统,当卫星、航天飞船等空间飞行器与地面的通信联络中断时存在不可控的情况.

1 程序自动修复描述

1.1 相关概念
  • 针对各类不同的错误(error)修复场景,将整个修复过程自动化
  • 程序错误(program error)是指程序的预期行为和实际执行时所发生情况之间存在的一种偏差
  • 一系列预期行为的集合就是程序规约
    • 自然语言书写的文本
    • 形式化的逻辑公式
    • 测试集
  • 测试预言(test oracle)
    • 通过测试用例的预期结果与实际执行结果的对比机制来判断测试用例的结果是否通过
    • 测试预言只与程序的输出相关,而程序规约还包括程序的输入区间、程序的内部逻辑要求和非功能属性等规范.
    • 测试预言是程序规约的一个子集.
1.2 程序规约与程序自动修复
  • 一般的程序自动修复方法
    1. 错误定位
      • 错误自动定位技术作为一个独立的研究领域已经有 30 多年的研究历史
    2. 补丁生成
    3. 补丁判定
  • 基于规约的程序自动修复描述
    • 待修复的程序 BP(buggy program)
    • 只包含 1 个错误,且修复该错误所需的补丁只有 1 条语句
    • 程序规约 S
    • 补丁语句集合表示为 P=patch(L,OP,C),
      • L(location)表示 bug 程序 BP的出错位置,也是修复时打补丁的位置;
      • OP(operater)表示补丁生成的操作符,包括增加、删除和修改某条语句等变换的操作,也可以理解为修复模板;
      • C(content)表示补丁语句所包含的内容,是操作符 OP 的操作对象,也可以理解为修复模板的参数
      • 程序自动修复可描述为:
          1. 假设给定程序 BP 和对应的程序规约 S,且 BP 不满足 S(
        1. 修复过程是求解函数 P=patch(L,OP,C),
        • 即通过错误自动定位、程序分析等技术计算出错位置 L,
        • 利用程序规约 S 或归纳方法总结适合的修复操作或修复模板 OP
        • 基于规约 S 指导的程序分析技术或其他方法获取修复模板的参数或者补丁内容 C
        1. 使得程序 BP 应用上述补丁集合 P 中的特定补丁后满足程序规约 S
1.3 程序自动修复问题分类
  • 鉴于程序规约 S 对自动修复的至关重要性,本文根据是否能够完整地刻画待修复程序的规约 S,将程序自动修复技术面向的问题分为
    • 不完全规约
      • 将测试集或者通过测试集提取的条件约束作为最终判定自动生成补丁质量的程序规约 S
      • 一方面,现实世界中不易获取充足的测试用例
      • 另一方面,更关键的问题是测试集并不能完整地表示程序规约
    • 过拟合问题分析
      • 疑似正确补丁
        • 通过全部测试用例却依然错误的补丁
    • 完全规约
      • 特点是能够完全明确地描述待修复程序的完整规约
      • 几种明确的特定错误类型,能够完整地刻画程序规约,其规约 S 和原程序语义等价且修复特定错误不引入原程序语义变化
        • 前提假设是开发人员事先已经确定错误类型,由于面向具体问题的不同而方法各不相同,具体方法修复能力只针对特定错误类型有效
          • 内存泄漏
          • 并发错误中的数据竞争
          • 原子性违背
          • 顺序违背和死锁
          • 资源泄露
          • 配置错误
          • 特定性能错误
    • 半完全规约
      - 修复中刻画的程序规约 S 是否完整不确定.针对该类问题的修复,
      - 往往先假设具有完整的程序规约S,通过判定的修复补丁还需要事后进一步的人工确认或者正确性证明
      - 一些文献中基于契约(contract)[27]进行程序自动修复,假设这些契约是完整的程序规约,则用于判定修复的正确性之后,再人工地确认或进行正确性证明.

2 程序修复新进展

2.1 补丁生成
1) 基于启发式搜索
1. 基于变异算子
  • GenProg: A Generic Method for Automatic Software Repair

    • 2012 基本思想是代码具有重复性,因此通过 复用项目中的代码有希望产生正确的修复补丁
    • CCF A TSE 遗传算法 定义代码片段的交叉和变异
  • The strength of random search on automated program repair

    • 2014 年提出了 RSRepair,该方法采用与 GenProg 方法相同的修复框架,只是将其中的遗传算 法替换成了随机搜索.
    • CCF A ICSE 随机搜索方法
  • Contract-based program repair without the contracts

    • 2017 年,Chen 等人[39]提出从 JAVA 代码中自动提取细粒度状态抽象信息(类似于 Eiffel 语言中手工编写的契约信息),从而指导生成高质量候选补丁,形成的方法 JAID 属于基于搜索的修复方法
    • CCFA ASE 针对Java程序
  • Improved representation and genetic operators for linear genetic programming for automated program repair

    • 2018 年,Oliveira 等人[35] 提出了一种新的代码修改表示方法来对遗传算法进一步优化
    • CCF B ESE 对遗传算法进行改进
  • ARJA: Automated repair of java programs via multi-objective genetic programming.

    • 2018 年,Yuan 等人[36] 提出基于多目标遗传算法的自动修复方法 ARJA,该
    • CCF A TSE 遗传算法改进
  • Towards practical program repair with on-demand candidate generation

    • 2018 年,Hua 等人[45]针对基于搜索的修复方法中庞大的候选补丁搜索空间在遍历时需要迭代的对候选程序重复编译和重复执行的低效率问题,提出了在测试执行时按需生成补丁的方法 SketchFix
    • CCF A ICSE 改进步骤(按需编译)
  • Search-based efficient automated program repair using mutation and fault localization.

    • 2018 年,Sun 等人[38] 通过对遗传算法的种群初始化以及变异过程进行优化来改善原有的 GenProg 修复方法
    • CCF C COMPSAC 遗传算法改进
2. 基于历史修复补丁
  • History Driven Program Repair

    • 2016 年,Le 等人[33]从人工修复的历史信息中挖掘模板来指导高质量候选补丁的生成,通过计算挖掘模板的频度,赋予修复模板对应的权重.权重信息高效地指导候选补丁生成,同时也有助于对输出补丁排序,从而提升修复能力和修复效率.
    • CCFB SANER 历史经验指导+遗传算法
  • Context-aware patch generation for better automated program repair.

    • 2018 年 Wen 等人[46] 同样应用从历史修复中挖掘的代码修改操作指导补丁生成
    • CCFA ICSE 历史经验指导+上下文+遗传算法
  • Automatic patch generation with context-based change application

    • 2019 年,Kim 等人[47] 提出直接应用历史中 人工修复的模板,并开发了自动修复工具 ConFix
    • CCF B ESE 历史经验+代码抽象语法树
3. 利用相似代码
  • Automated program repair by using similar code containing fix ingredients

    • 2016 年 Ji等人[48] 提出通 过复用项目中与缺陷位置相似的代码片段生成补丁,并实现了缺陷修复工具 SCRepair.
    • CCF C COMPSAC 相似代码+语法树
  • CRSearcher: Searching code database for repairing bugs

    • 2017 年,Wang 等人[50] 同样基于复用相似代码的基本思想,提出了修复工具 CRSearcher
    • ACM 参考其它项目
  • Leveraging syntax-related code for automated program repair

    • 2017 年,Qi 等人[40]提出利用已有代码(与错误代码语法相关的数据库代码数据)生成补丁的方法 ssFix
    • CCF A ASE 参考代码数据库
  • Learning syntactic program transformations from examples

    • 2017 年,Suzuki 等人[35]提出了 REFAZER,从正确修复的实例程序(example)中学习细粒度的修复模板(称作程序转换(program transformation))来指导包含同类错误问题程序的修复
    • CCFA ICSE 正确修复程序指导
  • Shaping program repair space with existing patches and similar code

    • 2018 年他们提出了自动修复工具 SimFix,通过代码结构特征以及代码语义特征(变量和函数命名)搜 索项目中的相似代码
    • CCF A ISSTA 参考同一项目(代码结构特征+代码语义特征)
  • Re-factoring based program repair applied to programming assignments.

    • 2019 年 Hu 等人[52] 提出了根据正确的代码为学生提交的作业代码推荐修复补丁,并实现 了修复工具 Refactory
    • CCF A ASE 参考正确提交的代码
2) 基于人工修复模版
  • Automatic patch generation learned from human-written patches

    • 2013 年被提出来的 PAR[30] 是其中的代表性研究
    • CCF A ICSE 人工定义修复模版
  • Automatically diagnosing and repairing error handling bugs in C

    • 2017 年,Tian 等人[55] 提出了一种针对 C 语言错误的自动修复方法 ErrDoc
    • CCF A FSE 静态分析工具+定义对应修复模板
  • Mining stackoverflow for program repair

    • 2018 年,Liu 等人[60] 首先使用代码修改提取工具 GumTree[61] 从 Stack Overflow 上的缺陷代码修复中提取代 码修改操作,然后由人工总结成修复模板
    • CCF B stackoverflow 提取模板
3) 基于语义约束
1. 基于组件的补丁综合
  • Directfix: Looking for simple program repairs.
    • 2015 年,Mechtaev 等人针对如何生成高精度补丁的核心问题,提出了生成更简化补丁的自动修复方法DirectFix
    • CCFA ICSE 部分最大可满足性问题 符号执行技术
  • Angelix: Scalable multiline program patch synthesis via symbolic analysis
    • 2016 年,Mechtaev 等人[31]提出了轻量级符号执行技术处理规模更大的程序中错误修复的方法 Angelix.
    • CCF A ICSE 测试用例驱动 受控轻量符号执行
  • Nopol: Automatic repair of conditional statement bugs in Java programs
    • 2017 年,玄跻峰等人[51]针对不完全规约程序修复问题,聚焦在条件错误,提出了基于语义的修复方法 Nopol.
    • CCF A TSE 聚焦条件判断领域 java程序
  • Memfix: Static analysis-based repair of memory deallocation errors for c
    • 2018 年,Lee 等人[79] 提出 MemFix,修复 C 语言中的内存释放错误
    • CCF A FSE 内存释放错误 覆盖问题 约束求解器求解
2. 基于语义的代码搜索复用
  • Repairing programs with semantic code search (t).

    • 2017 年,Ke 等人[81] 提出了基于代码语义搜索的修复技术 SearchRepair,该方法首先建立了一个代码片段数 据库
    • CCF A ASE 符号执行搜索规约 根据规约搜索代码片段库
  • SOSRepair: Expressive semantic search for real-world program repair.

    • 2019 年,Afzal 等人[82] 针对 SearchRepair 存在的表达力与效率等问题提出了改进方法 SOSRepair.
    • CCF A TSE 效率改进
4) 基于统计/机器学习/深度学习模型
1. 基于统计
  • Precise condition synthesis for program repair
    • 2017 年,熊英飞等人[36]针对不完全规约程序修复问题,聚焦在条件错误,提出了 ACS,
    • CCF A ICSE 启发式算法 将修复对象聚焦在单变量条件类错误问题,利用启发式方法合成待修复条件语句,并按正确性 排序 变量间 拓扑图
2. 基于机器学习
  • Automated clustering and program repair for introductory programming assignments

    • 2018 年 Gulwani 等人[88] 提出了 Clara 用于修复学生的作业程序.与 Refazer 不同的是,Clara 不依赖历史修 复样例,而是直接聚类相同功能的正确代码
    • CCF A PLDI聚类 相同功能代码
  • Getafix: Learning to fix bugs automatically

    • 2019 年,Bader 等人[7] 提出了自动修复技术 GetaFix.
    • ACM 层次聚类
  • Fixminer: Mining relevant fix patterns for automated program repair. Empirical Software Engineering.

    • 2020 年,Koyuncu 等人[90] 提出 FixMiner,通过迭代式聚类算法从相似的代码修改中挖掘可以复用的代码修 改模板
    • CCF B Springer 迭代式聚类
3. 基于深度学习(端到端)
  • Deepfix: Fixing common c language errors by deep learning

    • 2017 年,Gupta 等人[8] 使用序列到序列(sequence-to-sequence)神经网络(neural network)模型自动修复 C 语言 中的编译错误,并基于此实现了自动修复工具 DeepFix
    • CCF A AAAI 缺陷定位 补丁推荐 GRU Attention Seq2seq 输入输出为代码的符号序列(输出为fix序列) 序列可以还原为代码
    • 正确定位 78.7%的错误代码位置,正确修复 27.0%的缺陷,且修复时间仅需要几十毫秒
  • Neuro-symbolic program corrector for introductory programming assignments

    • 2018 年, Bhatia 等人[94] 针对学生作业 Python 程序提出自动修复技术
    • CCF A ICSE python 首先使用RNN修复语法错误 逻辑约束修复语义错误
    • 平均可以修复 59.8%的语法错误和 23.8%的语义错误
  • Neural program repair by jointly learning to localize and repair

    • 2019 年,Vasic 等人[10] 提出使用联合预测(joint prediction)模型修复程序中的变量使用错误,即应该使用其他 变量替换程序中的某些变量使用
    • ICLR 联合预测 变量使用错误 LSTM
    • 出错位置预测准确率 为 71.0%,同时修复的预测准确率为 65.7%.
  • Sequencer: Sequence-to-sequence learning for end-to-end program repair

    • 2019 年,Chen 等人[9] 在 Tufano 等人工作之后提出了针对 Java 语言代码缺陷自动修复技术 - -SequenceR,同样 采用编码器-解码器模型
    • CCF A TSE Java 编码器-解码器 复制机制
2.2 补丁判定
1) 规约补全问题和方法
  • Identifying test-suite-overfitted patches through test case generation

    • 2017 年,Qi 等人[53]提出了 DiffTGen,利用测试用例增强方法缓解修复的过拟合问题.
    • CCF A ISSTA 测试用例 识别过拟合补丁与真实规约S之间的差异 , 然后生成新的测试用例来测试
  • Semantic program repair using a reference implementation

    • 2018 年,Mechtaev 等人[12]针对过拟合问题提出了 SemGraft 方法,引入了测试用例集之外的参考实现程序作为程序规约 S,即参考实现程序表示功能和 buggy 程序相同但实现算法不同的程序
    • CCF A ICSE 参考了其它程序表示功能相同但是算法不同的程序
2) 补丁择优问题和方法
1. 排除/分类
  • Anti-patterns in search-based program repair

    • 2016 年,针对过拟合这一关键问题,Tan 等人[58]从自动生成的候选补丁中学习一般的和领域无关的反模式(anti-pattern),利用这些反模式排除包含非法修改的候选补丁.
    • CCF A FSE 利用反模式排除非法补丁
  • Identifying patch correctness in test-based program repair

    • 2018 年,熊英飞等人[60]提出一种全新的基于测试用例执行行为相似度进行补丁择优的方法
    • CCF A ICSE 关注测试用例执行中的行为 测试执行行为的相似度 抽象成分类模型
2. 排序
  • Qlose: Program repair with quantitative objectives

    • 2016年 Antoni 等人[25]引入程序距离(program distance)的概念来解决过拟合问题.当测试用例集无法进一步区分已通过测试的多个补丁正确与否时,该方法假设修复后的程序和原程序相似度越高,则补丁越趋向于正确
    • CCF A LNCS 无法辨别时,与源程序越接近越可能正确
  • Elixir: Effective object-oriented program repair

    • 2017 年,Saha 等人[83] 采用类似 Prophet 的方法通过预定义补丁模板指导修复过程,同时应用机器学习模型 对候选的修复补丁进行排序.
    • CCF A ASE 机器学习对候选补丁排序
  • Automatic patch generation by learning correct code.

    • Fan 等人[59]利用学习人工修复的正确补丁获得应用独立的概率模型,利用该模型对候选补丁进行排序,从而确定补丁质量
    • CCF A POPL 最大似然概率模型 学习人工修复的正确补丁 对候选补丁进行排序
  • Sorting and transforming program repair ingredients via deep learning code similarities

    • 2019 年,White 等人[84] 提出使用神经网络模型对项目中的相似代码进行排序以供复用生成补丁,基于此实 现了自动修复工具 DeepRepair
    • CCF B SANER 神经网络 代码相似性 排序
补丁效果预测
  • An Empirical Study on Learning Bug-Fixing Patches in the Wild via Neural Machine Translation
    • 2019 年,Tufano 等人[95] 探索了使用自然语言处理中的 NMT(Neural Maching Translation)技术为程序缺陷预 测修复补丁的效果
    • CCFA TSEM 编码器-解码器 预测
    • 使用 NMT 模型对修复补丁的预测准确率在 12.0%左右

参考:

[1] 姜佳君,陈俊洁,熊英飞.软件缺陷自动修复技术综述

[2] 李斌, 贺也平, 马恒太. 程序自动修复:关键问题及技术. 软件学报, 2019, 30(2): 244-265

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值