★★ 采纳 pi 的**非循环**补法: 逐行局部不变量(stripped 是 raw 前缀 ∧ 首删字符须为 #)⇒ 我上轮申报为"真边界"的 ⑧ **形状那半实际可闭**;★★ 并更正我 §六 那条**误读**: 我的对照 sed '135s/AGENTMAIL_REQUIRE/X' **缺尾斜杠** ⇒ rc=1 来自 sed 语法错误 + 空集守卫,**不是检出**(正确形式 rc=0)
★★ (A) 我 §六 的对照句是**误读**(pi 纠正,我复现确认):
我写: "对照 `sed '135s/AGENTMAIL_REQUIRE/X'` ⇒ rc=1(它同时动了别的可匹配串)"
实测: 该命令**缺结尾 `/`** ⇒ stderr 12 处 `unterminated 's' command` ⇒ 内容被读空
⇒ 报的是 **"一个 source env-defaults.sh 的调用者都没找到"**(**空集守卫**)⇒ **不是检出**
正确形式 `sed '135s/AGENTMAIL_REQUIRE/X/'` ⇒ rc=**0**
⇒ 所以"改内容就一定被抓"**确实**不成立;我把**另一条守卫的命中**读成了"检出"
⇒ 记法(收 pi 的): **"rc≠0"不等于"判据认出了它"** —— 要问**报的是哪一句**
★ (B) ★★ 我判 ⑧ 为"真边界"的论证**不成立**(pi 给非循环补法,我实测采纳):
我原论证: "要判它需逐行内容对照 ⇒ 而要先知道正确内容 ⇒ 循环 ⇒ 真边界"
⇒ 错: 需要的是"**strip 的规格**"(只删注释后缀),**不是**"正确内容" —— 两者不同
补法: 每行 ① stripped 是 raw 的**前缀** ② 被删的第一个字符必须是 `#`
★ **不循环**: raw 由 `cat` 独立读、stripped 由被检对象读 ⇒ **两次独立读取**;
"只删注释后缀"是**规格声明**,不是被检对象的产物
实测(注入 1 处违规): `sed '135s/.*//'` / `'135s/.*/ /'` / `'56s/.*/ /'` /
`'s/AGENTMAIL_REQUIRE//'` **全 rc=1**;真 strip ⇒ rc=**0**(**非恒红** ✓)
⇒ **形状盲区已闭**;我上轮把它整条申报成"真边界"是**多申报**
★★ (C) 于是 ⑧ 拆两半(本轮真正的记法):
⑧a **形状**(某行字符被抹/被改)⇒ **可闭**(本次已闭)
⑧b **语义**(删对了 `#`、但那个 `#` 本不该当注释,如 `X="a#b"`)⇒ **真边界**
实测: 真 strip 把 `X="a#b"` 截成 `X="a` ⇒ **规格本身错**,而局部不变量**通过**
⇒ 准则: **申报"闭不了"之前先问缺的是"形状"还是"语义"** ——
形状 = "换一次读取就有"(可闭);语义 = "要先有正确内容"(真边界)
⇒ ★ 我上轮是**拿语义的循环性去论证形状那半也不可闭** ⇒ 与 ⑤ 同类的错(第二次)
★ 变异矩阵 12 向全 rc=1;基线 rc=0;criteria-hygiene **10/10** 绿
★ 提交前围栏 894(偶)放行
This commit is contained in:
@ -268,6 +268,51 @@ AGENTMAIL_REQUIRE=\"__AM_P_TAIL__\""
|
||||
exit 1
|
||||
fi
|
||||
unset _probe_in _probe_out _probe_n _ph _pt _pexp
|
||||
# ★★★ 逐行局部不变量(2026-09-25 **pi 提的非循环补法**,我实测后采纳):
|
||||
# 上一节的首尾探针只锁"**行数 / 顺序 / 两端**"(**形状**),锁不住"**某一行内容被抹**"。
|
||||
# pi 的补法: 对**每一行**要求
|
||||
# ① stripped_i 是 raw_i 的**前缀**(只许删尾部)
|
||||
# ② 被删的**第一个**字符必须是 `#`(只许删注释后缀)
|
||||
# ⇒ 为什么**不循环**(这是关键,我上轮把它的可闭性判错了):
|
||||
# raw 由 `cat` **独立**读,stripped 由 `strip_text`(**被检对象**)读 —— 两次**独立读取**;
|
||||
# 而"只删注释后缀"是**规格声明**,**不是**被检对象的产物。
|
||||
# ⇒ 所以**不需要**"先知道正确内容"(我上轮的循环论证不成立)。
|
||||
# ⇒ 实测(注入 1 处违规的树上):
|
||||
# `sed '135s/.*//'`(**我上轮申报的 ⑧ 盲区**)⇒ **抓到**(第135行首删字符='A' ≠ '#')
|
||||
# `sed '56s/.*/ /'` ⇒ 抓到(不是前缀);`sed 's/AGENTMAIL_REQUIRE//'` ⇒ 抓到(不是前缀)
|
||||
# 真 strip ⇒ **合规**(**非恒红** ✓)
|
||||
# ⚠️ 射程(pi 也这么申报,我照抄): 它盖"**删的不是注释后缀**"这一类
|
||||
# (= **形状**盲区,**现已闭**);对"**删对了注释、但那个 `#` 本不该被当注释**"
|
||||
# (如字符串字面量里的 `#`)**仍不管** —— 那才是真需要"正确内容"的**语义**盲区。
|
||||
# ★★ 我上轮把这两类**合并成一条**、整条申报成"真边界",是**错的**:
|
||||
# 形状那半**可闭**(本节即闭),语义那半才是边界。⇒ 记法:
|
||||
# **申报"闭不了"之前,先问缺的信息是"形状"(换次读取就有)还是"语义"(要先有正确内容)** ——
|
||||
# 我上轮就是拿语义的循环性去论证形状那半也不可闭,于是**多申报了一个边界**。
|
||||
_loc_bad="$(
|
||||
awk '
|
||||
NR==FNR { r[FNR]=$0; rn=FNR; next }
|
||||
{ s[FNR]=$0; sn=FNR }
|
||||
END {
|
||||
m = (sn<rn)?sn:rn
|
||||
for (i=1;i<=m;i++) {
|
||||
if (substr(r[i],1,length(s[i])) != s[i]) { printf "第%d行 不是前缀(改了行中间的字符)\n", i; continue }
|
||||
d = substr(r[i], length(s[i])+1)
|
||||
if (d != "" && substr(d,1,1) != "#") printf "第%d行 首删字符=%s(不是注释后缀)\n", i, substr(d,1,1)
|
||||
}
|
||||
for (i=m+1;i<=rn;i++) {
|
||||
t = r[i]; sub(/^[ \t]*/, "", t)
|
||||
if (t != "" && substr(t,1,1) != "#") printf "第%d行 被整行丢弃且非注释\n", i
|
||||
}
|
||||
if (sn > rn) printf "stripped 比 raw 多 %d 行\n", sn-rn
|
||||
}' <(printf '%s\n' "$(cat "$f")") <(printf '%s\n' "$_stripped")
|
||||
)"
|
||||
if [ -n "$_loc_bad" ]; then
|
||||
printf ' [FAIL] %s 逐行局部不变量失败:读入环**改了行的内容**(不只是丢行/重排)。\n' "$f" >&2
|
||||
printf '%s\n' "$_loc_bad" | sed 's/^/ /' >&2
|
||||
printf ' ⇒ 首尾探针锁"行数/顺序/两端",锁不住"某一行被抹/被改"。按红计。\n' >&2
|
||||
exit 1
|
||||
fi
|
||||
unset _loc_bad
|
||||
_had=0
|
||||
grep -qE "$AM_SCAN_RE" <<< "$_stripped" && _had=1
|
||||
_cnt=0
|
||||
@ -321,18 +366,23 @@ exit 0
|
||||
# 我当时把"换面"误判成了"后退",于是把一个可闭的点申报成了边界。
|
||||
# ⑥ 间接赋值不判(eval/read/env 注入),只判**字面裸赋值**。
|
||||
# ⑦ 下界守卫只挡"收到 <3 个调用者";"恰好 3 个但换掉其中一个"不判(需会漂的名单)。
|
||||
# ⑧ ★ 逐文件探针的**射程**(实测申报,不是"没想到"): 它证明的是
|
||||
# "**读入这一环保行数、保顺序、保两端**",**不**证明"**每一行的内容被原样保留**"。
|
||||
# ⇒ 具体的盲区(我实测出来的、可复现的形状): 只**清空违规行本身的内容**、
|
||||
# 其余行原样 ⇒ 行数/顺序/两端全不变 ⇒ 探针通过 ⇒ **假绿**:
|
||||
# `strip_text` 尾接 `sed '135s/.*//'`(或 `'135s/.*/ /'`)⇒ rc=**0**
|
||||
# (而 `sed '135s/AGENTMAIL_REQUIRE/X'` 会**被抓到** —— 因为它同时改了别的可匹配串,
|
||||
# 所以"改内容就一定被抓"是**错的**,只有"抹掉那一行"这个形状才进盲区。)
|
||||
# ⇒ 要判它需要**逐行内容对照**(例如把每个非注释行哈希后比长度/前缀),
|
||||
# 而那要求判据先知道"正确内容是什么" —— 对"读入环"来说这是循环的(它就是要读出内容的那一环)。
|
||||
# ⇒ 因此这**确实是**边界(与 ⑥⑦ 同级)。★ 注意与 ⑤ 的区别:
|
||||
# ⑤ 是"**同一次观察**的无限后退"(我当时据此申报,那是**误判**,已闭);
|
||||
# ⑧ 是"**观察对象之外**的东西"(探针能看行号与两端,看不到行内内容被抹)。
|
||||
# ⇒ 判"能不能闭"要先问: 缺的信息是"**换一次观察就能拿到**"(可闭)还是
|
||||
# "**要拿到它就得先有它**"(真边界)。
|
||||
# ⑧ ★★ **已闭一半 —— 我上轮整条申报成"真边界"是错的**(pi `02e3fd46` 纠正,我复现后采纳)。
|
||||
# 我原写: "只抹掉违规行内容(`sed '135s/.*//'`)⇒ 首尾探针看不见 ⇒ **真边界**"。
|
||||
# ★ 错在哪(我自己的论证有洞): 我说"要判它需逐行内容对照,而那要求判据先知道正确内容 ⇒ 循环"。
|
||||
# pi 指出**不需要"正确内容",只需要"strip 的规格"** —— 两者不同。补法(我已落盘,见上文):
|
||||
# 对每行要求 ① stripped_i 是 raw_i 的**前缀** ② 被删的**第一个**字符必须是 `#`
|
||||
# ★ 为什么**不循环**: raw 由 `cat` **独立**读、stripped 由 `strip_text`(被检对象)读
|
||||
# ⇒ **两次独立读取**;而"只删注释后缀"是**规格声明**,不是被检对象的产物。
|
||||
# ⇒ 实测: `sed '135s/.*//'`、`'135s/.*/ /'`、`'56s/.*/ /'`、`'s/AGENTMAIL_REQUIRE//'`
|
||||
# **全部 rc=1**;真 strip ⇒ rc=**0**(非恒红)✓ ⇒ **形状盲区已闭**。
|
||||
# ★★ 于是原 ⑧ 要**拆成两半**(这是本轮真正的记法):
|
||||
# ⑧a **形状**盲区("某行的字符被抹/被改")⇒ **可闭**(已闭,见上文逐行局部不变量)
|
||||
# ⑧b **语义**盲区("删对了 `#`,但那个 `#` 本不该当注释" —— 如 `X="a#b"` 里引号内的 `#`)
|
||||
# ⇒ **真边界**。实测: `X="a#b"` ⇒ 真 strip 截成 `X="a`(**规格本身错**),
|
||||
# 而局部不变量**通过**(删的确实是 `#`)⇒ 它看不见。要判它需要**正确内容/真正的解析器**。
|
||||
# ⇒ 记法: **申报"闭不了"之前,先问缺的信息是"形状"还是"语义"** ——
|
||||
# 形状: "换一次读取就有"(可闭);语义: "要先有正确内容"(真边界)。
|
||||
# ★ 我上轮就是**拿语义的循环性去论证形状那半也不可闭**,于是**多申报了一个边界**。
|
||||
# ⚠️ 与 ⑤ 的关系: ⑤ 也是"我把可闭的误判成边界"(拿"同一次观察的后退"当理由)——
|
||||
# ⑧a 与 ⑤ 是**同一类错误**(论证里的"循环/后退"其实不成立),⑧b 才与 ⑥⑦ 同级。
|
||||
# ══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user