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] , 程序规约可以由自然语言、形
式化语言或者测试用例集表示.