2.1 KiB
2.1 KiB
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 <type>,目标类型打印为垃圾t) - 第 2 次:L33697
store %"43ebf8d8c9837267.Function"* %98, %"43ebf8d(类型名截断 + 文件尾)
- 第 1 次:L33698
- 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.vpL4187-4189 - 生成崩溃 IR 的代码:
TransPyV/App/lib/core/Gen/ExprGenMixin.vpL1993(None 检查指针对齐 bitcast) - 联合类型变量声明:
TransPyV/App/lib/core/Handles/HandlesAnnAssign.vpL633-677(translate_value + coerce_to_type + precise_rhs_ty 重建 alloca) - IR 指令生成:
includes/llvmlite/__builder.vpbuild_store/build_bitcast/_type_str - 类型打印:
includes/llvmlite/__types.vpTypePrint
假设(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 写盘前缓冲大小