Page 33 - 《软件学报》2025年第4期
P. 33
沈阚 等: 基于静态分析的 Python 第三方库 API 兼容性问题检测方法 1439
新的反应, 研究发现在 22.04% 的提交中开发者会降低使用的第三方库版本, 在 41.52% 的提交中开发者会同时修
改多个机器学习第三方库的使用. 此外, 研究人员还对 Android、Java 生态开展了研究 [22,23] . Liu 等人 [22] 关注
Android 生态中未被第三方库官方文档记录的演化, 发现其中 64.59% 的变更涉及语义变化, 这些变化可能导致其
上层应用发生错误. Dig 等人 [23] 关注 Java 生态中第三方库的演化, 发现超过 80% 的更新会改变程序结构但不改变
程序行为, 即重构.
1.2.2 第三方库 API 的弃用
当第三方库 API 有缺陷、效率低时, 第三方库开发者通常会将这些 API 标记为弃用, 不鼓励上层应用开发者
使用它们, 并且会在删除前保留一段时间. 如果开发者仍然调用这些被弃用的 API, 那么上层应用可能会发生错误.
已有研究人员对第三方库的 API 弃用展开研究 [24−27] . Wang 等人 [24] 分析了 Python 第三方库开发者对弃用 API 的
记录情况以及上层应用开发者对弃用 API 的维护策略. Vadlamani 等人 [25] 通过分析 Python 第三方库源代码中的
API 装饰器、硬编码警告和代码注释来识别弃用 API. Haryono 等人 [26] 设计了用于机器学习第三方库的
MLCatchUp 工具, 通过比较弃用 API 的签名和相关非弃用 API 的签名, 自动推断替代 API, 从而为上层应用开发
者提供修改建议. Brito 等人 [27] 关注第三方库开发者弃用 API 时是否提供了可替换的 API 建议以及建议的质量如
Python
何. 研究发现, 66.7% 的 Java 弃用 API 和 77.8% 的 C#弃用 API 提供了替换 API 建议, 但这些建议的质量并不会随
着第三方库的演化而提高.
1.2.3 第三方库 API 的兼容性问题
已有研究人员对第三方库 API 的兼容性问题展开研究 [5−9] . Mostafa 等人 [5] 、Brito 等人 [6] 对 Java 第三方库
API 兼容性问题的普遍程度、触发条件、表现形式以及更改目的进行研究. Zhao 等人 [7] 关注 Android 第三方库
API 兼容性问题, 总结了与操作系统、特定设备以及内部回调有关的兼容性问题. 此外, Xia 等人 [8] 、Wei 等人 [9]
关注上层应用开发者对第三方库中不兼容 API 的应对方式. 然而, 兼容性问题的总结与语言特性直接相关, 现有对
静态类型语言的兼容性问题研究工作无法直接应用到 Python 生态中. 针对 Python 生态, Zhang 等人 [2] 总结了 8 种
与参数有关的兼容性问题, 分析时按照必选和可选对 Python 的 5 种参数进行划分. 在此基础上, Haryono 等人 [3] 通
过对比机器学习领域的 Python 第三方库 API 源代码, 发现参数输入类型变化、参数输入值变化、参数输入格式
变化带来的兼容性问题. 然而, 这些工作 [2,3] 在收集不兼容 API 时局限于第三方库的更新日志, 导致总结的不兼容
API 类型有遗漏, 忽略了不同参数类别和异常对兼容性问题的影响. 不同的是, 本文首先通过收集版本更新日志,
运行回归测试相结合的方法收集不兼容 API, 并针对 Python 的 5 种参数、异常、返回值分别进行分析, 总结了
API 兼容性问题表现形式和产生原因.
基于对第三方库 API 兼容性问题的认识, 研究人员设计了不兼容 API 的检测方法. 部分研究人员采用了动态
分析方法 [10,11] . Chen 等人 [10] 提出了一种跨客户端项目的动态检测方法, 方法首先在不同版本的第三方库上构建
客户端项目, 然后通过运行客户端内置的测试代码检测第三方库 API 的兼容性问题. Sun 等人 [11] 设计了工具
JUnitTestGen, 该工具通过挖掘 API 用例生成检测兼容性问题的单元测试用例. 动态测试的缺点是覆盖范围有限,
因此, 更多的研究人员寻求用静态方法进行检测 [12−15] . Zhang 等人 [12] 关注 Java 第三方库 API 在返回值上的兼容性
问题, 提出一种遍历 API 调用链并测量 API 内部语义差异的静态检测方法. Mahmud 等人 [13] 、He 等人 [14] 、Yang
等人 [15] 在 Android 生态中的使用静态分析方法对 API 兼容性问题进行检测, 并取得良好效果. 然而, API 兼容性问
题与语言特性直接相关, 现有对静态类型语言的检测工作无法直接应用到 Python 生态中. 针对 Python 生态, Du
等人 [4] 提出了一种动态静态相结合的方法检测 第三方库的模块、类、API 和属性是否存在兼容性问题, 并
按照 API 的断损程度分类. Zhang 等人 [2] 通过手动检查第三方库的更新日志建立关于 API 参数重命名的知识库,
并据此检测上层应用是否调用了存在参数重命名问题的 API . 不同的是, 本文旨在提出一种静态方法对 API 的兼
容性进行检测, 输出细粒度的问题产生原因.
2 关于 Python 第三方库 API 兼容性问题的实证研究
为深入了解 Python 第三方库 API 兼容性问题的表现形式和产生原因, 本文将对其进行实证研究. 首先介绍实