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

2858                                                       软件学报  2026  年第  37  卷第  7  期


                 ets_pass i 中第  k 条信息对比. 在比较一对以“End”开头的信息时, 其体现的执行状态包括两部分, 即                  Checkpoint#i
                 和  triggeredOrNot. 具体而言, 若一对信息的   Checkpoint#i 不同, 代表其所对应的独立受检是在不同的关键检查点
                 上完成的, 在此时     e i 已与  pe i 具有不同的执行路径, 因此被视为存在不同的执行状态; 若一对信息的                triggeredOrNot
                 不同, 代表  e i 和  pe i 在对应的独立受检中分别触发和未触发异常, 同样被视为存在不同的执行状态. 换句话说, 当
                 且仅当一对信息的       Checkpoint#i 和  triggeredOrNot 均相同时, e i 和  pe i 被认为在对应的独立受检中具有相同的执
                 行状态. 按照顺序依次对       ets_fail i 和  ets_pass i 中的前  k 条信息进行比对, 根据是否发现不同的执行状态, 可以得到
                 情况  1 (在独立受检中发现不同执行状态) 和情况            2 (在独立受检中未发现不同执行状态).
                    在情况   1  中, 发现了不同的执行状态的信息将被记为             bp i . 若多对以“End”开始的信息均体现了不同的执行状
                 态, 则最早被收集的信息将被记为           bp i . 这是因为异常触发流是按照程序的实际执行顺序收集的, 执行状态首次出
                 现不同时, 缺陷语句可能已被执行, 该策略可减少缺陷语句的排查空间.
                    若对比   ets_fail i 和  ets_pass i 中前  k 条以“End”开头的信息未能发现不同的执行状态     (即情况  2), 则进一步尝试
                 通过对比   count_fail i 和  count_pass i 的值来确定分歧点  bp i . 具体可分为以下  5  种子情况.
                    ● 子情况   2.1: count_fail i  = count_pass i . 若  ets_fail i 和  ets_pass i 中的独立受检数量相等, 且按顺序对比独立受检
                 无法发现不同的执行状态, 则在          f i 上基于检查点收集的异常触发信息不足以用于捕获执行状态分歧点. 在这一子
                 情况中, bp i 无法确定, f i 将在后续的缺陷定位环节被忽略.
                    ● 子情况   2.2: 0 < count_fail i  < count_pass i . 若  ets_fail i 中存在更少的独立受检, 则第  count_fail i 条以“End”开始
                 的信息将成为     bp i . 因为  e i 在该点后直接终止了执行, 而    pe i 却在该点后继续进入更多的独立受检, 所以尽管该点
                 并未显式地通过      Checkpoint#i 或  triggeredOrNot 表现出  e i 、pe i 之间的执行差异, 其仍可被视为二者之间执行状态
                 的分歧点.
                    ● 子情况   2.3: 0 < count_pass i  < count_fail i . 若  ets_fail i 中存在更多的独立受检, 则第  count_pass i 条以“End”开
                 始的信息将成为      bp i . 因为  pe i 在该点后直接终止了执行, 而   e i 却在该点后继续进入更多的独立受检, 所以尽管该
                 点并未显式地通过       Checkpoint#i 或  triggeredOrNot 表现出  e i 、pe i 之间的执行差异, 其仍可被视为二者之间执行状
                 态的分歧点.
                    ● 子情况   2.4: 0 = count_fail i  < count_pass i . 若仅  pe i 进入了独立受检, 则无法将任何一条以“End”开始的信息确
                 定为  bp i , 该种情况下的语句风险值计算方法将在第           2.4  节中讨论.
                    ● 子情况   2.5: 0 = count_pass i  < count_fail i . 若仅  e i 进入了独立受检, 由于  ets_fail i 中以“End”开始的信息均未
                 参与比对, 故不将任何一条以“End”开始的信息确定为              bp i , 该种情况下的语句风险值计算方法将在第           2.4 节中讨论.
                  2.4   程序语句风险值计算
                    前期  EXPECT  方法已经证实, 在待测程序原本自带异常处理语句的情况下, 收集得到的异常触发流及基于其
                 得到的分歧点可以帮助实现有效的缺陷定位. 在本文所面向的异常处理语句缺失情况下, 异常触发流的收集及分
                 歧点的确定基于的是        INSPECT  方法自动植入的检查点, 此时它们是否仍具备良好的缺陷定位能力尚不明确. 为
                 此, 利用第  2.2  节探索性实验中随机生成的         40  个待测错误版本继续进行验证. 具体而言, 在这些待测错误版本及
                 其对应的伪正确版本上, 收集所有失败测试用例的失败执行和通过执行, 进而分别获取两种执行状态下的异常触
                 发流并进行比对. 结果显示, 在        100%  的待测错误版本中, 均可以容易地通过比对来确定分歧点, 且真实缺陷语句
                 均存在于分歧点之前的执行跟踪信息中. 上述探索性研究中                    40  个错误版本真实缺陷语句与分歧点的位置关系比
                 对结果, 在本文开源仓库中予以提供. 这一结论说明, 在本文面向的异常处理语句缺失的情况下, 上述异常触发流
                 收集方法及衍生的分歧点定位方法, 具有为缺陷定位任务提供有效支撑的潜力. 但是, 前期                            EXPECT  方法的实施
                 基于的是待测错误程序自带的异常处理语句, 其本身反映了开发人员对程序中缺陷可能所在位置的理解, 因此, 在
                 其结论中, 绝大多数缺陷都处于“分歧点和其之前最近的检查点”之间. 而在本文所提                          INSPECT  方法中, 异常处理
                 语句均为自动化植入, 因此缺陷位置难以被精确地限定在同一范围, 而只能如上所述地被推测位于分歧点之前. 因
                 此, 如何在更加模糊的范围内设计一套有效的程序语句风险值计算方法, 是                        INSPECT  方法相较于前期     EXPECT
   168   169   170   171   172   173   174   175   176   177   178