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).