From 2af230bdd1f990e3827e2186dbd642246117bd73 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 1 Oct 2026 18:29:53 +0800 Subject: [PATCH] =?UTF-8?q?fix(argparse):=20argv=20=E5=8F=96=E5=80=BC?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E7=9B=B4=E6=8E=A5=E4=B8=8B=E6=A0=87=20argv[i?= =?UTF-8?q?dx]=EF=BC=8C=E9=81=BF=E5=BC=80=20TPC=20=E8=B5=8B=E5=80=BC?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=AF=B9=20i8**=20=E5=8F=B3=E5=80=BC?= =?UTF-8?q?=E7=9A=84=E8=87=AA=E5=8A=A8=E8=A7=A3=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原写法 `entry = str*(uint64(argv) + idx * 8)` 的右值是 i8**,TPC 的 HandlesAssign 赋值路径 会对"指针的指针"右值再 load 一次 → entry 变成 argv[idx] 本身,entry[0] 又去读字符串头 8 字节 → 野指针(ASan: access-violation 0xffffffffffffffff @ ArgumentParser.parse_args)。 改为 argv[idx] 后右值是 i8*(1 级),不触发该路径;顺带去掉了 uint64 往返。 --- argparse.vp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/argparse.vp b/argparse.vp index dae1f40..8820b06 100644 --- a/argparse.vp +++ b/argparse.vp @@ -291,11 +291,12 @@ class ArgumentParser: found: int = 0 arg: Argument | t.CPtr = None value: str = None - entry: str | t.CPtr = None + # argv 是 char**(`str | t.CPtr`),argv[idx] 直接给出该位置的 char*。 + # 不要写成 `str*(uint64(argv) + idx*8)`:那样右值是 i8**,TPC 的赋值路径 + # 会对"指针的指针"右值再解引用一次(多 load 一层)→ 取到野指针。 while idx < argc: - entry = str*(t.CUInt64T(argv) + idx * 8) - token = entry[0] + token = argv[idx] if token is None: break @@ -303,8 +304,7 @@ class ArgumentParser: if token[0] == '-' and token[1] == '-' and token[2] == 0: idx += 1 while idx < argc: - entry = str*(t.CUInt64T(argv) + idx * 8) - token = entry[0] + token = argv[idx] found = self._find_positional(pos_idx) if found < 0: stdio.printf("error: unexpected argument '%s'\n", token) @@ -351,8 +351,7 @@ class ArgumentParser: stdio.printf("error: %s requires a value\n", arg.name) release(args) return None - entry = str*(t.CUInt64T(argv) + (idx + 1) * 8) - value = entry[0] + value = argv[idx + 1] self._store_value(args, arg, value) idx += 2 else: @@ -372,8 +371,7 @@ class ArgumentParser: stdio.printf("error: %s requires a value\n", arg.name) release(args) return None - entry = str*(t.CUInt64T(argv) + (idx + 1) * 8) - value = entry[0] + value = argv[idx + 1] self._store_value(args, arg, value) idx += 2 else: