From a01e9280cca223265390175c4ac11407c8e3b011 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 13 Oct 2026 16:34:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(stub,phase1):=20=E5=9B=A0=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E6=95=B4=E6=95=B0=E6=8F=90=E5=8D=87=EF=BC=8C=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=20CDefine=20=E7=9A=84=E7=AA=84=E4=B9=98?= =?UTF-8?q?=E6=B3=95=E6=98=BE=E5=BC=8F=E5=8A=A0=E5=AE=BD=E4=B8=BA=20sizet?= =?UTF-8?q?=EF=BC=88=E4=BF=AE=E7=BC=93=E5=86=B2=E5=8C=BA=E5=B0=BA=E5=AF=B8?= =?UTF-8?q?=E5=9B=9E=E7=BB=95=E6=88=90=200/=E8=B4=9F=E5=80=BC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/lib/Phase/Phase1/Phase1Main.vp | 12 ++++---- App/lib/Phase/Phase1/Phase1Topo.vp | 6 ++-- App/lib/Stub/StubMerger/StubMergerStore.vp | 33 +++++++++++++--------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/App/lib/Phase/Phase1/Phase1Main.vp b/App/lib/Phase/Phase1/Phase1Main.vp index e297ba0..828968f 100644 --- a/App/lib/Phase/Phase1/Phase1Main.vp +++ b/App/lib/Phase/Phase1/Phase1Main.vp @@ -350,7 +350,7 @@ def RunPhase1(mb: memhub.MemBuddy*, includes_dir: str, temp_dir: str, log: VLogg p1_chkbase_addr: uint64 = uint64(mb.chk_base) VLogger.info(f"[EVIDENCE] mb={p1_mb_addr} base={p1_base_addr} usable={p1_usable_addr} " f"usable_size={mb.usable_size} max_order={mb.max_order} self_check={p1_sc} " f"detection={mb.detection}", "Phase1") VLogger.info(f"[EVIDENCE] chk_base={p1_chkbase_addr} chk_depth={mb.chk_depth} " f"chk_cap={mb.chk_cap} free_lists[clamp={p1_mo}]={p1_fl_head}", "Phase1") - p1_sz_cn: sizet = sizet(Phase1.MAX_CLASSES * Phase1.CLASS_NAME_LEN) + p1_sz_cn: sizet = sizet(Phase1.MAX_CLASSES) * Phase1.CLASS_NAME_LEN p1_sz_ds: sizet = sizet(Phase1.MAX_CLASSES * Phase1.SHA1_LEN) p1_sz_tp: sizet = sizet(4 * Phase1.MAX_FILE_DEPS) p1_sz_bx: sizet = sizet(4) @@ -363,8 +363,10 @@ def RunPhase1(mb: memhub.MemBuddy*, includes_dir: str, temp_dir: str, log: VLogg VLogger.info(f"[EVIDENCE] order(class_names {p1_sz_cn}B+16)={p1_o_cn} fl={p1_fl_cn} " f"order(def_sha1s {p1_sz_ds}B+16)={p1_o_ds} fl={p1_fl_ds} " f"order(topo {p1_sz_tp}B+16)={p1_o_tp} order(box {p1_sz_bx}B+16)={p1_o_bx} " f"(fl==0 only means that order is empty and can still be split by a higher order; if alloc fails while dump_stats shows free>0 that is the definitive proof of metadata corruption; " f"any order>max_order={mb.max_order} means an abnormal size)", "Phase1") # Pre-scan class inheritance and build the topo order (flat byte arrays avoid str-pointer NULL crashes) - class_names_buf: bytes = mb.alloc(Phase1.MAX_CLASSES * Phase1.CLASS_NAME_LEN) - parent_names_buf: bytes = mb.alloc(Phase1.MAX_CLASSES * Phase1.CLASS_NAME_LEN) + # 取消整数提升后,模块属性 CDefine 按最小位宽物化为 i16/i8;512*64=32768 恰好越出 i16 有符号上限而回绕成负值, + # 首乘数显式 sizet() 加宽到 64 位。下面 def_sha1s_buf 的 512*17=8704 未溢出,无需改。 + class_names_buf: bytes = mb.alloc(sizet(Phase1.MAX_CLASSES) * Phase1.CLASS_NAME_LEN) + parent_names_buf: bytes = mb.alloc(sizet(Phase1.MAX_CLASSES) * Phase1.CLASS_NAME_LEN) def_sha1s_buf: bytes = mb.alloc(Phase1.MAX_CLASSES * Phase1.SHA1_LEN) topo_order: t.CPtr = mb.alloc(4 * Phase1.MAX_FILE_DEPS) topo_count_box: t.CPtr = mb.alloc(4) @@ -380,8 +382,8 @@ def RunPhase1(mb: memhub.MemBuddy*, includes_dir: str, temp_dir: str, log: VLogg if parent_names_buf is None: VLogger.error("class-inheritance pre-scan flat buffer allocation failed: parent_names_buf is NULL; aborting compilation", "Phase1") if def_sha1s_buf is None: VLogger.error("class-inheritance pre-scan flat buffer allocation failed: def_sha1s_buf is NULL; aborting compilation", "Phase1") - string.memset(class_names_buf, 0, Phase1.MAX_CLASSES * Phase1.CLASS_NAME_LEN) - string.memset(parent_names_buf, 0, Phase1.MAX_CLASSES * Phase1.CLASS_NAME_LEN) + string.memset(class_names_buf, 0, sizet(Phase1.MAX_CLASSES) * Phase1.CLASS_NAME_LEN) + string.memset(parent_names_buf, 0, sizet(Phase1.MAX_CLASSES) * Phase1.CLASS_NAME_LEN) string.memset(def_sha1s_buf, 0, Phase1.MAX_CLASSES * Phase1.SHA1_LEN) if topo_order is not None: string.memset(topo_order, 0, 4 * Phase1.MAX_FILE_DEPS) if topo_count_box is not None: string.memset(topo_count_box, 0, 4) diff --git a/App/lib/Phase/Phase1/Phase1Topo.vp b/App/lib/Phase/Phase1/Phase1Topo.vp index 2a12ce2..0ae6962 100644 --- a/App/lib/Phase/Phase1/Phase1Topo.vp +++ b/App/lib/Phase/Phase1/Phase1Topo.vp @@ -41,7 +41,9 @@ def _TopoSortFiles(mb: memhub.MemBuddy*, result: IncludesScanner.ScanResult*, re # 1. Allocate flat arrays: file SHA1, dependency SHA1 list, dep counts, in-degrees, processed flags. # Flat arrays replace a FileDepEntry struct to avoid NULL str-pointer fields crashing. file_sha1s_buf: bytes = mb.alloc(Phase1.MAX_FILE_DEPS * Phase1.SHA1_LEN) - file_deps_buf: bytes = mb.alloc(Phase1.MAX_FILE_DEPS * Phase1.MAX_DEP_EDGES * Phase1.SHA1_LEN) + # 取消整数提升后,模块属性 CDefine(Phase1.MAX_*) 按最小位宽物化为 i16/i8;三段乘积 256*16*17=69632 会在 i16 回绕, + # 首乘数显式 sizet() 加宽到 64 位。上一行 256*17=4352 未超 i16,故无需改。 + file_deps_buf: bytes = mb.alloc(sizet(Phase1.MAX_FILE_DEPS) * Phase1.MAX_DEP_EDGES * Phase1.SHA1_LEN) file_dep_counts: t.CPtr = mb.alloc(Phase1.MAX_FILE_DEPS * 4) file_indegrees: t.CPtr = mb.alloc(Phase1.MAX_FILE_DEPS * 4) file_processed: t.CPtr = mb.alloc(Phase1.MAX_FILE_DEPS * 4) @@ -55,7 +57,7 @@ def _TopoSortFiles(mb: memhub.MemBuddy*, result: IncludesScanner.ScanResult*, re return -1 string.memset(file_sha1s_buf, 0, Phase1.MAX_FILE_DEPS * Phase1.SHA1_LEN) - string.memset(file_deps_buf, 0, Phase1.MAX_FILE_DEPS * Phase1.MAX_DEP_EDGES * Phase1.SHA1_LEN) + string.memset(file_deps_buf, 0, sizet(Phase1.MAX_FILE_DEPS) * Phase1.MAX_DEP_EDGES * Phase1.SHA1_LEN) string.memset(file_dep_counts, 0, Phase1.MAX_FILE_DEPS * 4) string.memset(file_indegrees, 0, Phase1.MAX_FILE_DEPS * 4) string.memset(file_processed, 0, Phase1.MAX_FILE_DEPS * 4) diff --git a/App/lib/Stub/StubMerger/StubMergerStore.vp b/App/lib/Stub/StubMerger/StubMergerStore.vp index 9bc8104..a3e837c 100644 --- a/App/lib/Stub/StubMerger/StubMergerStore.vp +++ b/App/lib/Stub/StubMerger/StubMergerStore.vp @@ -136,13 +136,15 @@ def PopulateSha1MapStore(scan_result: IncludesScanner.ScanResult*) -> int: if StubMerger._sha1_store_incdir is not None: stdlib.free(StubMerger._sha1_store_incdir) StubMerger._sha1_store_arr = stdlib.malloc(StubMerger.MAX_INCLUDES * 17) StubMerger._sha1_store_mod = stdlib.malloc(StubMerger.MAX_INCLUDES * 64) - StubMerger._sha1_store_rel = stdlib.malloc(StubMerger.MAX_INCLUDES * StubMerger.MAX_REL_PATH_LEN) - StubMerger._sha1_store_incdir = stdlib.malloc(StubMerger.MAX_INCLUDES * StubMerger.MAX_INC_DIR_LEN) + # 取消 C 整数提升后:MAX_INCLUDES/MAX_REL_PATH_LEN/MAX_INC_DIR_LEN 这些模块属性 CDefine 按最小位宽物化为 i16, + # 两侧都 i16 的乘积(1024*256 / 1024*512)会静默回绕成 0;显式 sizet() 把乘数加宽到 64 位,结果与旧「提升到 int」一致。 + StubMerger._sha1_store_rel = stdlib.malloc(sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_REL_PATH_LEN) + StubMerger._sha1_store_incdir = stdlib.malloc(sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_INC_DIR_LEN) if StubMerger._sha1_store_arr is None or StubMerger._sha1_store_mod is None or StubMerger._sha1_store_rel is None or StubMerger._sha1_store_incdir is None: return -1 string.memset(StubMerger._sha1_store_arr, 0, StubMerger.MAX_INCLUDES * 17) string.memset(StubMerger._sha1_store_mod, 0, StubMerger.MAX_INCLUDES * 64) - string.memset(StubMerger._sha1_store_rel, 0, StubMerger.MAX_INCLUDES * StubMerger.MAX_REL_PATH_LEN) - string.memset(StubMerger._sha1_store_incdir, 0, StubMerger.MAX_INCLUDES * StubMerger.MAX_INC_DIR_LEN) + string.memset(StubMerger._sha1_store_rel, 0, sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_REL_PATH_LEN) + string.memset(StubMerger._sha1_store_incdir, 0, sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_INC_DIR_LEN) StubMerger._sha1_store_count = 0 p_bad: int = 0 entry_size_p: sizet = IncludesScanner.FileEntry.__sizeof__() @@ -198,13 +200,14 @@ def AppendToSha1MapStore(sha1: str, rel_path: str) -> int: if StubMerger._sha1_store_arr is None: StubMerger._sha1_store_arr = stdlib.malloc(StubMerger.MAX_INCLUDES * 17) StubMerger._sha1_store_mod = stdlib.malloc(StubMerger.MAX_INCLUDES * 64) - StubMerger._sha1_store_rel = stdlib.malloc(StubMerger.MAX_INCLUDES * StubMerger.MAX_REL_PATH_LEN) - StubMerger._sha1_store_incdir = stdlib.malloc(StubMerger.MAX_INCLUDES * StubMerger.MAX_INC_DIR_LEN) + # sizet(): 取消整数提升后 i16(MAX_INCLUDES)*i16(长度) 会回绕,显式加宽到 64 位 + StubMerger._sha1_store_rel = stdlib.malloc(sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_REL_PATH_LEN) + StubMerger._sha1_store_incdir = stdlib.malloc(sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_INC_DIR_LEN) if StubMerger._sha1_store_arr is None or StubMerger._sha1_store_mod is None or StubMerger._sha1_store_rel is None or StubMerger._sha1_store_incdir is None: return 1 string.memset(StubMerger._sha1_store_arr, 0, StubMerger.MAX_INCLUDES * 17) string.memset(StubMerger._sha1_store_mod, 0, StubMerger.MAX_INCLUDES * 64) - string.memset(StubMerger._sha1_store_rel, 0, StubMerger.MAX_INCLUDES * StubMerger.MAX_REL_PATH_LEN) - string.memset(StubMerger._sha1_store_incdir, 0, StubMerger.MAX_INCLUDES * StubMerger.MAX_INC_DIR_LEN) + string.memset(StubMerger._sha1_store_rel, 0, sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_REL_PATH_LEN) + string.memset(StubMerger._sha1_store_incdir, 0, sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_INC_DIR_LEN) StubMerger._sha1_store_count = 0 if StubMerger._sha1_store_count >= StubMerger.MAX_INCLUDES: return 1 # module name: rel_path "lib/core/StubMerger.vp" -> "lib.core.StubMerger" @@ -255,13 +258,14 @@ def AddIncludeToSha1MapStore(sha1: str, rel_path: str, inc_dir: str, mod_name: s if StubMerger._sha1_store_arr is None: StubMerger._sha1_store_arr = stdlib.malloc(StubMerger.MAX_INCLUDES * 17) StubMerger._sha1_store_mod = stdlib.malloc(StubMerger.MAX_INCLUDES * 64) - StubMerger._sha1_store_rel = stdlib.malloc(StubMerger.MAX_INCLUDES * StubMerger.MAX_REL_PATH_LEN) - StubMerger._sha1_store_incdir = stdlib.malloc(StubMerger.MAX_INCLUDES * StubMerger.MAX_INC_DIR_LEN) + # sizet(): 取消整数提升后 i16(MAX_INCLUDES)*i16(长度) 会回绕,显式加宽到 64 位 + StubMerger._sha1_store_rel = stdlib.malloc(sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_REL_PATH_LEN) + StubMerger._sha1_store_incdir = stdlib.malloc(sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_INC_DIR_LEN) if StubMerger._sha1_store_arr is None or StubMerger._sha1_store_mod is None or StubMerger._sha1_store_rel is None or StubMerger._sha1_store_incdir is None: return 1 string.memset(StubMerger._sha1_store_arr, 0, StubMerger.MAX_INCLUDES * 17) string.memset(StubMerger._sha1_store_mod, 0, StubMerger.MAX_INCLUDES * 64) - string.memset(StubMerger._sha1_store_rel, 0, StubMerger.MAX_INCLUDES * StubMerger.MAX_REL_PATH_LEN) - string.memset(StubMerger._sha1_store_incdir, 0, StubMerger.MAX_INCLUDES * StubMerger.MAX_INC_DIR_LEN) + string.memset(StubMerger._sha1_store_rel, 0, sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_REL_PATH_LEN) + string.memset(StubMerger._sha1_store_incdir, 0, sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_INC_DIR_LEN) StubMerger._sha1_store_count = 0 if StubMerger._sha1_store_count >= StubMerger.MAX_INCLUDES: return 1 # dedup when both SHA1 and module name match (aligned with AppendToSha1MapStore) @@ -484,10 +488,11 @@ def PopulateIncludesDeps(sha1: str, deps_str: str) -> int: # lazy init if StubMerger._includes_deps_sha1 is None: StubMerger._includes_deps_sha1 = stdlib.malloc(StubMerger.MAX_INCLUDES * 17) - StubMerger._includes_deps_str = stdlib.malloc(StubMerger.MAX_INCLUDES * StubMerger.MAX_DEPS_STR_LEN) + # sizet(): 取消整数提升后 i16(MAX_INCLUDES)*i16(MAX_DEPS_STR_LEN) 会回绕成 0,显式加宽到 64 位 + StubMerger._includes_deps_str = stdlib.malloc(sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_DEPS_STR_LEN) if StubMerger._includes_deps_sha1 is None or StubMerger._includes_deps_str is None: return 1 string.memset(StubMerger._includes_deps_sha1, 0, StubMerger.MAX_INCLUDES * 17) - string.memset(StubMerger._includes_deps_str, 0, StubMerger.MAX_INCLUDES * StubMerger.MAX_DEPS_STR_LEN) + string.memset(StubMerger._includes_deps_str, 0, sizet(StubMerger.MAX_INCLUDES) * StubMerger.MAX_DEPS_STR_LEN) StubMerger._includes_deps_count = 0 if StubMerger._includes_deps_count >= StubMerger.MAX_INCLUDES: return 1 # dedup: skip if SHA1 already present