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

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


                 集合.
                    (1) 有关参数的前向切片信息         S.FP: 对每个参数   p  进行前向切片, 抽取与参数       p  存在控制流和数据流关系的
                 语句集合, 记为    S.FP[p].
                    (2) 有关返回值的后向切片信息         S.BR: 每个  return  语句  s i 进行后向切片, 抽取与  s i 存在控制流和数据流关系
                 的语句集合    (含语句   s i ), 记为  S.BR[s i ].

                 3.2.6    全局语句信息  (G)
                    全局语句信息用集合        G  记录源代码   APIcode 中的全局语句.

                 3.2.7    条件分支信息  (B)
                    Python  通过  if-elif-else 结构控制条件分支的跳转, 条件分支信息记录条件分支语句及其跳转条件, 由                  Map  类
                 型  s i : <condition, Stmts> 构成. 元素  s i 记录  if 语句或  elif 语句或  else 语句, 元素  condition  记录  s i 的成立条件, 元素
                 Stmts 是记录该条件成立后此条件分支结构中所运行代码块的语句集合.
                    例  5: 示例代码  5  中, 语句匹配信息为    M.add={s 3 , s 4 }, M.del=M.change={}, M.unchange={<s 2 , s 2 >, <s 5 , s 5 >, <s 6 ,
                 s 6 >}; 参数信息为  P 1 .pst=P 2 .pst={‘template_name_or_list’: 1}, P 1 .abt=P 2 .abt=NA, P 1 .kwargs=P 2 .kwargs= ‘context’,
                              API 中可能存在的兼容性问题产生原因集合
                 P 1 .dft=P 2 .dft=P 1 .key=P 2 .key={}, 其中  P 1 .pst[‘template_name_or_list’].idx=1; 返回值信息为  R 1 =R 2 ={s 6 }; 异常流信息
                 为  E 1 .C=E 2 .C={}, E 1 .R={s 5 : <AttributeError, AttributeNotFound(ctx, app) OR AttributeNotFound(ctx.app,
                 update_template_context)>}, E 2 .R={s 4 : <RuntimeError, ctx is None>}, 其中  E 2 .R[s 4 ].exception=RuntimeError,
                 E 2 .R[s 4 ].condition=ctx is None; 切片信息为  S 1 .FP[‘template_name_or_list’]=S 2 .FP[‘template_name_or_list’]= {s 6 },
                 S 1 .BR[s 6 ]={s 2 , s 5 , s 6 }, S 2 .BR[s 6 ]={s 2 , s 3 , s 4 , s 5 , s 6 }; 全局语句信息为  G 1 =G 2 ={}; 条件分支信息为  B 1 ={}, B 2 ={s 3 : <ctx is
                 None, {s 4 }>}.
                    例  6: 示例代码  7  中, 异常流信息为    E 1 .R=E 2 .R={}, E 1 .C={}, E 2 .C={s 7 : <{s 8 }, {s 7 , s 8 , s 9 , s 10 }>}, 其中  E 2 .C[s 7 ].
                 TryStmts={s 8 }, E 2 .C[s 7 ].AllStmts={s 7 , s 8 , s 9 , s 10 }; 全局语句信息为  G 1 ={s 1 , s 2 , s 3 , s 4 }, G 2 ={}.

                 示例代码   7. 全局语句移动产生的良性变化语句.
                 # 版本变更: flask2.1.0 → flask2.1.3
                 1    –   try:
                 2    –   import dotenv
                 3    –   except ImportError:
                 4    –   dotenv = None
                 5       def load_dotenv(path=None):
                 6    –   if dotenv is None:
                 7    +   try:
                 8    +     import dotenv
                 9    +   except ImportError:
                 10         return False

                 3.3   兼容性问题检测
                    兼容性问题检测包括检测与参数有关的兼容性问题、检测与异常有关的兼容性问题以及检测与返回值有关
                 的兼容性问题. 算法      1、算法  2、算法   3  分别检测与参数有关、与异常有关、与返回值有关的兼容性问题, 最终合
                 并后得到被检测                                        CI.

                 3.3.1    检测与参数有关的兼容性问题       (CI1–CI5)
                    检测与参数有关的兼容性问题如算法              1  所示, 其输入为语句匹配信息       M、参数信息     P、异常流信息     E  和切片
                 信息  S, 输出为兼容性问题产生原因集合           CI, 包括检测参数的增删      (CI1)、关键字参数的键增删        (CI2)、参数的重
                 命名  (CI3)、参数默认值的改变      (CI4) 以及参数的范围改变      (CI5).
   37   38   39   40   41   42   43   44   45   46   47