fix: L1 元组解包漏收集 + L3 for-else/try-else 路径误报 (外部真实项目扫描)

- L1: a, b = ... 解包赋值目标未收集 → xq_r/xq_i 等误报 E002 (xiaoli_chat.py 27 条误报归零)
- L3: for-else 的 else 在无 break 时必执行(含 0 次) → 其赋值确定 (renpy gamedir)
- L3: try/except/else: else return 终止 → handler 变量确定 (jinja2 asyncsupport); 无 else → handler 变量正常路径不确定保留 (jinja2 debug 真问题)
- 新增 6 项回归测试; 78 passed; xiaoli 自测 E002 误报 27→0, Ren'Py E004 194→182
This commit is contained in:
shuiyu67 committed 2026-08-07 03:04:48 +08:00
1 parent 08f26cdcfd
commit 9badbf30b7
2 files changed
+84 -17

No files matched your search

+47
View File
@@ -425,6 +425,53 @@ class TestDataFlow:
" return 2\n")
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
# ── 真实项目扫描发现的回归 (元组解包 / for-else) ──
def test_tuple_unpack_no_undefined(self, pd):
"""a, b = ... 解包赋值不得误报 E002 (xiaoli_chat.py RoPE 场景)"""
src = ("def f(x):\n"
" r, i = x.float().unbind(-1)\n"
" return r * i\n")
assert "E002" not in {d["code"] for d in pd.analyze(src, "t.py")}
def test_for_else_fallback(self, pd):
"""for-else: else 在无 break 时必执行(含 0 次) → 变量确定 (renpy gamedir 场景)"""
src = ("def f(cands):\n"
" for g in cands:\n"
" if g:\n"
" break\n"
" else:\n"
" g = 'default'\n"
" return g\n")
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
def test_for_else_break_keeps_checking(self, pd):
"""循环体内赋值 + 无 orelse → 仍报 (0 次循环风险保留)"""
src = "def f(items):\n for x in items:\n total = x\n return total\n"
assert 4 in code_lines(pd.analyze(src, "t.py"), "E004")
def test_try_else_return_handler_ok(self, pd):
"""except 赋值 + else return 终止 → 仅异常路径流出, 变量确定 (jinja2 asyncsupport)"""
src = ("def g():\n"
" try:\n"
" work()\n"
" except ValueError:\n"
" exc = sys.exc_info()\n"
" else:\n"
" return\n"
" return handle(exc)\n")
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
def test_try_handler_real_undefined_kept(self, pd):
"""无 else: handler 变量在正常路径不确定 → 保留 E004 (jinja2 debug 真问题)"""
src = ("def d(code, gl, lo):\n"
" try:\n"
" exec(code, gl, lo)\n"
" except ValueError:\n"
" exc = sys.exc_info()\n"
" tb = exc[2].tb_next\n"
" return exc[:2] + (tb,)\n")
assert "E004" in {d["code"] for d in pd.analyze(src, "t.py")}
# ── code_editor 写文件后自动检测集成 ──
class TestAutoDetectIntegration: