JianFeeeee
4c94d430b1
★★★ 收 pi 9bb3cc32: 上一版"词首规则"的**单条 sed 近似**有两处**方向相反**的残留(①假阴 . "$A #B/…" ⇒ rc=0 丢调用者 ②假红 . /dev/null;# 提到 … ⇒ rc=1 误判)⇒ 改为**引号感知的逐字符扫描**(_strip_comments_lex),并加调用者判定的**正/反向对照**
★★ (A) pi 报的两处残留我都复现(`2fe58ce` 上逐字一致):
① 假阴(未全闭): `. "$A #B/deploy/lib/env-defaults.sh"` + 裸赋值
⇒ 我的规则把**引号内「空格+#」**当注释 ⇒ 截成 `. "$A` ⇒ 丢失调用者 ⇒ rc=**0**、调用者数仍 3
② 假红(我没提): `. /dev/null;# 提到 env-defaults.sh` + 裸赋值
⇒ `;` 后的 `#` **该**截而没截 ⇒ **非调用者**进集合 ⇒ rc=**1** 并报该文件裸赋值
对照: `;` 换成空白 ⇒ 正确截断 ⇒ 不算调用者 ⇒ rc=0 ✓
★ 两处**方向相反**且**单条 sed 修不了**: 只加元字符边界 ⇒ 修②、对①无改善;
只追引号 ⇒ 修①、对②无改善 ⇒ 真规则要**跨字符状态**(在引号里吗)⇒ 必须写成自动机
★ (B) 修法: 新增 `_strip_comments_lex`(awk 逐字符扫描)实现 bash 手册的真规则 ——
**以 `#` 开头的"词"**(词边界 = 行首/空白/元字符),且 `#` 在**引号内**时不是词首;
`'…'` 内除 `'` 全字面,`"…"` 内 `\` 可转义,`\#` 不是注释。
实测矩阵(本仓真实两行 + pi 两例 + 反例 4 例)全部符合预期
★ 我先试了 pi 建议的"env-defaults.sh 出现在最后一个引号闭合之后" —— **实测会漏掉本仓
**全部** 真实调用者**(`. "$REPO/…/env-defaults.sh"` 里 env 在末引号**之前**)⇒ 未采纳
★ (C) 加调用者判定的**正向/反向对照**(域的定义静音 ⇒ 正式扫描不报错,只少查/多查文件):
正: 两个已知调用者样本(含本仓真实形态、pi①)必须被认出
反: 两个非调用者样本(pi②、整行注释)必须不被认出
⇒ 变异测试: 词法器"恒删 env-defaults" ⇒ 正对照打红(但**先**被空集守卫接住,见下)
词法器"恒不截断" ⇒ **反对照打红**(这一条是新的鉴别力)
★ (D) ⚠️ 我**自catch 并把射程写窄**(第一版注释我写宽了):
该对照调的是**函数** `_is_caller_text`,**不是调用点** ⇒
它盖住"词法器 + 正则"两环,**盖不住**有人把**调用点**改掉(`… "$(cat "$f")"` → `true`/`false`)——
实测确认那种改法自检**照样绿**。⇒ 该方向由 ② 空集 / ②′ 下界兜;
而域**偏宽**(非调用者算进来 ⇒ 假红)**当前没有守卫**,我**不**声称已盖住。
★ 这正是我先前记的"自检必须与正式判定走**同一条实现路径**"——我**又**在注释里写宽了一次;
这次的处理是**把射程写窄**而不是再宣称补了一个洞(按 ⑰′ 的标准)
★ 回归: pi 两例 + 前版两例 + 真调用者 共 5 例全部符合预期;
12 向变异矩阵全 rc=1;干净基线 rc=**0**;criteria-hygiene **10/10** 绿
★ 依赖: `awk` 已在脚本顶部预检(`for c in grep awk sed find`)与 SELF 列表内
2026-09-25 08:40:46 +08:00
..
2026-09-25 06:51:25 +08:00
2026-09-14 08:38:33 +08:00
2026-09-13 11:06:01 +08:00
2026-09-15 07:00:35 +08:00
2026-09-25 07:01:36 +08:00
2026-09-24 04:15:30 +08:00
2026-09-18 04:07:26 +08:00
2026-09-12 11:36:25 +08:00
2026-09-25 08:40:46 +08:00
2026-09-14 23:33:11 +08:00
2026-09-14 20:35:01 +08:00
2026-09-25 06:51:25 +08:00
2026-09-21 07:14:41 +08:00
2026-09-14 15:51:40 +08:00
2026-09-15 11:21:00 +08:00
2026-09-25 06:27:09 +08:00
2026-09-25 06:51:25 +08:00
2026-09-25 06:51:25 +08:00
2026-09-06 15:18:06 +08:00
2026-09-02 20:05:51 +08:00
2026-09-13 11:06:01 +08:00
2026-09-13 11:06:01 +08:00
2026-09-14 08:38:33 +08:00