fix(call): translate_call 无条件查询全局默认参数表,修复未初始化 gd_entry 崩溃

同模块带默认参数函数命中时 gd_entry 仅在 if df_defaults is None 块内
赋值,下方 _build_const_from_snapshot 读到未初始化栈垃圾指针(本次
0x7ead438f),解引用 gd_entry.ConstKinds 触发 ASan access-violation
(翻译 parser.vp 时随机崩溃)。改为与 _translate_method_call 一致,
find_func_defaults 无条件执行,同模块命中时快照优先、AST 回退兜底。
This commit is contained in:
TermiNexus committed 2026-08-13 06:54:32 +08:00
1 parent f19c63594a
commit 9d0ecf1c5d
1 file changed
+10 -7
+10 -7
View File
@@ -6333,13 +6333,16 @@ class CallGenMixin:
df_defaults = df_entry.Defaults
df_default_count = df_entry.DefaultCount
df_param_count = df_entry.ParamCount
# 如果当前模块没有,从全局默认参数表查找(跨模块)
if df_defaults is None:
gd_entry: FuncDefaultsEntry | t.CPtr = HandlesExprCall.find_func_defaults(func_name)
if gd_entry is not None:
df_defaults = gd_entry.Defaults
df_default_count = gd_entry.DefaultCount
df_param_count = gd_entry.ParamCount
# 无条件查询全局默认参数表(跨模块/同模块都要用 stdlib 常量快照
# 重建默认值:模块表 Defaults 指向 pool 内 AST,跨 1b reset 后悬空;
# 快照才是跨文件永久存活。同模块命中时 gd_entry 也必须已赋值,
# 否则下方 _build_const_from_snapshot 读到未初始化栈垃圾指针崩溃。
# 与 _translate_method_call 的 mdf_gd 无条件查询(L2677)保持一致。
gd_entry: FuncDefaultsEntry | t.CPtr = HandlesExprCall.find_func_defaults(func_name)
if df_defaults is None and gd_entry is not None:
df_defaults = gd_entry.Defaults
df_default_count = gd_entry.DefaultCount
df_param_count = gd_entry.ParamCount
# 填充缺失参数
if df_defaults is not None and df_default_count > 0 and can < df_param_count:
df_offset: int = df_param_count - df_default_count