mirror of
https://github.com/motajs/template.git
synced 2026-10-16 18:40:17 +08:00
docs(07-10): correct expireStreams call-site count to 5
This commit is contained in:
parent
10f88628cd
commit
a81e445497
@ -45,7 +45,7 @@ must_haves:
|
||||
key_links:
|
||||
- "`set()` 的索引回退起点 `index`(命令索引)↔ `getParamRange(index)` 的 `[start, end)`(`array.ts:407-415`)——`delete()`(`:467-500`)已用该口径,`set()` 与之对齐后二者不可能再分叉"
|
||||
- "`getParamRange` 的末步终点 `this.paramUsed`(`:412`)↔ `set()` 不再读 `indexArray[index + 1]`(`:507`)——末步 set 不再产生负 `paramLength` 与巨型 `deltaLength`"
|
||||
- "`setReplayArray`(`:801-826`)↔ `expireStreams()`(`:214-219`)——其它 6 处写路径(`add`/`insert`/`delete`/`set`/`setCommandWidth`/扩容)都调用,`setReplayArray` 是唯一遗漏"
|
||||
- "`setReplayArray`(`:801-826`)↔ `expireStreams()`(`:214-219`)——调用点共 5 处(`add` `:434`、`insert` `:464`、`delete` `:499`、`set` `:538`、`setCommandWidth` `:581`),`setReplayArray` 是唯一漏掉的缓冲区装载/改写路径(`checkBufferExpand` 扩容不调用 `expireStreams` 属有意为之:扩容保留字节偏移语义,读流仍有效)"
|
||||
- "`normalizeParam` 的 bigint `arr.length`(`:277`、写入 `:389`)↔ `decodeParam` 读取的单字节长度(`:660`)——长度字节必须 ≤ 255,即 |值| < 2^2040"
|
||||
- "`normalizeParamList` 的截断(`:316-323`)↔ `setCommandArray(commandStart, params.length, …)`(`:426`/`:453`/`:517`)——计数必须用截断后的长度"
|
||||
- "`ReplaySandbox.reader`(`sandbox.ts:43` 构造期捕获偏移)↔ `ReplaySystem.loadState`(`system.ts:106-113`)→ `expireStreams()` ——过期后 `step()`/`play()` 告警 156(`sandbox.ts:66-69/78-81/141-144`)"
|
||||
@ -69,7 +69,7 @@ must_haves:
|
||||
|
||||
现状(逐条锚点):
|
||||
1. **CR-01(高)** `set()`(`array.ts:502-539`)把 `paramStart`(参数字节偏移)当作命令索引回退起点(`:534`),且直接读未初始化的 `indexArray[index + 1]`(`:507`)——与 07-03 已在 `delete()` 中修掉的缺陷镜像(`07-REVIEW.md` CR-01;`07-03-PLAN.md` 已登记 `set` 与 `insert(index === length)` 为「只登记不修」)。
|
||||
2. **`#06-17-3`(审计 H)** `setReplayArray()`(`:801-826`)漏 `expireStreams()`,其它 6 处写路径都有——`ReplaySystem.loadState` 后活跃 `ReplaySandbox.reader` 按陈旧偏移解码。
|
||||
2. **`#06-17-3`(审计 H)** `setReplayArray()`(`:801-826`)漏 `expireStreams()`,其它 5 处写路径(`add`/`insert`/`delete`/`set`/`setCommandWidth`)都有——`ReplaySystem.loadState` 后活跃 `ReplaySandbox.reader` 按陈旧偏移解码。
|
||||
3. **WR-01** bigint 长度存单字节(写入 `:389`、读取 `:660`),而守卫只拦 2^2047(`:270-273`);|值| ≥ 2^2040 时长度字节溢出为 0,解码只前进 2 字节 → 后续参数全部错位。
|
||||
4. **WR-02** `add()` 写 `params.length`(`:426`)而只存 `normalizeParamList` 截断后的 255 个参数(`:316-323`)——参数计数与实际内容不一致,读流与下一条命令错位。
|
||||
5. **WR-03** 参数类型码 5/6/7/8 与短字符串基址已被重新分配(`:11-33`、`:593-688`),`IReplaySystemSave`(`types.ts:324-352`)无格式版本标记 —— 旧录像重解码会静默变成垃圾。
|
||||
@ -295,7 +295,7 @@ Phase 7 裁决对应(逐条引用):D-01/D-02: 本计划是 Phase 7 第 10
|
||||
<action>
|
||||
(1) **越界校验(WR-07)**:在 `insert`/`delete`/`set` 的 `disabled` 早退之后、任何缓冲读写之前插入 `index` 校验——`delete`/`set` 合法区间 `[0, this.length)`,`insert` 按 Q2 裁决为 `[0, this.length]`(追加合法)或 `[0, this.length)`;越界时按 Q3 裁决处理:选项 A 复用 `logger.warn(9)`、选项 B 新增码(在 `packages/common/src/logger.json` 的 `warn` 段按现有 JSON 结构追加 179,文案含操作名/索引/长度占位符,并在 `array.ts` 调用处传参)、选项 C 静默返回。三种情形下越界调用都**不得**触碰 `commandArray`/`paramArray`/`indexArray`/`length`/`paramUsed`。
|
||||
(2) **`insert(index === length)`(Q2)**:选项 A 时把该情形走追加语义(`paramStart = this.paramUsed`、`setCommandArray(length * commandSize, …)`、`setParamArray(paramUsed, normalized)`、`indexArray[length] = paramUsed`,`length++`/`paramUsed += length` 后 `expireStreams()`,不执行任何 `copyWithin`);选项 B 时由 (1) 的校验拒绝并告警。
|
||||
(3) **`setReplayArray` 补 `expireStreams()`(`#06-17-3`)**:在 `rebuildIndexArray()`(`:825`)之后调用 `this.expireStreams()`,使 `ReplaySystem.loadState` 装载缓冲区时把此前 `createReadStream` 创建的活跃读流全部标记过期(`sandbox.ts:43` 的 `reader`),与其它 6 处写路径一致。不改 `sandbox.ts`。
|
||||
(3) **`setReplayArray` 补 `expireStreams()`(`#06-17-3`)**:在 `rebuildIndexArray()`(`:825`)之后调用 `this.expireStreams()`,使 `ReplaySystem.loadState` 装载缓冲区时把此前 `createReadStream` 创建的活跃读流全部标记过期(`sandbox.ts:43` 的 `reader`),与其它 5 处写路径一致。不改 `sandbox.ts`。
|
||||
回归用例:
|
||||
(a) `array.test.ts`:`insert(this.length, …)`(按 Q2 裁决断言追加成功或告警无操作)、`insert(-1, …)` / `delete(length)` / `set(length)` 越界后 `length`、`get(i)`、`getCommandArray()` 首字节均未被破坏(越界调用前后对比);
|
||||
(b) `saveLoad.test.ts`:新建 `ReplaySystem` → `record(...)` → 建沙箱(`createReplaySandbox`,`reseter` 用最小桩)→ 取 `sandbox` 的读取流已被创建 → `system.loadState(snapshot)` → 断言 `sandbox.reader.expired === true`(必要时经 `sandbox.step()`/`play()` 断言告警 156,`sandbox.test.ts:196-211` 已有同款断言口径可参照);本用例即 `#06-17-3` 的回归。若 `IReplaySandbox` 未公开 `reader`,则在 `sandbox.test.ts` 口径下通过 `logger.catch(() => sandbox.play())` 断言 `info` 含 156(不得为此改 `sandbox.ts`)。
|
||||
|
||||
Loading…
Reference in New Issue
Block a user