import t, c from stdint import * import memhub import stdio import stdlib # ============================================================ # 最小复现:memhub.alloc 返回的指针与块头的位置关系是否正确。 # # 期望:alloc 返回 block + 8(块头在 p-8),块头 = (order<<1)|1(奇数); # free(p) 后该块回到空闲链(free_count 增 1)。 # 若 p-8 处是 0、而 p 处是奇数 → alloc 返回了 block 本身(+8 没生效), # 调用方的 memset 会正好把块头清 0(并越过 8 字节踩邻居块头)。 # ============================================================ def main() -> int: sz: sizet = 1048576 arena: t.CPtr = stdlib.malloc(sz) if arena == None: stdio.printf("FAIL: arena malloc 失败\n") return 1 mb: memhub.MemBuddy* = memhub.MemBuddy(arena, sz) if mb == None: stdio.printf("FAIL: MemBuddy 构造失败\n") return 1 p: t.CPtr = mb.alloc(64) if p == None: stdio.printf("FAIL: alloc 失败\n") return 1 w_m8: uint64* = (uint64*)(t.CPtr(uint64(p) - 8)) w_0: uint64* = (uint64*)(p) hdr_m8: uint64 = w_m8[0] hdr_0: uint64 = w_0[0] c0: sizet = mb.free_count() rc: int = mb.free(p) c1: sizet = mb.free_count() stdio.printf("p-8=0x%llX p=0x%llX free_before=%zu free_after=%zu free_rc=%d\n", hdr_m8, hdr_0, c0, c1, rc) if (hdr_m8 & 1) == 0: stdio.printf("FAIL: p-8 不是奇数块头(0x%llX)——alloc 返回的不是 block+8\n", hdr_m8) return 1 if c1 != c0 + 1: stdio.printf("FAIL: free 未把块放回空闲链(%zu -> %zu)——块头被破坏/被拒\n", c0, c1) return 1 stdio.printf("OK: p-8 是奇数块头,free 正常回收\n") return 0