Page 46 - 《软件学报》2025年第4期
P. 46
1452 软件学报 2025 年第 36 卷第 4 期
例 11: 示例代码 7 中, 算法 3 第 2 行根据全局语句信息更新 BSC 1 ={}, BSC 2 ={s 8 }. 进行首轮第 7–23 行的循环
时, tmp_BSC 1 ={}, tmp_BSC 2 ={s 8 }. 由于 E 2 .C[s 7 ].TryStmts={s 8 }⊆M.add, 在第 9–11 行后 BSC 2 ={s 7 , s 8 , s 9 , s 10 }. 由
于 B 1 [s 6 ].Stmts={s 10 }⊆M 1 .unchange∪BSC 1 , 在 15–17 行后 BSC 1 ={s 6 }. 此时第 22 行的条件不成立, 再次进入循环.
第 2 轮循环中 BSC 1 和 BSC 2 没有更新, 第 22 行的条件成立, 跳出循环, 此时 BSC 1 ={s 6 }, BSC 2 ={s 7 , s 8 , s 9 , s 10 }. 因
此, 在第 24–26 行分析保留 return 语句 s 1 时, 第 26 行的条件不成立. 又因为 M.del∩R 1 =M.add∩R 2 ={}, 所以该
0
API 不存在输出不同的返回值 (CI7).
例 12: 示例代码 4 中, 算法 3 在第 18–21 行分析匹配的条件分支语句<s 3 , s 4 > 时, B 1 [s 3 ]. Stmts={s 5 }, M 1 .unchange∪
BSC 1 ={s 2 }, 导致第 20 行的条件无法成立, 最终 BSC 1 =BSC 2 ={}. 在第 24–26 行分析匹配 return 语句<s 5 , s 6 > 时,
S 1 .BR[s 5 ]={s 3 , s 5 }, S 1 .BR[s 5 ]-BSC 1 -M 1 .unchange={s 3 , s 5 }, 导致第 26 行的条件成立, 更新 CI 为{CI7}.
4 实验评估
本节对检测方法进行实验评估, 首先介绍实验设计, 然后介绍实验数据与评价指标, 最后介绍有效性、泛化性、
时间性能和空间性能以及易用性的评估结果.
4.1 实验设计
为了评估本文提出的方法能否有效检测 Python 第三方库 API 的兼容性问题, 设计了如下 4 个研究问题.
RQ3: 本文提出方法的有效性如何?
RQ4: 本文提出方法的泛化性如何?
RQ5: 本文提出方法的时间性能和空间性能如何?
RQ6: 本文提出方法的易用性如何?
4.2 实验数据与评价指标
4.2.1 有效性评估 (RQ3)
4.2.1.1 实验数据 (recall) 来评估方法的有效性
在第 2.2.2 节中本文已经在 flask 库和 pandas 库上收集到 108 个有兼容性问题的 API 对, 即正样本. 为评估方
法的有效性, 本文进一步通过更新日志和回归测试相结合的方法, 在表 2 的 6 个版本对上进行负样本的收集, 即收
集兼容 API 对. 为确保负样本数据的可靠性, API 被归类为负样本需要满足两个条件: 第一, 该 API 在第三方库 v1
版本中有相应的测试用例, 并且在 v2 版本中成功通过回归测试; 第二, 更新日志中显示变更此 API 的原因包含“缺
陷修复”“性能提升”“代码重构”等关键字. 通过上述方法, 本文共收集到 108 个不兼容 API 对 (正样本) 以及 108 个
兼容 API 对 (负样本). 为确保有效性评估的真实性, 本文仅对收集到的这 216 个 API 对进行检测. 具体来说, 评估
时对方法的输入为第三方库前后两个版本的源代码, 并且指定方法对这 216 个 API 对进行检测.
4.2.1.2 评价指标
兼容性问题产生原因的检测可以抽象为一个多标签分类问题 (multi-label classification), 因此按照多标签分类
的精准率 (precision) 和召回率 [30] .
精准率衡量了数据集在所有被预测为正标签的样本中, 真正为正样本的比例. 在本实验中, 一方面会分别评
估 7 种细粒度兼容性问题产生原因 (CI1–CI7) 的精准率; 另一方面计算各产生原因的宏平均精准率, 即 7 个精准
率的算数平均值.
召回率衡量了数据集的所有正样本中被成功检测到的比例. 在本实验中, 一方面会分别评估 7 种细粒度兼容
性问题产生原因 (CI1–CI7) 的召回率; 另一方面计算各产生原因的宏平均召回率, 即 7 个召回率的算数平均值.
4.2.2 泛化性评估 (RQ4)
4.2.2.1 实验数据
本文在机器学习领域的 sklearn 库 [31] 以及科学计算领域的 numpy 库 [32] 上评估方法的泛化性. 首先, 本文根据