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

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



                 2       ...
                 3    –   if self._current_row_in_file_index >= self.row_count:
                 4    +   if nrows > 0 and self._current_row_in_file_index >= self.row_count:
                 5    –    return None
                 6    +    return DataFrame()

                    例  3: 示例代码  5  中, 当  ctx  为  None 时, v1  版本  pandas1.4.4  中  render_template 运行至第  5  行时会抛出异常
                 AttributeError, 这导致上层应用执行第    3、4  行的代码块. 然而, v2   版本  pandas1.5.0  中新增的第  3、4  行导致相同
                 情况下会抛出异常       RuntimeError 而非  AttributeError, 导致上层应用代码中的  except 语句无法捕获异常, 进而异常
                 终止.
                 示例代码   5. 新异常无法捕获错误       (S6).

                 # 版本变更: pandas1.4.4 → pandas1.5.0
                 1       def render_template(template_name_or_list, **context):
                 2       ctx = _app_ctx_stack.top
                 3    +   if ctx is None:
                 4    +    raise RuntimeError(‘This function can only be used when an application context is active.’)
                 5       ctx.app.update_template_context(context)
                 6       return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list), context, ctx.app)
                 # 受兼容性问题影响的上层应用代码
                 1       try:
                 2       render_template(template_name_or_list)
                 3       except AttributeError:
                 4       pass
                                             API 调用者的角度看, API 兼容性问题的表现形式有
                                     第三方库
                        结论: 从
                                                                                        种, 分别为输入参数
                    RQ1 CI2
                               Python
                                                                                       6
                 格式错误    (S1/25.93%)、非法输入参数值       (S2/39.81%)、非法输入参数类型        (S3/2.78%)、输出变量值错误
                 (S4/37.04%)、输出变量类型错误      (S5/0.93%) 和新异常无法捕获错误      (S6/5.56%), 它们最终会反映为上层应用的非
                 正常运行. 其中, 非法输入参数值        (S2) 和输出变量值错误      (S4) 占比最高.

                 2.4   实证研究的结果: Python  第三方库    API 兼容性问题的产生原因        (RQ2)
                    通过对收集到的       108  个有兼容性问题的     API 对进行分析, 本文发现      Python  第三方库  API 兼容性问题的产生
                 原因有   7  种, 分布如表  4、图  3  所示. 其中  CI1–CI5  与参数有关, CI6  与异常有关, CI7  与返回值有关.

                                         表 4 Python  第三方库  API 兼容性问题的产生原因

                      序号    兼容性问题产生原因           总计 (个)     flask库不兼容API数量 (个)   pandas库不兼容API数量 (个)
                      CI1      参数的增删              26               5                     21
                            关键字参数的键增删             1                0                     1
                      CI3      参数的重命名             3                1                     2
                      CI4    参数默认值的改变             11               2                     9
                      CI5     参数的范围改变             45               2                     43
                      CI6     抛出不同的异常             6                3                     3
                      CI7    输出不同的返回值             31               7                     24
                                  总计              108              17                    91
                    注: 由于一个API可能由多种原因导致不兼容, 总计数据小于各项加和
   32   33   34   35   36   37   38   39   40   41   42