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