程序错误自动修复目前面临的问题

我不倾向于认为SemFix/DirectFix/Angelix是和基于搜索的技术截然不同的方法。因为他们实际是把修复问题转成了约束求解问题,而约束求解的SMT Solver用的方法是转成SAT问题,而SAT问题的解法还是搜索。所以归根结底还是搜索。如果要分类,我比较倾向于有完整规约的修复和没有完整规约的修复两类。基于测试的修复工作都是属于没有完整规约的。没有完整规约的修复目前遇到的主要问题是正确率低,即可以得到很多通过测试的(plausible)补丁,但是这些补丁中正确的不多。所以现在做的很多工作都是如何在众多plausible补丁中尽量把正确的给找出来。这里主要用的是一些启发式规则和学习得到的概率模型,比如Prophet的排序,Qlose的语义相似性等等。我们今年的一篇在投工作也是想办法通过启发式规则和概率模型提高正确率(http://arxiv.org/abs/1608.07754)。Westley Weimer在DSN上也有一篇position论文讨论了提高正确率的各种可能方法。有完整规约的工作有相当大一部分都是针对特定类型的缺陷,比如上面提到的蔡彦的DFixer,我们之前也做过修复内存泄露的LeakFix(LeakFix),其规约都是和原程序语义等价。这些工具的问题面向各自不同的领域各不相同。剩下一部分是假设程序中有完整的形式化规约,比如在CAV上的多篇修复的论文,以及裴玉老师的工作。这部分工作的一大问题如果最后要证明规约,通常比较难scale up,支持不了大程序。同时Benchmark也是一个问题,并没有那么多有规约的程序可以做实验。


    推荐阅读