Page 283 - 《软件学报》2024年第6期
P. 283

孙昌爱 等: 基于模板匹配的       BPEL  程序故障修复及优化技术                                          2859


                 “正确”的修复. 基于搜索的故障修复技术分为             3  类: 原子修改操作符技术、预定义模板技术、样例模板技术.
                    原子修改操作符技术        (atomic change operators) 通过对程序的单个位置执行插入、删除或替换操作从而生成
                 补丁程序. Goues 等人   [24] 提出了  GenProg  算法, 通过遗传规划算法对    C  语言的抽象语法树进行操作来生成补丁程
                 序, 执行测试用例集以判断补丁程序是否有效修复了故障. Qi 等人                  [25] 认为  GenProg  方法所采用的遗传规划算法存
                 在计算开销庞大的问题, 提出了一种用于搜索补丁程序的简单搜索策略; 实验结果表明简单搜索在                                 24  个故障中
                 的  23  个故障版本中都能更快地找到正确的修复程序, 并且测试用例执行开销更小. Villanueva 等人                    [26] 将新颖搜索
                 应用于   GenProg, 避免局部最优问题, 从而获得更优的补丁程序. Debroy            等人  [17] 提出了基于变异分析的故障修复
                 技术, 通过替换相同类型的原子更改操作符              (例如算术运算符、关系运算符、逻辑运算符等) 生成补丁程序并进
                 行验证.
                    预定义模板技术       (pre-defined templates) 根据预定义模板中的修改操作符集合修改故障程序从而生成候选补
                 丁程序. 与原子修改操作符技术相比, 可以同时修改一个或多个语句. 开发人员可以定义复杂的修复模板来修复一
                 些复杂的故障甚至多故障程序. 文献           [27] 提出了阶段条件合成算法        SPR, 该算法第   1  阶段将一组通用模板应用于
                 故障程序, 对程序进行转换; 第        2  阶段确定模板中的参数并尝试合成条件以使补丁程序通过测试用例. 将阶段式修
                                                       SH-BPEL
                 复和条件结合能生成并有效地搜索丰富的故障修复空间.
                    样例模板技术      (example-based templates) 通过参考真实软件故障的修复方案设计软件故障的修改操作符, 并
                 构造模板. Kim   等人  [28] 提出基于模式的自动故障修复技术         (PAR), 人工分析了   6  万个真实故障修复并总结出一套
                 模板用于指导修复过程. 历史驱动的故障修复技术                [20] 通过提取多个软件项目中的历史信息来指导候选修复的生
                 成, 利用从项目中挖掘得到的信息指导合成故障修复模板, 最后利用修复模板对故障程序进行修改获得候选解决
                 方案. 该技术与    PAR  均基于如下假设: 依据真实故障修复案例定义的修复模板比其他模板更有效, 并且可能提高
                 测试人员对生成的补丁的可接受性. 不同的是, 历史驱动的故障修复技术侧重软件项目中的历史信息来指导补丁
                 程序的生成, 而    PAR  只分析现有人工编写的补丁来总结修复模式. Islam             等人  [29] 通过对  5  个软件系统的  4 653  个
                 故障版本进行分析, 提出了        38  种故障修复模板以及      37  种嵌套代码结构的模板用于指导故障修复过程. 嵌套模板
                 为故障修复模板的理解提供了一个新的维度, 也提高了故障定位和生成有效补丁的概率.
                    由于  BPEL  程序得故障版本较少, 样例模板技术不再适用. 本文提出的                 BPELRepair 基于预定义模板技术, 在
                 考虑  BPEL  程序特点的基础上得到高效的修复模板, 并依据修复模板中的变异算子生成                         BPEL  故障程序的补丁,
                 若通过测试则表明相应的故障被成功修复了.
                  4.2   BPEL  程序的故障修复技术
                    针对  BPEL  程序的新特点, 人们提出了一些面向           BPEL  程序的故障修复技术. 利用        BPEL  协调参与部分    Web
                 服务的特点, Subramanian  等人  [9] 对常见的  BPEL  程序故障进行了分类, 并设计了相应的修复操作. 其中, 对于单个
                 程序的功能性故障类型        (逻辑错误相关) 而言, 假设存在正确的           BPEL  程序版本, 修复操作采用正确版本替换故障
                 版本. 此方法并没有讨论如何修复          BPEL  程序中的故障, 因此不属于传统意义上的故障修复范畴. Modafferi 等人              [10]
                 结合  BPEL  语言提供的事件、补偿、异常等处理机制, 以标注的方式预先定义可能出现故障时的特定操作, 包括
                 终止、重做、回滚、警报、替换等, 开发了引擎                        支持特定操作的实现. 类似地, 文献          [11] 将  SH-BPEL
                 作为  BPEL  程序的执行与修复引擎, 在       BPEL  程序故障出现后, 依据程序的结构约束与数据依赖定位故障, 以减少
                 不必要的修复操作. 上述方法的修复操作需要人为设定, 因而不属于自动化的程序修复范畴.
                    本文所提    BPEL  程序故障修复技术主要针对功能性故障, 采用变异分析的方式生成修复模板; 结合                          BPEL  程
                 序的特点, 提出了基于变异分析的程序修复的优化策略, 支持高效的                    BPEL  程序故障自动化修复.

                  4.3   BPEL  程序的故障定位技术
                    故障定位负责确定故障语句的位置以便指导后续的故障修复                      [21] , 通过量化故障程序中的每一条语句的故障
                 怀疑度形成降序的怀疑度列表. 一个程序所有的预期行为的集合就是程序规约                          [21] , 程序规约可以由自然语言、形
                 式化语言或者测试用例集表示.
   278   279   280   281   282   283   284   285   286   287   288