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 兼容性问题的表现形式和产生原因, 本文将对其进行实证研究. 首先介绍实
   28   29   30   31   32   33   34   35   36   37   38