fix(withcontent): _find_provider 倒序循环上界显式转有符号,避免被无符号化后退化
range(stack.top - 1, -1, -1) 中 stack.top 是 UINT64 字段,上界被推断为无符号时该递减循环的谓词退化为 ugt(-1 在无符号域即 UINT32_MAX) => 条件恒假、循环体不可达、_find_provider 恒返回 NULL,with 的 __mbuddy__ 注入失效(_str.upper 对 NULL 取 vtable 崩溃) 显式 t.CInt 转换使符号域与递减语义一致,与编译器侧 stop 为负字面量时退回有符号谓词的修复互为双保险
This commit is contained in:
1 parent
0c85e30739
commit
a9a53bd117
1 file changed
+6
-1
+6
-1
@@ -66,7 +66,12 @@ def _find_provider(field_name: str) -> t.CPtr:
|
||||
"""Search for matching field_name starting from stack top.
|
||||
Return associated pointer, or NULL if no match found."""
|
||||
stack: _ProviderStack | t.CPtr = _get_stack()
|
||||
for i in range(stack.top - 1, -1, -1):
|
||||
# 上界显式转 t.CInt(有符号):本循环是「递减 + stop 为 -1」形态,若上界
|
||||
# 被当作无符号(stack.top 是 UINT64 字段),比较谓词会退化为 ugt,而 -1 在
|
||||
# 无符号域是 UINT32_MAX ⇒ 条件恒假、循环体不可达、本函数恒返回 NULL(with 的
|
||||
# __mbuddy__ 注入全部失效,_str.upper 对 NULL 取 vtable 崩溃)。显式转换让
|
||||
# 符号域与递减语义一致,与编译器侧「stop 为负字面量时退回有符号谓词」互为双保险。
|
||||
for i in range(t.CInt(stack.top) - 1, -1, -1):
|
||||
# 字段名用 strcmp 内容比较:编译器对每次 create_global_string 生成
|
||||
# 独立的字符串常量(TPV 不去重),push/find 的指针地址不同,
|
||||
# 指针 == 永假会导致 provider 匹配失败(__mbuddy__ 注入不上)。
|
||||
|
||||
Reference in new issue
Block a user