From 9d0ecf1c5dd6b2729b98ea94d860e6dd1fb99876 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 13 Aug 2026 06:54:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(call):=20translate=5Fcall=20=E6=97=A0?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E6=9F=A5=E8=AF=A2=E5=85=A8=E5=B1=80=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=8F=82=E6=95=B0=E8=A1=A8=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=9C=AA=E5=88=9D=E5=A7=8B=E5=8C=96=20gd=5Fentry=20=E5=B4=A9?= =?UTF-8?q?=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同模块带默认参数函数命中时 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 回退兜底。 --- App/lib/core/Gen/CallGenMixin.vp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/App/lib/core/Gen/CallGenMixin.vp b/App/lib/core/Gen/CallGenMixin.vp index 264208b..98623a2 100644 --- a/App/lib/core/Gen/CallGenMixin.vp +++ b/App/lib/core/Gen/CallGenMixin.vp @@ -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