Page 40 - 《软件学报》2025年第4期
P. 40
1446 软件学报 2025 年第 36 卷第 4 期
的要求范围发生变化, 例如示例代码 3. 此种原因导致的兼容性问题表现为非法输入参数值 (S2) 或非法输入参数
类型 (S3).
2.4.2 与异常有关的兼容性问题 (CI6)
6 个 API 的兼容性问题由抛出不同的异常 (CI6) 导致. 抛出不同的异常指第三方库 API 在相同条件下会抛出
不同的异常, 例如示例代码 5. 此种原因导致的兼容性问题表现为新异常无法捕获错误 (S6).
2.4.3 与返回值有关的兼容性问题 (CI7)
31 个 API 的兼容性问题由输出不同的返回值 (CI7) 导致. 输出不同的返回值是指当相同输入的情况下, API
输出不同的返回值, 例如示例代码 4. 此种原因导致的兼容性问题表现为输出变量值错误 (S4) 或输出变量类型错
误 (S5).
RQ2 结论: 从 Python 第三方库 API 开发者的角度看, API 兼容性问题的产生原因有 7 种, 分别是参数的增删
(CI1/24.07%)、关键字参数的键增删 (CI2/0.93%)、参数的重命名 (CI3/2.78%)、参数默认值的改变 (CI4/10.19%)、
参数的范围改变 (CI5/41.67%)、抛出不同的异常 (CI6/5.56%) 和输出不同的返回值 (CI7/28.70%). 其中 CI1–CI5 与
参数有关, CI6 与异常有关, CI7 与返回值有关.
程间分析, 所以本步骤中仅提取路径和名称均不变的保留
3 基于静态分析的 Python 第三方库 API 兼容性问题检测方法
基于实证研究中发现的 Python 第三方库 API 兼容性问题的 7 种产生原因 (CI1–CI7), 本文提出了一种基于静
态分析的检测方法, 用于检测 Python 第三方库 API 的兼容性问题. 方法的核心思想是在语句级别切片分析与参数、
异常、返回值有关的数据流、控制流, 进而分别检测与参数有关的兼容性问题 (CI1–CI5)、与异常有关的兼容性
问题 (CI6)、与返回值有关的兼容性问题 (CI7). 图 4 展示了方法的整体框架. 该方法的输入包括第三方库 v1 版本
和 v2 版本的源代码, 输出为兼容性问题的产生原因集合 CI. 方法主要分为 3 步, 包括预处理、代码信息提取和兼
容性问题检测.
3.1 预处理 3.2 代码信息提取 3.3 兼容性问题检测
语句匹配信息 (M) 检测与参数有关的兼容性问题
第三方库 v1 版本 API 提取 语句切片信息 (S)
参数信息 (P) 兼容性问题
全局语句信息 (G) 检测与异常有关的兼容性问题 产生原因集合 CI
API 规范化 返回值信息 (R) 条件分支信息 (B)
第三方库 v2 版本 检测与返回值有关的兼容性问题
异常流信息 (E)
图 4 基于静态分析的 Python 第三方库兼容性问题检测方法的框架示意图
3.1 预处理
3.1.1 API 提取
首先逐个提取 API 源代码和 API 所在文件的全局语句. 作为解释性语言, Python 拥有脚本语言的特性, 即代
码语句可以在函数体外声明和运行. 这部分语句具有声明和操作全局变量、导入模块、导入模块中特定对象等作
用. 因此, 全局语句会对 API 的行为产生影响, 检测时需要将它们与 API 源代码一同提取出来. 记 v1 版本和 v2 版
本中提取的 API 源代码分别为 APIcode 1 和 APIcode 2 . 本方法仅检测保留在同一路径中的同名 API, 并且不涉及过
API. 具体来说, 对于保留的函数, 本步骤仅提取路径、
函数名均不变的函数; 对于保留的类成员函数, 本步骤仅提取路径、类名、函数名均不变的类成员函数.
3.1.2 API 规范化
源代码通常会包含代码注释、类型注释、空白行与代码换行, 这些元素对 API 的行为没有直接影响. 为提高
方法后续分析的准确性, 对 APIcode 1 和 APIcode 2 进行规范化处理, 将代码注释、类型注释、空白行和代码换行统
一删除. 规范化时先将源代码转化成抽象语法树, 再从抽象语法树反向解析出源代码, 反向解析时忽略代码注释、
类型注释、空白行和代码换行. 若发现规范后的 APIcode 1 和 APIcode 2 完全一致, 即 API 未发生变更, 则认为该