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

