Page 31 - 《软件学报》2025年第4期
P. 31
沈阚 等: 基于静态分析的 Python 第三方库 API 兼容性问题检测方法 1437
本文主要贡献总结如下.
(1) 采用将更新日志与第三方库测试用例相结合的方法, 构建了 Python 第三方库 API 兼容性问题的数据集,
包括 flask 库和 pandas 库中 6 个版本对上的 108 个不兼容 API 对.
(2) 开展了关于 Python 第三方库 API 兼容性问题的实证研究, 总结归纳了 Python 第三方库 API 兼容性问题
的表现形式和产生原因. 其中, 表现形式是从第三方库调用者的角度进行分析, 而产生原因是从第三方库开发者的
角度进行分析.
(3) 提出了基于静态分析技术的 Python 第三方库 API 兼容性问题检测方法, 并通过实验评估证明了所提方法
具有良好的有效性、泛化性、时间性能、空间性能以及易用性.
本文第 1 节介绍研究背景和相关工作. 第 2 节介绍 Python 第三方库 API 兼容性问题的实证研究. 第 3 节介绍
基于静态分析的 Python 第三方库 API 兼容性问题检测方法. 第 4 节对方法的有效性、泛化性、时间性能、空间
性能以及易用性进行评估. 第 5 节讨论方法面临的威胁和应用局限性. 最后总结全文.
1 研究背景与相关工作
可以检查不同, 解释性语言只有通过动态运行到不兼容
1.1 研究背景
1.1.1 API 兼容性问题
如图 1 所示, 上层应用通过 API 调用的形式, 使用了第三方库的代码, 并且在原版本 v o 上可以正确运行. 然
而, 由于第三方库新功能需要、版本存在漏洞或缺陷等原因需要升级或降级版本, 上层应用开发者必然面对切换
版本带来的 API 兼容性问题. 不兼容的 API 是指在上层 API 调用不变的情况下, 其在第三方库的原版本 v o 上可
以正确运行, 但在第三方库的其他版本 (v b 或者 v a ) 运行异常终止或者产生与 v o 版本不一致的结果 [19] . 考虑到版
本切换包括升级和降级, API 兼容性问题包括前向兼容性问题和后向兼容性问题. 从代码修改来看, API 兼容性问
题是由原 API 调用链中的方法发生了修改导致, 例如语句的增加、删除、更新.
上层应用代码
后向兼容性问题 前向兼容性问题
lib.API i
第三方库 第三方库 第三方库
版本 v b 版本 v o 版本 v a
API 1 API 1 API 1
API 2 API 2 API 2
API 3 API 3 API 3
… … …
图 1 API 兼容性问题图示
1.1.2 Python 语言特性
Python 语言特性导致其对兼容性问题更为敏感, 本文从解释性语言、参数和返回值等 3 个方面讨论 Python
语言特性及其对兼容性问题的影响.
1.1.2.1 解释性语言
Python 为解释性语言, 在运行时逐行解释源代码, 将代码翻译成机器代码并执行. 与编译性语言在编译阶段就
API 时, 才可能发现兼容性问题导致的错误.
1.1.2.2 灵活的参数类别
Python 提供了 5 种类别的参数, 即位置参数、默认参数、可变参数、命名关键字参数以及关键字参数. 相较
于其他编程语言, Python 的参数传递方式更加灵活. 在参数变化导致的不兼容 API 中, 可能使得原有 API 调用中
的输入参数格式与新 API 声明的参数格式不一致, 引起 API 兼容性问题. 示例代码 1 展示了 Python 中 API 的 5