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

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



                 6           ...
                 7         else:
                 8            raise TypeError
                 9       return rv
                    (2) 未充分利用    API 内部代码的语义信息. 针对        API 的内部代码, 本文方法仅在两个版本的            API 源代码之间
                 进行语句级别的匹配分析, 忽略了语句内部的语义信息以及语句与语句之间的语义信息, 这导致本文方法无法识
                 别兼容性的代码重构, 进而导致方法的错误识别, 如例                14  所示.
                    例  14: 示例代码  9 中, 第  6 行代码重构为第    7–10 行. 然而, 在分析匹配的    return 语句<s 6 , s 10 > 时, M 1 .unchange=
                 {s 2 , s 3 , s 4 , s 5 , s 11 }, BSC 1 ={}, S 1 .BR[s 6 ]={s 3 , s 5 , s 6 }, 使得  S 1 .BR[s 6 ]-BSC 1 -M 1 .unchange={s 6 }, 从而导致算法  3  第  26  行
                 的条件成立, 错误地认为该        API 存在输出不同的返回值        (CI7).
                 示例代码   9. 未充分利用    API 内部代码的语义信息所导致的错误识别.

                                                          numpy
                 # 版本变更: pandas1.4.4 → pandas1.5.0
                 1       def is_inferred_bool_dtype(arr):
                 2       ...
                 3       if dtype == np.dtype(bool):
                 4         return True
                 5       elif dtype == np.dtype(‘object’):
                 6    –    return lib.is_bool_array(arr)
                 7    +    result = lib.is_bool_array(arr)
                 8    +    if result:
                 9    +      warnings.warn(‘In a future version, object-dtype columns with all-bool values will not be
                                         included in reductions with bool_only=True. Explicitly cast to bool dtype
                                         instead.’, FutureWarning, stacklevel=find_stack_level(inspect.currentframe()))
                 10  +     return result
                 11       return False

                 4.4   泛化性评估结果   (RQ4)
                    表  9  展示了本文提出的方法在表        7  数据集上的表现. 工具在      sklearn  库和  numpy  库上的表现与表  8  中在  flask
                 库和  pandas 库上的表现类似. 总的来看, 方法的宏平均精准率和宏平均召回率分别达到了                       88.65%  和  94.59%. 从
                 更细粒度的角度看, 除参数的范围改变            (CI5)、输出不同的返回值       (CI7) 的精准率较低, 其余类别的精准率和召回
                 率均不低于    75%. 可见, 本文提出的方法具有良好的泛化性.

                                      表 9 方法在   sklearn  库和     库数据集上的泛化性结果

                     序号         兼容性问题产生原因              不兼容API数量 (个)          精准率 (%)         召回率 (%)
                     CI1           参数的增删                     19                100             100
                     CI2        关键字参数的键增删                    7                 100             100
                     CI3           参数的重命名                    3                 100             100
                     CI4         参数默认值的改变                    13                100             100
                     CI5          参数的范围改变                    17                65.22           83.33
                     CI6          抛出不同的异常                    1                 100             100
                     CI7         输出不同的返回值                    32                55.32           78.79
                                          宏平均                                  88.65           94.59
   44   45   46   47   48   49   50   51   52   53   54