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  个角度出发,
   269   270   271   272   273   274   275   276   277   278   279