Page 49 - 《软件学报》2025年第4期
P. 49
沈阚 等: 基于静态分析的 Python 第三方库 API 兼容性问题检测方法 1455
6 ...
7 else:
8 raise TypeError
9 return rv
(2) 未充分利用 API 内部代码的语义信息. 针对 API 的内部代码, 本文方法仅在两个版本的 API 源代码之间
进行语句级别的匹配分析, 忽略了语句内部的语义信息以及语句与语句之间的语义信息, 这导致本文方法无法识
别兼容性的代码重构, 进而导致方法的错误识别, 如例 14 所示.
例 14: 示例代码 9 中, 第 6 行代码重构为第 7–10 行. 然而, 在分析匹配的 return 语句<s 6 , s 10 > 时, M 1 .unchange=
{s 2 , s 3 , s 4 , s 5 , s 11 }, BSC 1 ={}, S 1 .BR[s 6 ]={s 3 , s 5 , s 6 }, 使得 S 1 .BR[s 6 ]-BSC 1 -M 1 .unchange={s 6 }, 从而导致算法 3 第 26 行
的条件成立, 错误地认为该 API 存在输出不同的返回值 (CI7).
示例代码 9. 未充分利用 API 内部代码的语义信息所导致的错误识别.
numpy
# 版本变更: pandas1.4.4 → pandas1.5.0
1 def is_inferred_bool_dtype(arr):
2 ...
3 if dtype == np.dtype(bool):
4 return True
5 elif dtype == np.dtype(‘object’):
6 – return lib.is_bool_array(arr)
7 + result = lib.is_bool_array(arr)
8 + if result:
9 + warnings.warn(‘In a future version, object-dtype columns with all-bool values will not be
included in reductions with bool_only=True. Explicitly cast to bool dtype
instead.’, FutureWarning, stacklevel=find_stack_level(inspect.currentframe()))
10 + return result
11 return False
4.4 泛化性评估结果 (RQ4)
表 9 展示了本文提出的方法在表 7 数据集上的表现. 工具在 sklearn 库和 numpy 库上的表现与表 8 中在 flask
库和 pandas 库上的表现类似. 总的来看, 方法的宏平均精准率和宏平均召回率分别达到了 88.65% 和 94.59%. 从
更细粒度的角度看, 除参数的范围改变 (CI5)、输出不同的返回值 (CI7) 的精准率较低, 其余类别的精准率和召回
率均不低于 75%. 可见, 本文提出的方法具有良好的泛化性.
表 9 方法在 sklearn 库和 库数据集上的泛化性结果
序号 兼容性问题产生原因 不兼容API数量 (个) 精准率 (%) 召回率 (%)
CI1 参数的增删 19 100 100
CI2 关键字参数的键增删 7 100 100
CI3 参数的重命名 3 100 100
CI4 参数默认值的改变 13 100 100
CI5 参数的范围改变 17 65.22 83.33
CI6 抛出不同的异常 1 100 100
CI7 输出不同的返回值 32 55.32 78.79
宏平均 88.65 94.59