Page 52 - 《软件学报》2025年第4期
P. 52
1458 软件学报 2025 年第 36 卷第 4 期
内部代码, 本文提取了多种代码信息, 包括取语句匹配信息 M、参数信息 P、返回值信息 R、异常流信息 E、切
片信息 S 以及条件分支信息 B. 未来可以考虑增加过程间分析, 通过 API 调用链分析充分利用 API 外部代码, 并对
语句语义进行细粒度分析, 从而充分利用 API 外部代码、内部代码的语义信息.
(2) 泛化性威胁. 对本文方法泛化性的威胁主要与 Python 第三方库及其版本对的选择有关. 在构建数据集时,
为确保 API 兼容性标注的准确性, 本文采用将回归测试和更新日志相结合的方法, 构建时间成本较高. 因此, 本文
只选择了 4 个常用 Python 第三方库的 12 个版本对进行实验评估. 为了减少第三方库及其版本选择造成的泛化性
威胁, 在第三方库的选择上, 本文选择了 4 个不同领域的常用第三方库, 分别是 Web 开发领域的 flask 库、数据分
析领域的 pandas 库、机器学习领域的 sklearn 库、科学计算领域的 numpy 库; 在版本对的选择上, 本文对每个第
三方库均选取最新的跨 major 版本对、跨 minor 版本对、跨 patch 版本对. 未来可以考虑在更多第三方库、更多
版本对上构建数据集, 并进行更深入的实验评估.
5.2 应用局限性分析
本文提出的方法虽然能够根据兼容性问题产生原因检测出不兼容 API, 但需要被提供第三方库前后两个版本
的源代码才会进行兼容性问题的检测, 在实际应用中存在局限性. 未来可以考虑通过将本方法集成到持续集成/持
是否存在兼容性问题, 进一步提升方法的实时检测能力.
续部署 (CI/CD) 流程的工具中来提升方法的实时检测能力. 具体来说, 在构建时自动拉取第三方库 commit 的源代
码, 并计算出变更 API 的列表. 当开发者需要某 API 的兼容性问题信息时, 工具立即检测此 API, 从而实现实时或
近实时的不兼容 API 检测.
6 总 结
Python 第三方库会频繁发生更新, 其中部分 API 发生了不兼容的更改, 导致上层应用运行出现异常终止或者
产生不一致的结果. 本文围绕 Python 第三方库 API 的兼容性问题展开研究. 首先, 本文采用更新日志与回归测试
结合的方法在 flask 库和 pandas 库的 6 个版本对上构建兼容性问题的数据集. 接着, 本文根据收集到的数据对
Python 第三方库 API 兼容性问题进行实证研究, 分析兼容性问题的表现形式和产生原因. 最后, 本文提出了一种
基于静态分析技术的 Python 第三方库 API 兼容性问题检测方法. 本文在 4 个常用 Python 第三方库的共计 12 个
版本对上进行了实验评估, 证明了该方法的具有良好的有效性、泛化性、时间性能、空间性能以及易用性. 本文
提出的检测方法能根据兼容性问题的产生原因检测出不兼容 API, 但仍存在改进空间, 对方法的未来展望如下.
(1) 提升方法的有效性. 制约本文方法有效性的主要因素有两个: 一是方法主要分析 API 内部代码, 没有充分
利用 API 外部代码, 比如未分析 API 内部所调用的其它 API 代码; 二是方法在语句级别进行匹配分析, 未充分利
用 API 内部的语义信息. 未来可以考虑增加过程间分析, 通过 API 调用链分析充分利用 API 外部代码, 并对语句
语义进行细粒度分析, 从而充分利用 API 外部代码、内部代码的语义信息.
(2) 提升方法的实用性. 本文方法是从第三方库的版本级别出发, 检测两个不同版本中存在兼容性问题的 API.
未来可以考虑将本文方法的应用场景拓宽到代码提交级别, 将方法集成到持续集成/持续部署 (CI/CD) 流程的工具
中. 具体来说, 在构建时自动拉取第三方库代码提交前后的源代码, 计算出变更 API 的列表, 并检测这些变更 API
(3) 提升方法的通用性. 本文是在 Python 生态中研究了第三方库 API 的兼容性问题, 并提出了基于静态分析
的 Python 第三方库 API 兼容性问题的检测方法. 未来可以考虑在 JavaScript、Java 等其它语言生态中收集第三方
库的不兼容 API 对, 探究本文实证研究结果的通用性. 然后根据具体语言特性对本文方法进行扩展, 将方法推广到
其它语言生态中. 例如, Java 语言没有关键字参数, 所以不存在关键字参数的键增删 (CI2) 导致的兼容性问题.
References:
[1] Islam M, Jha AK, Nadi S, Akhmetov I. PyMigBench: A benchmark for python library migration. In: Proc. of the 20th Int’l Conf. on
Mining Software Repositories (MSR). Melbourne: IEEE, 2023. 511–515. [doi: 10.1109/MSR59073.2023.00075]
[2] Zhang ZX, Zhu HC, Wen M, Tao YD, Liu YP, Xiong YF. How do python framework APIs evolve? An exploratory study. In: Proc. of the