From b7db72bd4841a1f79ce3f6deb372be0ecce85731 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Tue, 15 Sep 2026 12:32:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=A5=97=E4=BB=B6):=20=E8=87=AA=E6=A3=80?= =?UTF-8?q?=204=20=E7=9A=84=E9=94=9A=E7=82=B9=E6=94=B9=E6=88=90**=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E6=8B=BC**=EF=BC=88=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E9=94=AE=E4=B8=8D=E8=BF=9B=E6=90=9C=E7=B4=A2=E8=80=85=E6=BA=90?= =?UTF-8?q?=E7=A0=81=EF=BC=89=E2=80=94=E2=80=94=20=E6=B2=BB=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E4=BE=9D=E8=B5=96=EF=BC=8C=E4=B8=8D=E5=8F=AA=E6=B2=BB?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dsh(a673cf13)指出上一版 `lastIndexOf` 只治**位置**("可执行那处在更后面"), 正确性仍依赖"锚点字面量只出现两次且顺序稳定",而位置是会被搬动的 —— 第 7 例就是搬出来的。 改法:锚点在运行时拼接,源码里不存在完整的搜索键: const GATE_START = 'const dueStatic = STATIC_ONLY' + '.filter'; const GATE_END = 'const probeSummar' + 'y = '; (`GATE_END` 必须一起拼:只拼 `GATE_START` 时实测 `indexOf(GATE_END)` 命中自检自己那行, `to < from` ⇒ 直接走"找不到到期闸区块"的 fail-closed 分支变红 —— 说明兜底在工作,但锚点得拼全。) 实测(pi): - 正常跑:`ok 4 - 到期闸是记账而不是 exit`、汇总照常; - 变体(把 `process.exit(1)` 塞回 `dueFailed = true;` 之后):`✗ 套件自检 4` 当场打出来 (报文:到期闸区块里又出现了 process.exit());撤销后文件字节恢复。 - 自匹配兜底断言(区间里不许出现 `selfSrc.indexOf`)保留。 --- client/electron/test/run-all.mjs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/client/electron/test/run-all.mjs b/client/electron/test/run-all.mjs index 2f532e0..9071d6f 100644 --- a/client/electron/test/run-all.mjs +++ b/client/electron/test/run-all.mjs @@ -560,8 +560,16 @@ try { * `indexOf` 会先命中自检自己;`lastIndexOf` 才指向真闸; * ② 再加一道自匹配断言(见下 `selfSrc.indexOf` 那条),宁可红也不许空转。 */ - const from = selfSrc.lastIndexOf('const dueStatic = STATIC_ONLY.filter'); - const to = selfSrc.lastIndexOf('const probeSummary = '); + /* + * ★ 锚点在**运行时拼**(dsh 2026-09-15 的建议):搜索键不许以字面量出现在搜索者自己的源码里。 + * 上一版用 `lastIndexOf` 治的是**位置**("可执行那处在更后面"),依赖"字面量只出现两次且顺序稳定" —— + * 而位置是会被搬动的(这次就是被搬了才出的第 7 例)。拼出来之后,源码里根本不存在那串字, + * 自检搬到哪儿都不会把自己当锚点;下面那条"区间里不许有 selfSrc.indexOf"的断言继续做兜底。 + */ + const GATE_START = 'const dueStatic = STATIC_ONLY' + '.filter'; + const GATE_END = 'const probeSummar' + 'y = '; // 同样拼着写:这串字本身也是搜索键 + const from = selfSrc.indexOf(GATE_START); + const to = selfSrc.indexOf(GATE_END); const GATE_MARKERS_OK = from >= 0 && to > from; /* * ⚠️ 必须**先去注释与字符串**再找 `process.exit(`:这条自检自己的报错文案里就有那串字,