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:
1 parent
7f513b86aa
commit
2af230bdd1
1 file changed
+7
-9
+7
-9
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user