From 8922ddc468feec99c3be53b4a23e94abac130d4c Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sat, 26 Sep 2026 01:39:56 +0800 Subject: [PATCH] =?UTF-8?q?=E2=98=85=E2=98=85=20=E4=BF=AE=E6=8E=89=20pi=20?= =?UTF-8?q?`95e50126`=20=E6=89=80=E6=8C=87**=E5=90=8C=E4=B8=80=E5=BD=A2?= =?UTF-8?q?=E7=8A=B6=E7=9A=84=E7=AC=AC=E4=B8=89=E5=A4=84**=EF=BC=88`:407/:?= =?UTF-8?q?408`=20=E7=9A=84=20`grep=20|=20head=20-1`=EF=BC=89=E2=80=94?= =?UTF-8?q?=E2=80=94=20=E4=BD=86=E5=AE=9E=E6=B5=8B=E5=AE=83**=E4=B8=8D?= =?UTF-8?q?=E6=98=AF=E5=90=8C=E4=B8=80=E4=B8=AA=E7=BC=BA=E9=99=B7**?= =?UTF-8?q?=EF=BC=88=E5=A4=B1=E6=95=88=E6=96=B9=E5=90=91=E7=9B=B8=E5=8F=8D?= =?UTF-8?q?=EF=BC=89=EF=BC=8C=E5=B9=B6=E7=BA=A0=E6=AD=A3=E6=88=91=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E4=B8=A4=E6=AC=A1=E8=AF=AF=E5=88=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ★★ 形状: `_ph="$(grep -F "${_am_nonce}HEAD" <<< "$_probe_out" | head -1 | cut -d: -f1)"` 与 pi 批的 `:102`(`strip | grep -n`)**逐字同构**: 都是"管道 + 会早退的读者" ⇒ 我若只报不改,就是**第三次**"知道规则、写在注释里、自己没照做" ★★★ 但它与 `:102` **不同族** —— 我实测把"形状相同"与"缺陷相同"分开了: · `:102` 静音 ⇒ `hits` 空 ⇒ 报"裸赋值 **0** 处" ⇒ 落**绿**侧(fail-open)✗ · 本处静音 ⇒ `_ph` 空 ⇒ `:410 [ -z "$_ph" ]` ⇒ 落**红**侧(fail-closed)✓ 逐场景验证: `_ph` 空 / 取到错行 / 顺序反 ⇒ **三种都判红** · ★ 且生产者**输出上界=1 行是构造性的**(`_am_nonce` 运行期随机 ⇒ 静态 `$f` 不可能预先含它), 不是"尺寸恰好装得下" ⇒ 我把巨量输出强喂给它(40 次): 141 出现 **40/40**, 而**取值仍恒正确**(`head` 已拿到它要的那一行)—— 与 `:102` 的"值被丢掉"也不同 ⇒ 记法: 修一条规则时,**"这处违不违规"与"这处会不会因此出错"是两个问题** —— 前者看形状,后者看**失效方向**;**只有后者决定它是不是同一个 bug** ⇒ 仍改成无管道写法(`grep -m1` + `${x%%:*}`,成本为零),并让规则在全文件一致, 免得下一次有人动掉 nonce 那个界时这处才第一次暴露 ★★ 同时纠正我自己的**两次误判**(都在本轮现场抓到,记下来): ① 我报"放宽探针谓词 ⇒ 探针静默失效(rc=0)" —— **错的**: 我那次变异的 `grep -E "." | head -1` 取到的**第 1 行正是探针行** ⇒ 它是**等价变异**,不是失效 ② 我报"141 时取值损坏 40/40" —— **是我把期望值写错了**(写成 `1`,实际该是 `AMHEAD`); 实测取值正确 **40/40**,取值错 **0/40** ⇒ 两次都是**判据写错**而非对象出错 —— 与我 `15c8f50` 那次"0 命中还写行号"同族 ★ 验证: `bash -n` ✓;基线 rc=0(连测 5 次);注入裸赋值 ⇒ rc=1(非空转); 探针目标变异仍被抓(删中间行 ⇒ rc=1);`criteria-hygiene` **10/10** 绿;生产未动 --- deploy/check-require-declaration.sh | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/deploy/check-require-declaration.sh b/deploy/check-require-declaration.sh index 8555bc5..1263dcc 100755 --- a/deploy/check-require-declaration.sh +++ b/deploy/check-require-declaration.sh @@ -404,8 +404,21 @@ AGENTMAIL_REQUIRE=\"${_am_nonce}TAIL\"" # 内容行数与探针**同一条读取路径**(都经 `printf '%s\n'` 补回被命令替换吃掉的尾换行) _probe_n="$(printf '%s\n' "$(cat "$f")" | awk 'END{print NR}')" _probe_out="$(_scan_stripped "$(strip_text "$_probe_in")" || true)" - _ph="$(grep -F "${_am_nonce}HEAD" <<< "$_probe_out" | head -1 | cut -d: -f1)" - _pt="$(grep -F "${_am_nonce}TAIL" <<< "$_probe_out" | head -1 | cut -d: -f1)" + # ★★ 这里也**不能**写成 `grep -F … <<< "$_probe_out" | head -1 | cut -d: -f1`(我第三版就是): + # 与上面那条**同一形状** —— `head -1` 一拿到就退出 ⇒ 生产者收 SIGPIPE ⇒ pipefail 下整体 141。 + # ★ 它的安全性**与 :102 不同族**,我实测分清了(别把"形状相同"当成"缺陷相同"): + # · :102 静音 ⇒ `hits` 空 ⇒ 报"裸赋值 0 处" ⇒ 落**绿**侧(fail-open)✗ + # · 本处静音 ⇒ `_ph` 空 ⇒ 下面 `[ -z "$_ph" ]` ⇒ 落**红**侧(fail-closed)✓ + # (我逐场景验过: `_ph` 空 / 取到错行 / 顺序反 ⇒ **三种都判红**) + # · 且生产者的**输出上界=1 行是构造性的**(`_am_nonce` 是运行期随机 ⇒ 静态 `$f` 不可能预先含它), + # 不是"尺寸恰好装得下"⇒ 我把巨量输出强喂给它(40 次): 141 出现 **40/40**, + # 而**取值仍恒正确**(`head` 已拿到它要的那一行)—— 与 :102 的"值被丢掉"也不同 + # ⇒ 结论: **同形状、不同缺陷**。我仍改成无管道的写法(成本为零,且让规则在全文件一致, + # 免得下一次有人动掉 nonce 那个界时这处才第一次暴露)。 + # ⇒ 记法: 修一条规则时,**"这处违不违规"与"这处会不会因此出错"是两个问题** —— + # 前者看形状,后者看**失效方向**;只有后者决定它是不是同一个 bug。 + _phead="$(grep -m1 -F "${_am_nonce}HEAD" <<< "$_probe_out" || true)"; _ph="${_phead%%:*}" + _ptail="$(grep -m1 -F "${_am_nonce}TAIL" <<< "$_probe_out" || true)"; _pt="${_ptail%%:*}" _pexp=$(( ${_ph:-0} + _probe_n + 1 )) if [ -z "$_ph" ] || [ -z "$_pt" ] || [ "$_ph" -ge "$_pt" ] || [ "$_pt" -ne "$_pexp" ]; then printf ' [FAIL] %s 逐文件探针失败:读入这一环**不是逐行原位**的 —— 它在丢弃或重排内容。\n' "$f" >&2