fix(套件): 自检 4 的锚点改成**运行时拼**(搜索键不进搜索者源码)—— 治位置依赖,不只治位置
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`)保留。
This commit is contained in:
@ -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(`:这条自检自己的报错文案里就有那串字,
|
||||
|
||||
Reference in New Issue
Block a user