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
|
found: int = 0
|
||||||
arg: Argument | t.CPtr = None
|
arg: Argument | t.CPtr = None
|
||||||
value: str = 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:
|
while idx < argc:
|
||||||
entry = str*(t.CUInt64T(argv) + idx * 8)
|
token = argv[idx]
|
||||||
token = entry[0]
|
|
||||||
if token is None:
|
if token is None:
|
||||||
break
|
break
|
||||||
|
|
||||||
@@ -303,8 +304,7 @@ class ArgumentParser:
|
|||||||
if token[0] == '-' and token[1] == '-' and token[2] == 0:
|
if token[0] == '-' and token[1] == '-' and token[2] == 0:
|
||||||
idx += 1
|
idx += 1
|
||||||
while idx < argc:
|
while idx < argc:
|
||||||
entry = str*(t.CUInt64T(argv) + idx * 8)
|
token = argv[idx]
|
||||||
token = entry[0]
|
|
||||||
found = self._find_positional(pos_idx)
|
found = self._find_positional(pos_idx)
|
||||||
if found < 0:
|
if found < 0:
|
||||||
stdio.printf("error: unexpected argument '%s'\n", token)
|
stdio.printf("error: unexpected argument '%s'\n", token)
|
||||||
@@ -351,8 +351,7 @@ class ArgumentParser:
|
|||||||
stdio.printf("error: %s requires a value\n", arg.name)
|
stdio.printf("error: %s requires a value\n", arg.name)
|
||||||
release(args)
|
release(args)
|
||||||
return None
|
return None
|
||||||
entry = str*(t.CUInt64T(argv) + (idx + 1) * 8)
|
value = argv[idx + 1]
|
||||||
value = entry[0]
|
|
||||||
self._store_value(args, arg, value)
|
self._store_value(args, arg, value)
|
||||||
idx += 2
|
idx += 2
|
||||||
else:
|
else:
|
||||||
@@ -372,8 +371,7 @@ class ArgumentParser:
|
|||||||
stdio.printf("error: %s requires a value\n", arg.name)
|
stdio.printf("error: %s requires a value\n", arg.name)
|
||||||
release(args)
|
release(args)
|
||||||
return None
|
return None
|
||||||
entry = str*(t.CUInt64T(argv) + (idx + 1) * 8)
|
value = argv[idx + 1]
|
||||||
value = entry[0]
|
|
||||||
self._store_value(args, arg, value)
|
self._store_value(args, arg, value)
|
||||||
idx += 2
|
idx += 2
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in new issue
Block a user