Page 49 - 《软件学报》2021年第9期
P. 49

姜佳君  等:软件缺陷自动修复技术综述                                                              2673


         丁代码的重复编译.与此不同,2018 年,Mechtaev 等人          [64] 从测试的角度出发来提升修复的效率,并实现了修复工
         具 F1X.该工具同样适用预定义模板生成修复补丁,其主要的贡献在于:通过将修复补丁根据语义等价归类来避
         免具有相同语义的修复补丁被重复验证,最终实现提升修复效率的目的.
             2019 年,Saha 等人 [65] 将基于模板的补丁生成技术扩展到了多位置修复,并实现了修复工具 HERCULES.其
         基本思想是:具有相似特征(如代码结构、变量命名等)的代码片段,以及在代码的历史修改中经常同时演化的代
         码片段有较大的概率需要协同的修复.因此,HERCULES 通过分析当前代码中与候选出错代码相似的代码片段
         以及与候选出错代码存在共同演化的代码片段扩展缺陷修复的位置.在该过程中,HERCULES 根据可达定义分
         析(reaching-definition analysis)对不同代码之间的关联性进一步分析,从而过滤掉不相关的代码.最后,在多个位
         置同时应用预定义的修复模板生成补丁.该方法在一定程度上扩展了之前方法仅针对单个代码位置的修复,但
         由于其对修复的多处位置具有上述限制,因此其实际上并不能修复所有类型的多位置缺陷.
             基于模板的修复技术,由于其模板通常由人工定义,产生的补丁质量相比随机搜索的方法有所提升.但正因
         如此,该类方法的修复能力和应用范围由其定义的模板数量直接决定.2019 年,Liu 等人                         [11] 通过分析已有的基于
         模板的修复技术,实现了一个新的修复工具 TBar.TBar 集成了已有方法中大部分的补丁模板,在实验验证中实
         现了更多正确的修复.然而,通过人工定义的方法毕竟受模板数量限制,难以大规模使用.因此,研究如何自动化
         地提取修复模板,是使自动修复技术走向实用化的一个有效途径.我们在第 2.4 节将介绍相关研究.
             (2)  利用补丁模板优化候选补丁
             与 PAR 相反,2016 年,Tan 等人 [66] 通过分析修复工具 GenProg 和 SPR   [67] 所产生的修复补丁发现,自动修复工
         具产生的大部分不正确补丁具有公共的特点:删除了程序中的部分代码语句.基于上述发现,作者提出了反模式
         (anti-pattern)方法.该方法在已有的自动修复工具基础之上定义了一系列规则对工具产生的补丁进行过滤,比如
         不能删除返回语句(return)、不能删除条件语句(if)等.作者基于 GenProg 和 SPR 自动修复工具实验,对其增加了
         上述补丁过滤条件.实验结果表明,上述过滤规则可以有效避免不正确的修复补丁.此外,该方法由于删除了部
         分候选补丁,补丁验证时间减少,修复的效率平均提升了 1.4 倍.但相比原始方法,过滤规则并没有使修复工具产
         生新的修复补丁,修复工具的召回率依然由其自身所决定,反模式只是在一定程度上提升了补丁的准确率.
             2018 年,Soto 等人 [68] 通过分析已有的修复补丁,提取比较常用的修复模板,然后将其与 PAR 定义的模板一
         起用于优化 GenProg 方法的补丁生成过程.在 GenProg 迭代生成候选补丁过程中,使用上述定义的修复模板对
         补丁进行排序.与上述的反模式类似,由于该方法中定义的补丁作为辅助而非直接用于生成补丁,因此最后实验
         效果提升并不明显.
             (3)  本节小结
             基于人工修复模板的方法较大可能地应用了开发者或研究者的领域知识.修复模板因具有较强的目标性,
         即修复特定类型的缺陷,因此其优点是生成的补丁质量较高,不会产生晦涩难懂的代码修改.然而,其缺点也很
         明显.由于依赖人工定义修复模板,模板的种类受开发者经验限制,人工成本大.所以,该类方法主要针对一些比
         较常见的、特征比较明显的缺陷类型,比如空指针缺陷等.
         2.3   基于语义约束

             (1)  基于组件的补丁综合
             基于语义约束的自动修复方法通过某种手段推断程序的正确规约,作为约束指导补丁的生成过程或对补
         丁的正确性进行验证.比较有代表性的研究工作是新加坡国立大学 Roychoudhury 教授团队在 2013 年和 2015
         年先后提出来的自动修复工具 SemFix           [69] 和 DirectFix [70] ,这两种方法均通过符号执行技术在缺陷代码位置搜集
         使测试通过的程序语义约束信息,然后使用基于组件(component-based)的程序合成方法生成修复补丁.该过程
         需要依赖约束求解器(SMT solver)求解.DirectFix 相比于前者对补丁生成过程进行了优化:DirectFix 不严格按照
         定位的结果,而是优先选择比较简单的候选语句进行修复;其次,DirectFix 将补丁生成问题转换为部分最大可满
         足问题(partial MaxSAT),通过将补丁的复杂度(即对原始代码的修改大小)作为软约束(soft condition)来控制
         pMaxSMT 求解器,生成更简单的修复补丁.
   44   45   46   47   48   49   50   51   52   53   54