From 71730d920c8a2c9d6e4ad04e8897ef6948ac1a5c Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 9 Oct 2026 21:59:48 +0800 Subject: [PATCH] =?UTF-8?q?chore(dbg):=20=E5=88=A0=E9=99=A4=20NLL=20?= =?UTF-8?q?=E4=B8=B4=E6=97=B6=E8=AF=8A=E6=96=AD=EF=BC=88=C2=A713=20?= =?UTF-8?q?=E5=B7=B2=E5=9C=A8=20EscapeTest=20=E4=B8=8A=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E9=80=9A=E8=BF=87=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实测:var=h confined=1,g(l,h) 不再报错;报错前移到真正的泄漏点 `if 1==0 or a == 1: return l`(where=a return value)。 --- App/lib/core/Gen/Call/CallGenCtor.vp | 8 +------- App/lib/core/Gen/StructGenMixin.vp | 14 ++------------ 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/App/lib/core/Gen/Call/CallGenCtor.vp b/App/lib/core/Gen/Call/CallGenCtor.vp index 9bf774f..5be0152 100644 --- a/App/lib/core/Gen/Call/CallGenCtor.vp +++ b/App/lib/core/Gen/Call/CallGenCtor.vp @@ -327,15 +327,9 @@ novirtual class CallGenCtor(CallGenBase.CallGenBase): if rhs is None or rhs.kind() != ast.ASTKind.New: return 0 nn: ast.New* = ast.New*(rhs) if nn is None: return 0 - # 【临时诊断:定位 §13 NLL 为何不生效,定位后删除】 - curf: int = 0 - if self.Gen.StructGen.NllCurFunc is not None: curf = 1 - VLogger.info(f"[NLL-DBG] var={var_name} src={nn.Source} life={nn.Life} curfunc={curf}", "NLL") if nn.Source != ast.NEW_SRC_HEAP and nn.Source != ast.NEW_SRC_DEFAULT: return 0 if nn.Life != ast.NEW_LIFE_DEFAULT: return 0 - conf: int = self.Gen.StructGen.NllFrameConfined(trans, var_name, rhs) - VLogger.info(f"[NLL-DBG] var={var_name} confined={conf}", "NLL") - return conf + return self.Gen.StructGen.NllFrameConfined(trans, var_name, rhs) def _new_is_owned_heap(self, new_node: ast.New*) -> int: """1=`new` 生成编译器独占释放的堆绑定 / 0=不是""" diff --git a/App/lib/core/Gen/StructGenMixin.vp b/App/lib/core/Gen/StructGenMixin.vp index 48076f0..b50eac6 100644 --- a/App/lib/core/Gen/StructGenMixin.vp +++ b/App/lib/core/Gen/StructGenMixin.vp @@ -781,8 +781,6 @@ novirtual class StructGenMixin: return self._NllListMentions(ast.Tuple*(node).elts, al) ch: list[ast.AST*]* = node.children if ch is not None: return self._NllListMentions(ch, al) - # 【临时诊断】认不出的种类被判"提及" - VLogger.info(f"[NLL-MENTION] unknown kind={k} line={node.lineno}", "NLL") return 1 # 认不出的种类:保守算"提及" def _NllAliasSource(self, value: ast.AST*, al: sizet*) -> int: @@ -845,12 +843,8 @@ novirtual class StructGenMixin: if a is None or a.kind() != ast.ASTKind.Name: continue an: ast.Name* = ast.Name*(a) if an.id is None or self._NllInSet(al, an.id) == 0: continue - if mask < 0: - VLogger.info(f"[NLL-UNSAFE] arg-mask-unknown line={node.lineno}", "NLL") - return 1 - if ((mask >> idx) & 1) != 0: - VLogger.info(f"[NLL-UNSAFE] arg-escapes bit={idx} line={node.lineno}", "NLL") - return 1 + if mask < 0: return 1 + if ((mask >> idx) & 1) != 0: return 1 return 0 if k == ast.ASTKind.New: # 构造实参里的调用同样要按不安全位置检查 @@ -872,8 +866,6 @@ novirtual class StructGenMixin: return self._NllExprUnsafe(ie.orelse, al) ch: list[ast.AST*]* = node.children if ch is not None: return self._NllListUnsafe(ch, al) - # 【临时诊断】认不出的表达式种类 - VLogger.info(f"[NLL-UNSAFE] unknown-expr kind={k} line={node.lineno}", "NLL") return 1 # 认不出的表达式种类:保守按"不安全"处理 def _NllStmts(self, stmts: list[ast.AST*]*, al: sizet*, def_node: ast.AST*, depth: int) -> int: @@ -889,8 +881,6 @@ novirtual class StructGenMixin: i += 1 if st is None: continue k: int = st.kind() - # 【临时诊断:定位 NLL 拒绝点,定位后删除】 - VLogger.info(f"[NLL-ST] line={st.lineno} kind={k}", "NLL") if k == ast.ASTKind.Return: if self._NllMentions(ast.Return*(st).value, al) != 0: return 0 elif k == ast.ASTKind.Assign: