fix: L3 数据流误报大修 (真实项目扫描发现 E004 从 422 降到 3)
- with ... as f: 上下文变量未登记 → with 块内 f 全误报 - 推导式/生成器变量: target 未登记, elt 里变量全误报 (修复: 独立作用域副本) - lambda 参数未登记 → key=lambda d 全误报 - except ... as e: handler 变量未登记 → e 全误报 - if 分支 return 提前终止未识别 → else return 后变量误报 (修复: _flow_terminates + 合并三分支) - 剩余 3 条为已知盲区: locals() 动态检查 / try handler 保守策略 (宁误勿漏) - 新增 7 项误报回归测试; 相关套件 283 passed
This commit is contained in:
1 parent
fa29e0339f
commit
08f26cdcfd
2 files changed
+113
-6
No files matched your search
@@ -378,6 +378,53 @@ class TestDataFlow:
|
||||
keys = [(d["code"], d["line"], d["col"]) for d in issues]
|
||||
assert len(keys) == len(set(keys)), f"存在重复诊断: {keys}"
|
||||
|
||||
# ── L3 误报回归 (真实项目扫描发现, 曾 422 条误报) ──
|
||||
def test_with_as_var_ok(self, pd):
|
||||
src = "def f():\n with open('x') as fh:\n return fh.read()\n"
|
||||
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
|
||||
|
||||
def test_comprehension_var_ok(self, pd):
|
||||
src = "def f(items):\n return [x * 2 for x in items]\n"
|
||||
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
|
||||
|
||||
def test_nested_comprehension_ok(self, pd):
|
||||
src = ("def f(rows):\n"
|
||||
" names = ', '.join(t.get('name', '') for t in rows)\n"
|
||||
" return names\n")
|
||||
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
|
||||
|
||||
def test_lambda_param_ok(self, pd):
|
||||
src = "def f(issues):\n return sorted(issues, key=lambda d: d['x'])\n"
|
||||
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
|
||||
|
||||
def test_except_handler_var_ok(self, pd):
|
||||
src = ("def f():\n"
|
||||
" try:\n"
|
||||
" risky()\n"
|
||||
" except ValueError as e:\n"
|
||||
" return str(e)\n")
|
||||
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
|
||||
|
||||
def test_return_in_else_terminates(self, pd):
|
||||
"""else 分支 return 终止 → elif 分支流出时变量确定 (send_image 场景)"""
|
||||
src = ("def f(args):\n"
|
||||
" if isinstance(args, str):\n"
|
||||
" p = 1\n"
|
||||
" elif isinstance(args, dict):\n"
|
||||
" p = 2\n"
|
||||
" else:\n"
|
||||
" return None\n"
|
||||
" return p\n")
|
||||
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
|
||||
|
||||
def test_return_in_else_both_terminate(self, pd):
|
||||
src = ("def f(x):\n"
|
||||
" if x:\n"
|
||||
" return 1\n"
|
||||
" else:\n"
|
||||
" return 2\n")
|
||||
assert "E004" not in {d["code"] for d in pd.analyze(src, "t.py")}
|
||||
|
||||
|
||||
# ── code_editor 写文件后自动检测集成 ──
|
||||
class TestAutoDetectIntegration:
|
||||
|
||||
Reference in new issue
Block a user