# Debug Session: llvmtype-overwrite-crash 状态: [OPEN] ## 症状 - 编译 TransPyV(Projectrans.py)时,CallGenMixin.vp 的 `.ll`(7dcdb461407a420d.ll)在 `_inject_requires_fields` 的 `cur_func` 处理区域**确定性截断**: - 第 1 次:L33698 `%100 = bitcast i8* null t`(缺 `to `,目标类型打印为垃圾 `t`) - 第 2 次:L33697 `store %"43ebf8d8c9837267.Function"* %98, %"43ebf8d`(类型名截断 + 文件尾) - llc 报:`expected 'to' after cast value` / `end of file in global variable name` - 两次崩溃位置相同(`cur_func: llvmlite.Function | t.CPtr = trans._cur_func` 声明 + `if cur_func is None: return 0` 检查区域),现象略变 → 内存破坏 ## 关键源码 - 触发源码:`TransPyV/App/lib/core/Gen/CallGenMixin.vp` L4187-4189 - 生成崩溃 IR 的代码:`TransPyV/App/lib/core/Gen/ExprGenMixin.vp` L1993(None 检查指针对齐 bitcast) - 联合类型变量声明:`TransPyV/App/lib/core/Handles/HandlesAnnAssign.vp` L633-677(translate_value + coerce_to_type + precise_rhs_ty 重建 alloca) - IR 指令生成:`includes/llvmlite/__builder.vp` build_store/build_bitcast/_type_str - 类型打印:`includes/llvmlite/__types.vp` TypePrint ## 假设(3-5 个,可证伪) - H1: 联合类型 coerce(%97/%98 冗余同类型 bitcast)生成路径越界写,破坏后续类型对象/行缓冲 - H2: HandlesAnnAssign 的 precise_rhs_ty alloca 重建逻辑(L658-668)写越界(新建 alloca 或符号表更新破坏内存) - H3: _type_str 的 alloc(512) 与 TypePrint 内部 alloc(256)(Ptr(Struct) 快速路径 sn_cp)在 MemBuddy buddy 碎片下重叠 - H4: 跨遍 reset_to 回收了函数翻译中创建的 LLVMType 类型对象(perm_pool 同类问题,类型对象未持久化) - H5: 后续指令生成(icmp/br 或 dump_ir 写盘)在 cur_func 检查后崩溃(非 bitcast 本身) ## 插桩计划(第一处改动必须是插桩) - 待用户确认配合运行编译后实施 - 观察点:build_bitcast/build_store 前打印 ty 地址 + TypePrint 结果;HandlesAnnAssign coerce 前后;dump_ir 写盘前缓冲大小