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

1452                                                       软件学报  2025  年第  36  卷第  4  期


                    例  11: 示例代码  7  中, 算法  3  第  2  行根据全局语句信息更新    BSC 1 ={}, BSC 2 ={s 8 }. 进行首轮第  7–23  行的循环
                 时, tmp_BSC 1 ={}, tmp_BSC 2 ={s 8 }. 由于  E 2 .C[s 7 ].TryStmts={s 8 }⊆M.add, 在第  9–11  行后  BSC 2 ={s 7 , s 8 , s 9 , s 10 }. 由
                 于  B 1 [s 6 ].Stmts={s 10 }⊆M 1 .unchange∪BSC 1 , 在  15–17  行后  BSC 1 ={s 6 }. 此时第  22  行的条件不成立, 再次进入循环.
                 第  2  轮循环中  BSC 1 和  BSC 2 没有更新, 第  22  行的条件成立, 跳出循环, 此时   BSC 1 ={s 6 }, BSC 2 ={s 7 , s 8 , s 9 , s 10 }. 因
                 此, 在第  24–26  行分析保留   return  语句  s 1 时, 第  26  行的条件不成立. 又因为  M.del∩R 1 =M.add∩R 2 ={}, 所以该
                                                 0
                 API 不存在输出不同的返回值        (CI7).
                    例  12: 示例代码  4 中, 算法  3 在第  18–21 行分析匹配的条件分支语句<s 3 , s 4 > 时, B 1 [s 3 ]. Stmts={s 5 }, M 1 .unchange∪
                 BSC 1 ={s 2 }, 导致第  20  行的条件无法成立, 最终  BSC 1 =BSC 2 ={}. 在第  24–26  行分析匹配  return  语句<s 5 , s 6 > 时,
                 S 1 .BR[s 5 ]={s 3 , s 5 }, S 1 .BR[s 5 ]-BSC 1 -M 1 .unchange={s 3 , s 5 }, 导致第  26  行的条件成立, 更新  CI 为{CI7}.

                 4   实验评估

                    本节对检测方法进行实验评估, 首先介绍实验设计, 然后介绍实验数据与评价指标, 最后介绍有效性、泛化性、
                 时间性能和空间性能以及易用性的评估结果.

                 4.1   实验设计
                    为了评估本文提出的方法能否有效检测              Python  第三方库  API 的兼容性问题, 设计了如下       4  个研究问题.
                    RQ3: 本文提出方法的有效性如何?
                    RQ4: 本文提出方法的泛化性如何?
                    RQ5: 本文提出方法的时间性能和空间性能如何?
                    RQ6: 本文提出方法的易用性如何?

                 4.2   实验数据与评价指标

                 4.2.1    有效性评估  (RQ3)

                 4.2.1.1    实验数据        (recall) 来评估方法的有效性
                    在第  2.2.2  节中本文已经在    flask  库和  pandas 库上收集到  108  个有兼容性问题的   API 对, 即正样本. 为评估方
                 法的有效性, 本文进一步通过更新日志和回归测试相结合的方法, 在表                     2  的  6  个版本对上进行负样本的收集, 即收
                 集兼容   API 对. 为确保负样本数据的可靠性, API 被归类为负样本需要满足两个条件: 第一, 该                    API 在第三方库   v1
                 版本中有相应的测试用例, 并且在          v2  版本中成功通过回归测试; 第二, 更新日志中显示变更此               API 的原因包含“缺
                 陷修复”“性能提升”“代码重构”等关键字. 通过上述方法, 本文共收集到                   108  个不兼容  API 对  (正样本) 以及  108  个
                 兼容  API 对  (负样本). 为确保有效性评估的真实性, 本文仅对收集到的这                216  个  API 对进行检测. 具体来说, 评估
                 时对方法的输入为第三方库前后两个版本的源代码, 并且指定方法对这                       216  个  API 对进行检测.

                 4.2.1.2    评价指标
                    兼容性问题产生原因的检测可以抽象为一个多标签分类问题                      (multi-label classification), 因此按照多标签分类
                 的精准率   (precision) 和召回率                      [30] .
                    精准率衡量了数据集在所有被预测为正标签的样本中, 真正为正样本的比例. 在本实验中, 一方面会分别评
                 估  7  种细粒度兼容性问题产生原因         (CI1–CI7) 的精准率; 另一方面计算各产生原因的宏平均精准率, 即               7  个精准
                 率的算数平均值.
                    召回率衡量了数据集的所有正样本中被成功检测到的比例. 在本实验中, 一方面会分别评估                              7  种细粒度兼容
                 性问题产生原因      (CI1–CI7) 的召回率; 另一方面计算各产生原因的宏平均召回率, 即              7  个召回率的算数平均值.

                 4.2.2    泛化性评估  (RQ4)

                 4.2.2.1    实验数据
                    本文在机器学习领域的         sklearn  库  [31] 以及科学计算领域的  numpy  库  [32] 上评估方法的泛化性. 首先, 本文根据
   41   42   43   44   45   46   47   48   49   50   51