Files
TransPyC/TODO.md
T
TermiNexus 485ab0d329 docs(todo): 记录 list[ptr].append 运行期读零页崩溃待查
编译问题已解(2f0d52e 系列),但 list[ptr].append 运行期崩溃(读零页
0xf8/0x128/0x148)未根修:构造插桩确认 pool 有效 elem=8,差异在
item:t.CPtr 参数/lem_ptr[0]=item store 生成。当前 BuildPipeline 用
list[str] 绕开(TPV dc5bb21)。
2026-08-19 23:35:12 +08:00

4.5 KiB
Raw Blame History

TODO

BUG:list[对象类型] 元素 store/load 不一致(llc 并行误报失败根因)

状态:已根修(TPC _HandleSizeofLlvm 联合类型 sizeof),句柄数组保留(0810f9f)

现象

  • TPV 编译器(tpv.exe)Phase B run_llc_parallel 并行跑 llc 时,list[vthreading.Thread] 存线程对象
  • join(0) 正常等待,join(1) 立即返回 alive=0,失败槽 Result=-1 误报(ClassArrayTest 反复失败)

根因(插桩 [LLC-DBG2] 证实)

  1. list[对象] 的 elem_size=0(真正根因,2026-08-19 定位):
    • _list.vp.__init__ 的 T.__sizeof__() 在特化后 T 被还原为 X | t.CPtr(BinOp 联合)
    • TPC _HandleSizeofLlvm(HandlesExprCall.py)对 BinOp 节点落到 else 返回 0 → __elem_size__=0
    • 后果:append 每次都写 data + count*0 = data[0](同槽覆盖),get(0)==get(1) 同一槽 → 线程句柄错乱
    • 修复:_HandleSizeofLlvm 对含 t.CPtr 的联合类型返回 8(指针大小)
  2. 叠加效应:j=0 的 close() 把对象 handle 置 NULL → j=1 的 join 用 NULL 句柄 → WAIT_FAILED

相关提交链

42aa90c(c.Deref 增强) → 4bd254a(槽间距) → 3f3e3d5(STARTUPINFOA 清零) → 645e8e0(指针元素) → 88778dc(定位插桩) → 0810f9f(句柄数组绕开)


BUG:list[t.CPtr] 特化 "Undefined method 'append'"

状态:已根修(TPC),待验证

现象

  • TPC 编译 handles: list[t.CPtr] = list[t.CPtr](_mbuddy) → Exception: Undefined method 'append' in class 'list[CPtr]' (no function declaration found for 'list[CPtr].append')

根因(TPC 泛型特化名/模板替换不一致)

  1. _resolve_generic_slice_type 对 t.CPtr 返回 raw_name='CPtr'(裸名)→ _specialize_generic_class 的 type_map['T']='CPtr' → 模板 item: T 替换为 item: CPtr → CPtr 不在顶层作用域 → append 方法声明注册失败
  2. mangled 名不一致:特化端 spec_name=list[ptr](type_arg 规范化 'ptr'),查找端(FindStructNameInAnnotation)/声明端(DeclarationGenerator)生成 list[CPtr] / list[i8*] → 找不到

修复(TPC,2026-08-19)

  • HandlesExprCall._resolve_generic_slice_type:t.CPtr 的 raw_name 保留带前缀 't.CPtr'(可解析),去掉 'CPtr' 裸名特殊处理
  • HandlesClassDef._specialize_generic_class:cptr_params/class_type_names 判定改 tn_bare('t.CPtr'→'CPtr' 内建,不当类类型)
  • SymbolUtils.FindStructNameInAnnotation:CPtr/t.CPtr → 'ptr'(查找端类名与特化端统一)
  • DeclarationGenerator:CPtr → 'ptr'(声明端 mangled 统一,避免 list[i8*] vs list[ptr])

待办

  • 重建 TPV 验证:TPC 编译 BuildPipeline.vp 通过(编译问题已解)
  • list[ptr].append 运行崩溃(见下节)
  • TPV 侧(tpv.exe 编译其他项目)同类逻辑:ClassGenGeneric._mangle_generic_class_name / TypeGenResolve 的 slice 解析对 t.CPtr 的规范化(需 TPC 重建后排查,若 tpv.exe 编译含 list[t.CPtr] 的项目报同样错需对称修复)

BUG:list[ptr].append 运行期读零页崩溃(编译已过)

状态:未根修,当前 BuildPipeline 用 list[str] 绕开(TPV dc5bb21)

现象

  • TPC 2f0d52e/6ff76f3/c02f7db 后编译通过,但 tpv.exe 运行期崩溃:
    • ASAN: access-violation on 0x0000000000f8/0x128/0x148(地址随构建变化,读零页)
    • 栈:list[ptr].append ← run_llc_parallel ← RunMultiFileProject
  • 插桩 [LLC-DBG2] 确认 list[ptr] 构造完全正常: handles=… pool=ede31ff990 count=0 cap=8 elem=8 data=…(pool 有效、elem_size=8 已生效)

分析

  • elem_size 修复已生效(崩溃地址从 0xf8 变 0x128/0x148),构造正常 → 崩溃在 append 方法体
  • list[str] 全库验证稳定、list[ptr] 崩溃 → 差异在 item: t.CPtr 参数类型 与 elem_ptr[0] = item 的 store 生成(TPC 特化 list[ptr] 时)
  • 疑似:TPC 对 t.CPtr(无联合)作为泛型方法参数的类型解析 / elem_ptr[0] 的 store 宽度与类型不匹配

排查方向(TBD)

  • 看 list[ptr].append 生成的 .ll / 反汇编 append 指令
  • 对比 list[str].append 与 list[ptr].append 的 IR(store 宽度、参数类型)
  • TPC 侧 _HandleSubscriptStoreLlvm 对 elem_ptr[0] = item(item 为 t.CPtr)的分支

相关提交

2f0d52e(特化根修) → 6ff76f3(CPtr sizeof) → c02f7db(NameError) → 0d2e912(定位插桩) → dc5bb21(list[str] 绕开)