★★ 修掉 pi 95e50126 所指**同一形状的第三处**(:407/:408 的 grep | head -1)—— 但实测它**不是同一个缺陷**(失效方向相反),并纠正我自己两次误判
★★ 形状: `_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** 绿;生产未动
This commit is contained in:
@ -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
|
||||
|
||||
Reference in New Issue
Block a user