fix(argparse): argv 取值改用直接下标 argv[idx],避开 TPC 赋值路径对 i8** 右值的自动解引用

原写法 `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 往返。
This commit is contained in:
TermiNexus committed 2026-10-01 18:29:53 +08:00
1 parent 7f513b86aa
commit 2af230bdd1
1 file changed
+7 -9
+7 -9
View File
@@ -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: