diff --git a/App/lib/core/Gen/ClassGenEnum.vp b/App/lib/core/Gen/ClassGenEnum.vp index 12ee859..8b27243 100644 --- a/App/lib/core/Gen/ClassGenEnum.vp +++ b/App/lib/core/Gen/ClassGenEnum.vp @@ -878,6 +878,31 @@ class ClassGenEnum(ClassGenBase.ClassGenBase): string.memset(self.RenumVariantTags, 0, 8 * RENUM_CLASS_MAX * RENUM_VARIANT_PER_CLASS) self.RenumClassCount = 0 + # ============ 临时诊断(0xb0 崩溃定位,定位后移除) ============ + # lazy init 后 RenumClassNames 必非空;此时若 RCV 异常(null/小值) + # 说明字段被越界覆盖或 __init__ 未生效,fail-fast 暴露崩溃现场。 + fb_diag: str = VLogger.fmt_buf() + if fb_diag is not None: + viperlib.snprintf(fb_diag, 1024, + "[RENUM-DIAG] self=%llu RN=%llu RCV=%llu RVN=%llu RVT=%llu RCount=%d class=%s", + t.CUInt64T(self), t.CUInt64T(self.RenumClassNames), + t.CUInt64T(self.RenumClassVariantCounts), + t.CUInt64T(self.RenumVariantNames), + t.CUInt64T(self.RenumVariantTags), + self.RenumClassCount, class_name) + VLogger.info(fb_diag, "RENUM") + rcv_chk: t.CUInt64T = t.CUInt64T(self.RenumClassVariantCounts) + if rcv_chk == 0 or rcv_chk < 4096: + fb_fail: str = VLogger.fmt_buf() + if fb_fail is not None: + viperlib.snprintf(fb_fail, 1024, + "[RENUM-FAIL] RCV=%llu 异常(lazy init 后应为 perm_pool 地址),RenumClassCount=%d class=%s", + t.CUInt64T(self.RenumClassVariantCounts), + self.RenumClassCount, class_name) + VLogger.error(fb_fail, "RENUM") + stdlib.exit(1) + # ============ 临时诊断结束 ============ + # 检查是否已注册(避免重复注册) for i in range(self.RenumClassCount): existing: str = self.RenumClassNames[i] diff --git a/App/main.vp b/App/main.vp index fdf8e47..bb5153e 100644 --- a/App/main.vp +++ b/App/main.vp @@ -258,7 +258,7 @@ Target: %s # includes 缓存用独立目录 .binary_asan 隔离 asan 插桩 obj,避免与非 asan obj 混链 # (asan obj 引用 __asan_init 等符号,非 asan 链接不提供 asan 库 → undefined reference) if args.get_bool("asan"): - BuildPipeline.set_asan_mode(1) + BuildPipeline._asan_mode = True Config.set_inc_bin_suffix(".binary_asan") if log is not None: log.info("ASan 模式已启用(opt -passes=asan + libclang_rt)", "asan") @@ -272,7 +272,7 @@ Target: %s viperlib.snprintf(fb_asan, 1024, "ASan 模式清理 includes 缓存: %d 个文件(将重建 asan obj)", n_asan) log.info(fb_asan, "asan") else: - BuildPipeline.set_asan_mode(0) + BuildPipeline._asan_mode = False Config.set_inc_bin_suffix(".binary") # --nowarn-register:抑制"外部函数返回类型未登记"类 WARN 输出