缺陷修复提升补丁质量
补丁过滤、验证
近五年 文章
- GenProg定义了一个适应度函数,该函数根据通过和失败的测试用例的数量确定每个候选补丁的质量。
优化:提出新的适应度函数,改进基于搜索的程序修复的适应度函数 - 生成测试用例:生成新的测试输入来增强测试套件
- Capgen 利用AST节点的上下文信息来估计候选patch的正确概率,并对patch进行排序
- 使用原始程序和修补后的程序之间的语法和语义关系对修补程序进行排序
如:基于语义距离的patch质量排序方法
路径匹配特征对正确patch的评价效果最好,除此之外有:输出覆盖、区间距离
如:Impact Analysis of Syntactic and Semantic Similarities on Patch Prioritization in Automated Program Repair
用变量相似度来衡量语义相似度,用标准化最长公共子序列来捕获句法相似度
再如:Automatic Patch Generation by Learning Correct Code
使用机器学习方法对补丁进行排序
文章思路:即使在应用程序之间,正确的代码也会共享一些属性,这些属性可以被学习和利用。
技术路线:1)Prophet为搜索空间中的每个候选补丁计算一个特征向量。
2)然后将学习到的模型应用到计算得到的特征向量上,得到相应patch正确的概率。
3)然后根据计算的正确性概率对生成的补丁进行排序。
特征提取:将可利用的补丁属性抽象出来,结果是得到一个特征向量
对原始代码和补丁代码的抽象语法树进行结构差异分析
提取出 1)修改特征,总结补丁如何修改程序
2)程序值特征,捕获了变量和常量在原始程序中如何使用,以及它们在补丁中如何使用
扩展思路:可以将Prophet与更复杂的分析算法结合起来,以获得更丰富的原子特征集。
即提取更丰富的特征
模型建立:使用一个参数化的概率模型进行操作
一旦模型参数确定,就会给搜索空间中的每个候选补丁分配一个概率。
所以模型建立实际上就是确定参数的过程
过程如下:输入<prpgram,patch>集合,输出参数θ
收集到的补丁前85%用做训练集
迭代200次用于更新θ,每次迭代过程中性能好时更新θ,否则降低学习速率
思考:1.过拟合的补丁是不是也可以被识别出来呢?
计算正确补丁值—计算过拟合(不正确)补丁值—综合得分
2.通过设置适当的阈值,可以区分正确和不正确的补丁,将排序问题转化为补丁分类问题。
1.Refining Fitness Functions for Search-Based Program Repair–改进基于搜索的程序修复的适应度函数
在本文中,我们提出了 2Phase,这是一种用于基于搜索的自动程序修复 (APR) 的新适应度函数。2Phase **考虑测试用例失败的预期值和实际值之间的差异来对程序变体进行排名。**在这项工作中,在 Gin 基因改进框架内实施了 2Phase 以及其他两个最先进的适应度函数,并根据经验评估了超过 16 个有缺陷的程序,在以前的工作中找到了足够的测试套件补丁。此外,EvoSuite 工具用于补充原始测试套件集以研究补丁泛化。总的来说,我们的实验已经为 16 个选定程序中的 11 个生成了足够的测试套件补丁。我们的手动调查显示,有 8 个补丁是真正的修复。
关于