Page 274 - 《软件学报》2024年第6期
P. 274
2850 软件学报 2024 年第 35 卷第 6 期
10. for bt i in blockTypeSet do
11. operatorSet ← GetOperatorFromPattern(bt i , S FP )
12. Add operatorSet → OperatorSet
13. end for
14. CP ← ∅
15. for each cb in blockTypeSet do
16. Create candidate program with (OperatorSet, P, cb) to get TCP
17. Add TCP → CP
18. end for
19. for each p in CP do
20. TR ← Execute Program(p, T)
21. if ( TR != E ) then
22. break check this candidate program
23. else then
24. R ← p
25. break Execute other CP
26. end if
27. end for
28. if (R != ∅ ) then
29. break Check other block
30. end if
31. end for
32. return R 中的每一个补丁程序
(1) 第 1 行: 初始化原始故障程序的测试结果集 ER、所有块的怀疑度集 SUS、有序语句块列表 BL、临时候
选程序的执行结果 TR、修复结果集合 R 为空.
(2) 第 2 行: 对原始故障程序执行测试用例集, 记录测试用例集的执行结果 ER, 并记录执行轨迹 P.
(3) 第 3–6 行: 利用原始故障程序的执行结果与执行轨迹, 选择怀疑度计算公式计算每个语句块的怀疑度. 依
据怀疑度对故障语句块降序排序.
(4) 第 7–13 行: 初始化 OperatorSet 集合为空; 得到语句块 b i 下的所有基本语句块, 并将这些语句块的类型加
入集合 blockTypeSet 中; 从 S F 中找到所有匹配的修复模板, 将模板内的修复操作加入到 OperatorSet 中.
P
(5) 第 14–18 行: 利用步骤 (4) 中 OperatorSet 记录的修复操作尝试对这些语句块进行修复, 生成一组经过修复
的程序, 称为临时候选程序集 TCP; 将 TCP 中的候选程序加入到补丁程序集 CP 中.
(6) 第 19–27 行: 使用测试用例测试 CP p; 若某个补丁程序的测试结果不等于预期输出,
表明该补丁程序中的修复是无效的, 结束当前补丁程序的验证; 若某个补丁程序的测试结果完全符合预期, 表明该
补丁程序中的修复是有效的, 停止验证其他补丁程序, 结果集 R 等于 p.
(7) 第 28–32 行: 判断程序修复是否成功; 成功则结束故障修复过程; 否则, 继续修复剩余语句块. 最后返回结果 R.
设测试用例集规模为 L, 原始故障程序含有 W 个语句块, 候选补丁程序集个数为 N, 计算每个语句块的怀疑度
并降序排列时间复杂度为 O(W), 生成并验证补丁程序集时间复杂度为 O(N×L), 总时间复杂度为 O(W+N×L).
2.4 故障修复优化策略
为了进一步提高 BPELRepair 的故障修复效率, 从补丁生成、测试用例选择以及终止条件设定 3 个角度出发,