fix(diag): 泄漏点采集改为"确认报错后才跑",并保存/恢复扫描期状态
原先在调用点的位循环里就调 escape_leak_line:该函数会重扫被调者函数体并改 EscConstEnv/EscIndCount, 而循环里可能紧接着发现"该实参其实不是帧生命期"从而不报错 —— 等于白白跑一遍扫描、还留下脏状态。 现在改成把 (被调者, 形参位) 传给检查方,过了 LIFE_FRAME 判定才采集;escape_leak_line 内部 把 EscConstEnv/EscIndCount/EscLeakWant 先存后还。
This commit is contained in:
1 parent
2353dca8ec
commit
8881dea2e2
4 files changed
+24
-13
No files matched your search
@@ -196,9 +196,8 @@ novirtual class CallGenMixin(CallGenBase.CallGenBase):
|
||||
_dummy_ptr: mlirlite.LLVMType* = mlirlite.Ptr(pool, mlirlite.Int8(pool))
|
||||
for ai in range(can):
|
||||
if ((esc_mask >> int(ai)) & 1) != 0:
|
||||
# 泄漏点(**仅同模块**:EscFuncTable 按文件重置,跨模块返回 0 → 不打该帧)
|
||||
leak_ln: int = GenApi.escape_leak_line(func_name, int(ai))
|
||||
GenApi.fail_if_stack_addr_escape(cargs.get(ai), "an escaping callee parameter", trans, _dummy_ptr, leak_ln)
|
||||
# 泄漏点:把"被调者 + 形参位"交给检查方,确认真要报错后才去采集(同模块才有行号)
|
||||
GenApi.fail_if_stack_addr_escape(cargs.get(ai), "an escaping callee parameter", trans, _dummy_ptr, func_name, int(ai))
|
||||
# P2 willFree:查被调者的形参失效标注(本文件表 → 跨模块 .vpi 回退)。
|
||||
# 标记动作在**实参全部翻译完成之后**(见下方 "# Default-argument filling" 之前),
|
||||
# 否则 `stdlib.free(p)` 自己那次读取 p 会被误判为"使用已失效变量"。
|
||||
|
||||
Reference in new issue
Block a user