Page 174 - 《软件学报》2026年第7期
P. 174

宋壹 等: 基于异常检查点植入的软件缺陷定位方法                                                        2859


                 方法需要解决的一项新的挑战.
                    为此, 提出如下方案, 解决检查点自动植入情境下的程序语句风险值计算问题. 对于待测错误程序中的一条程
                 序语句   s, 其风险值  Suspiciousness s 由公式  (1) 计算:

                                                            n ∑
                                                                i
                                               Suspiciousness =  Sus +Assist_Sus                      (1)
                                                         s      s         s
                                                            i=1
                        i
                 其中,  Sus  是基于第  i 条失败测试用例计算得到的语句          s 的风险值, 其通过对比第       i 条失败测试用例的失败执行         e i
                        s
                                                                                                 n ∑
                                                                                                      i
                 上的  ets_fail i 和在相应伪正确版本上通过执行       pe i 的  ets_pass i , 并分析由此确定的分歧点  bp i 计算得到;   Sus  是
                                                                                                      s
                                                                                                 i=1
                 在  n  个失败测试用例上计算的语句         s 的风险值之和, 其将作为       INSPECT  为程序语句    s 所计算风险值的主要部
                 分  (将在第  2.4.1  节中具体介绍).  Assist_Sus s  是通过在待测错误程序上应用行级缺陷定位方法得到的语句               s 的风险
                 值, 作为  INSPECT  为程序语句   s 所计算风险值的辅助部分, 以缓解多条语句可能具有相同风险值造成的                       Tie 问题
                 (将在第  2.4.2  节中具体介绍).
                  2.4.1    基于分歧点分析的语句风险值计算
                    运行第   i 条失败测试用例时, 程序语句        s 在一对失败执行     e i 和通过执行              Sus  由公式  (2) 计算:
                                                                                          i
                                                                                          s
                                                                           pe i 上的风险值
                                                    
                                                    1,  s ∈ Suspicious_Group
                                                    
                                                 i                     i
                                               Sus =                                                 (2)
                                                 s
                                                     0,  s < Suspicious_Group i
                                                    
                 其中,  Suspicious_Group  由在  e i 和  pe i 上被判定为可能含有缺陷的语句组成,     Suspicious_Group  中的语句以表  1
                                   i                                                       i
                 中以“Statements_Begin”“Statements_End”开头的行和  Statements_Ending  为单位, 代表  ets_fail i 在异常触发流中
                                                                             i
                                                                                            i
                 以独立受检的进入和退出为分界的一组被执行程序语句                       (记为    Statements ). 判断   Statements  是否被包含在
                                                                             x
                                                                                            x
                 Suspicious_Group  中的规则如公式  (3) 所示:
                              i

                                                               i
                                                        End_Diff > 0 or
                                                               x
                                                       
                                                       
                                                        
                                                       
                                                                i
                                    i
                             Statements ∈ Suspicious_Group i , if  End_Diff = 0 and (Sit i = 2.2 or 2.3 or 2.4) or  (3)
                                                                x
                                     x
                                                        
                                                       
                                                       
                                                               i              i
                                                         End_Diff = 0 and Begin_Diff = 0 and Sit i = 2.5
                                                                               x
                                                                x
                                                     i
                    具体而言, 根据     ets_fail i , 设  e i 在   Statements  前进入了   Begin_Count  个独立受检, 退出了  End_Count  个独立受
                                                                       i
                                                                                                i
                                                                                                x
                                                     x
                                                                       x
                                                                                                     i
                 检 (以表  1  中异常触发流为例, 假设其展示了         ets_fail i 的完整结构, 则对于  Statements_End_2, 其  Begin_Count  值
                                                                                                      x
                 为  2、 End_Count  值为  1). 同时, 设  e i 在执行到  bp i 为止进入了  Begin_Count_bp i 个独立受检, 退出了
                              i
                              x                                                              End_Count_bp i
                 个独立受检 (考虑到      bp i 自身是一处退出独立受检的位置, 计算           End_Count_bp i 时也包含  bp i 所在的独立受检退
                 出). 若对比  ets_fail i 和  ets_pass i 时未能确定  bp i , 则  Begin_Count_bp i 和  End_Count_bp i 的值为  0. 公式  (3) 中的
                         i         i                       i
                 Begin_Diff  和  End_Diff  分别代表  e i 在  bp i 、 Statements  前进入和退出的独立受检数量的差值, 以公式   (4)、(5) 进
                                                           x
                                   x
                         x
                 行计算:

                                                   i
                                           Begin_Diff = Begin_Count_bp i − Begin_Count i               (4)
                                                   x                         x
                                                    i
                                             End_Diff = End_Count_bp i −End_Count  i x                 (5)
                                                    x
                    下面对公式     (3)–(5) 的设计进行详细解释. 公式      (3) 表明, 如果满足  3  类条件中的任意一个, 则      Statements  被判
                                                                                                    i
                                                                                                    x
                       Suspicious_Group . 其中, 第  1        i       Statements  在 i  bp i 前被执行, 这部分语句的执行可
                 定属于                i         类条件  End_Diff > 0 代表         x
                                                          x
                 能导致   e i 的执行状态受到感染, 并在                                        i       Suspicious_Group  中,
                                             bp i 被观察到. 因此, 满足该条件的
                                                                        Statements  被包含在
                                                                                x                    i
                 成为可疑语句. 第     2  类条件中, Sit i 代表分歧点确定阶段 (第    2.3.2  节) 中捕获  bp i 对应的子情况, 例如, 若  bp i 在子情
                 况  2.2  下被捕获, 则  Sit i 的值为  2.2, 依此类推. 当  bp i 在子情况  2.2、子情况  2.3  或子情况  2.4  下被捕获时, 即使
                 End_Diff  为 i x  0,   Statements  仍被认为包含于  Suspicious_Group  中, 成为可疑语句. 具体而言,  End_Diff  为 i x  0  可能意
                                     i
                                                                i
                                     x
                     Statements  位于  bp i 与  bp i 之后的第  1  次独立受检退出之间, 也可能意味着   ets_fail i 中不存在任何独立受检.
                             i
                 味着          x
                 考虑到情况    2  下捕获的   bp i 是基于对独立受检数量而非异常触发信息的分析得到, 在上述两种可能中, 缺陷语句
                                         i            i
                 同样可能存在于满足        End_Diff = 0  的  Statements  中. 第  3  类条件针对的是子情况  2.5, 在该类情况中, 由于仅在
                                                      x
                                         x
   169   170   171   172   173   174   175   176   177   178   179