Page 35 - 《软件学报》2025年第4期
P. 35

沈阚 等: 基于静态分析的      Python  第三方库  API 兼容性问题检测方法                                  1441


                 败, 发现  70  个不兼容  API 对.
                    第三方库更新日志: 分析第三方库           v2  版本的更新日志, 若发现日志中出现“减少参数”“增加处理”“不再支持”
                 等关键字, 则认为对应的       API 对存在兼容性问题. 由于跨        patch  版本对并非紧密相连, 分析跨      patch  版本对时, 还会
                 分析  v1  至  v2  中间版本的更新日志, 但仅记录更改保留至           v2  版本的  API . 例如, 除了分析   flask  库版本  2.0.0、
                 2.2.0、2.1.3  的更新日志外, 还会分析版本      2.1.1、2.1.2  中保留至版本  2.1.3  的更新. 通过分析共计   11  个更新日志,
                 额外发现   38  个不兼容  API 对.
                    为提升数据的可信度, 不兼容          API 对的收集过程由本文第一作者和第二作者独立完成, 第三位作者负责解决
                 分歧. 具体来说, 当一个不兼容        API 对仅由一位作者收集发现时, 前三位作者开会分析此                 API 对的源代码、回归
                 测试、更新日志, 并讨论决定此          API 是否存在兼容性问题. 同样地, 从表现形式            (RQ1) 和产生原因    (RQ2) 这两个
                 角度对不兼容     API 对的分类过程也根据上述过程进行验证.

                 2.3   实证研究的结果: Python  第三方库    API 兼容性问题的表现形式        (RQ1)
                    从  Python  第三方库  API 调用者的角度看, 调用不兼容        API 会造成上层应用在两个版本上的运行行为发生改
                 变. 通过对收集到的      108  个不兼容  API 对进行分析, 本文发现       Python  第三方库  API 兼容性问题的表现形式有
                 6  种, 如表  3、图  2  所示.

                                         表 3 Python  第三方库  API 兼容性问题的表现形式

                     序号     兼容性问题表现形式           总计 (个)     flask库不兼容API数量 (个)    pandas库不兼容API数量 (个)
                     S1      输入参数格式错误             28                6                     22
                     S2      非法输入参数值              43                1                     42
                     S3      非法输入参数类型              3                1                     2
                     S4      输出变量值错误              40                8                     32
                     S5      输出变量类型错误              1                0                     1
                     S6     新异常无法捕获错误              6                3                     3
                                 总计               108              17                     91
                   注: 由于一个不兼容API在不同调用中表现形式不同, 总计数据小于各项加和
                                                   第三方库
                                        新异常无法捕获错误 (S6)
                                              6 个
                                                                          输入参数格式错误 (S1)
                                    输出变量类型错误 (S5)
                                                                                28 个
                                          1 个

                                 输出变量值错误 (S4)
                                      40 个




                                     非法输入参数类型 (S3)                       非法输入参数值 (S2)
                                           3 个                                43 个

                                         图 2 Python        API 兼容性问题的表现形式

                    28  个  API 的兼容性问题表现为输入参数格式错误            (S1), 即上层调用  API 的格式与第三方库中        API 的签名不
                 匹配. 此时, Python  默认抛出异常    TypeError.
                    例  1: 示例代码  2  中, 默认参数  encoding  被删除, 导致运行  cls.to_stata(‘fname’, convert_dates=‘convert _dates’,
                 write_index=‘write_index’, encoding=‘latin-1’, byteorder=‘byteorder’) 时抛出异常  TypeError: to_stata() got an
                 unexpected keyword argument ‘encoding’. 此外, 由于必选参数  fname  被重命名为  path, 上层调用  cls.to_stata
                 (fname=‘fname’) 时抛出异常  TypeError: to_stata() got an unexpected keyword argument ‘fname’.
   30   31   32   33   34   35   36   37   38   39   40