refactor(编号): 批 4 陷阱号统一为 TRAP-<模块码>-<nn>
本批是 ② 形态迁移清的第一族(用户裁定顺序:② 里的 Trap 一族先做) 统一了什么(数字不变、只补模块码,§7.1)——改名工具 23 处 / 11 文件 - Trap 01~07 → TRAP-GD5F-01~07:属主文档 7 个标题行从此成为定义位 - 陷阱 1 → TRAP-RTC-01(SD2506 属 RTC 域,§4.2)、见陷阱 01 → TRAP-GD5F-01 - Trap 21 / Trap 19 → TRAP-NET-21 / TRAP-NET-19(引用的是活登记处 CH395F_Trap_Records.md,号本身不变) - 波及 Drivers/BSP/GD5F2GQ5UE/*(4 处注释)与 test/board/*(2 处)→ 已重编 三处判读后**刻意不改**(写进 §8.3,不让人当成漏网) - docs/环境与部署/并行任务工作树方案.md 的 wip/trap22-fix 是 git 分支名,不是编号; 这类非编号字面量要靠类型处理,与位号 T1、IEEE 负序 S2、gitlint 规则 ID 同一批 - docs/UI设计/菜单页面设计.md 变更记录行的「陷阱 3」按 §8.1 冻结不改写 - docs/硬件平台/V0.0、V0.1 网表报告里 6 处 Trap05 语义确指 TRAP-NET-05,但该目录 是门禁与改名工具共同的排除语料 → 不越界动笔,盲区登记进注册表 TRAP 族 cursor_note 两处不是改名、是改错话(映射表类工具的典型失效:字面对了、意思错了) - scripts/README.md 原写「Trap 19 从未存在」;改名后字面变成 TRAP-NET-19,而它是 **真实条目**(SET_MAC 必须在 INIT_CH395 之前)→ 那句话成了假话,改用站得住的例子 - docs/编号规范.md 同一处事故叙述补准确说法:当年裸形不在册 ≠ 这个坑不存在 - 菜单页面设计.md 的「见 §8.2 陷阱 1」本就不是 TRAP-* 族的号(指本文小节第 1 条), 改写成「见本文 §8.2 第 1 条(lv_text_get_width 的 length=0 陷阱)」 关闸第一次真拦人:咬的是自己家的审计表 - scripts/rename_maps/batch3-trap.json 里必然写着 Trap 21 / 陷阱 1 等旧形态, 被当成 6 类「台账外新账」→ 提交被拦(拦得对,但表不是语料) - 第 4 次同一类自循环(前三次:别名表、注册表、债务台账)→ 整个 rename_maps/ 目录入 excluded_paths;这条规律写进 §8.4:**登记号的表一律不得当引用语料** 实测变化 - 错误级 659 → 632(−27);② 空格/中文形 Trap 残余 2 处(都是上面刻意保留的) - ③ 悬空错误 44 → 42:TRAP-GD5F-01/05/06 三处历史悬空引用自动落地为已定义 - 编号字面量 8277 → 8312(识别面没有缩水,这是改名最容易踩的坑); 可判定比例 82.92% → 82.99%(基线 82.6%);⑦ 定义无引用 100 → 103(如 TRAP-GD5F-02 只有定义位无人引用,如实挂 warn 不压掉) - 台账 --prune-backlog 收掉已还清 42 条,剩 298 条(只减不增);--strict 通过 另修:core.autocrlf=true 把 SD2506_Trap_Records.md 检出成 CRLF(41 处)→ 还原 LF, 该文件 diff 只剩 1 行实质改动(仓库权威行尾是 LF,见 .gitattributes) 验证(全绿) - @build:0 错误 0 警告(Program Size Code=213356 RO=18580 RW=1184 ZI=131480) - ci_local.py:L0 + L0.5 全过(16 runner / 1104 断言) - check_doc_links.py --all:143 篇文档 0 失效、0 待确认 - 改动文件字节卫生逐项与 HEAD 对比:BOM / CR / U+FFFD 异常 0 审计轨迹与文档 - 映射表 scripts/rename_maps/batch3-trap.json(含作用域切分理由与刻意不改清单) - 别名 11 条全部带 scope;docs/编号规范.md §7.1 行状态、§8.3 批 4 行 + 说明段、 §8.4 自循环第 4 条、变更记录
This commit is contained in:
@@ -271,7 +271,7 @@ static void gd5f_page_read_issue(uint32_t page_addr) {
|
||||
* 函数说明:13h 单次发令 + WIP 轮询(与 Linux 主线 / GigaDevice 厂商驱动
|
||||
* 形状完全一致:13h×1 → OIP 轮询 → 0Bh)。
|
||||
* 2026-09-20 台架异常史实(归因、证伪、沉降/二次发令的加与除)
|
||||
* 统一记于 docs/问题记录/GD5F2GQ5UE_Trap_Records.md Trap 05,
|
||||
* 统一记于 docs/问题记录/GD5F2GQ5UE_Trap_Records.md TRAP-GD5F-05,
|
||||
* 复现手段见测试 Phase 11 用例。
|
||||
*/
|
||||
int32_t gd5f_page_read(uint32_t page_addr) {
|
||||
|
||||
@@ -62,7 +62,7 @@ extern "C" {
|
||||
/*
|
||||
* 页读取就绪判定 = WIP 轮询(与 Linux 主线 / GigaDevice 厂商驱动完全一致,
|
||||
* 单发令形状)。2026-09-20 沉降 / 13h 二次发令史实统一记于
|
||||
* GD5F2GQ5UE_Trap_Records.md Trap 05。
|
||||
* GD5F2GQ5UE_Trap_Records.md TRAP-GD5F-05。
|
||||
*/
|
||||
#define GD5F_TOTAL_BLOCKS 2048
|
||||
#define GD5F_TOTAL_SIZE (GD5F_TOTAL_BLOCKS * GD5F_BLOCK_SIZE)
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
#define FTL_NUM_BLOCKS (GD5F_TOTAL_BLOCKS - FTL_START_BLOCK)
|
||||
#define FTL_START_PAGE (FTL_START_BLOCK * GD5F_PAGES_PER_BLOCK)
|
||||
|
||||
/* dhara 几何字面量的**单一真源**(Trap 07 遗留 3 的收口):disk_initialize 与
|
||||
/* dhara 几何字面量的**单一真源**(TRAP-GD5F-07 遗留 3 的收口):disk_initialize 与
|
||||
* 下方守卫都取这两个宏,不再各写一遍 11 / 6。 */
|
||||
#define FTL_LOG2_PAGE_SIZE 11u
|
||||
#define FTL_LOG2_PPB 6u
|
||||
@@ -222,7 +222,7 @@ int dhara_nand_prog(const struct dhara_nand *n, dhara_page_t p, const uint8_t *d
|
||||
/* 编程正确性以 P_FAIL 状态位(gd5f_program_exec 内检查)+ 读时 ECC +
|
||||
* journal 读时门(magic/CRC)为准;数据路径不做整页回读比对——
|
||||
* 2026-09-20 曾加回读校验(GD5F_PROG_VERIFY),2026-09-21 经评估整体
|
||||
* 移除(依据见 docs/内存管理/存储栈RAM优化调研.md 与 GD5F Trap Records Trap 05) */
|
||||
* 移除(依据见 docs/内存管理/存储栈RAM优化调研.md 与 GD5F Trap Records TRAP-GD5F-05) */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
RETRACTED 2026-09-22 bench artifacts (TC-NET-604 'freeze' campaign).
|
||||
Their 'STALL/WEDGE' verdicts were artifacts: (1) in-firmware non-echoing readers (Phase 9/11, probe) ate the peer's bytes; (2) probe_classify.py mode A/C misreported passing runs as STALL.
|
||||
TC-NET-604 is CLOSED as NOT-A-DEFECT (see docs/问题记录/CH395F_Trap_Records.md Trap 21).
|
||||
TC-NET-604 is CLOSED as NOT-A-DEFECT (see docs/问题记录/CH395F_Trap_Records.md TRAP-NET-21).
|
||||
Do NOT use these recipes/verdicts for freeze detection.
|
||||
Trustworthy tools (kept one level up): ftp_freeze_probe.py (real FTP path + RETR SHA-256), ftp_abort_probe.py (abort/reconnect), bench_verdict.py (script-level STEP truth).
|
||||
|
||||
+1
-1
@@ -498,7 +498,7 @@ python tools/menu_gen/gen_menu.py
|
||||
|
||||
**① 框宽 w = 最宽行 + 2 条边框**(图①)
|
||||
|
||||
一行横向构成:`边框1 | 留白2 | 文本 |(菜单行: 间距2 + ▶10)| 留白2 | 边框1`。文本宽按字体实际步进量(`lv_text_get_width`,⚠️ 见 §8.2 陷阱 1);同框各行宽度可以不同,**框宽只由最宽的一行决定**,窄行左对齐、右侧留空:
|
||||
一行横向构成:`边框1 | 留白2 | 文本 |(菜单行: 间距2 + ▶10)| 留白2 | 边框1`。文本宽按字体实际步进量(`lv_text_get_width`,⚠️ 见本文 §8.2 第 1 条(`lv_text_get_width` 的 `length=0` 陷阱));同框各行宽度可以不同,**框宽只由最宽的一行决定**,窄行左对齐、右侧留空:
|
||||
|
||||
w = max_行( PAD_L + 文本_w + [GAP + ▶_w] + PAD_R ) + 2×BORDER
|
||||
|
||||
|
||||
@@ -411,7 +411,7 @@ ECC 状态(`ECCS1:ECCS0`):`00`=无错;`01/10/11`=纠正 1/2/3 bit;`10`
|
||||
| **类型** | 功能测试 |
|
||||
| **标题** | 原语级块擦除(地址=块首页地址) |
|
||||
| **前置条件** | SPI 已初始化 |
|
||||
| **测试步骤** | `gd5f_block_erase(block)`(注意传**块编号**,内部转块首页地址,见陷阱 01) |
|
||||
| **测试步骤** | `gd5f_block_erase(block)`(注意传**块编号**,内部转块首页地址,见TRAP-GD5F-01) |
|
||||
| **通过标准** | 返回 `GD5F_OK`,无 `E_FAIL` |
|
||||
| **覆盖原则** | `gd5f_block_erase`(TRAP-GD5F-01 修复点) |
|
||||
|
||||
|
||||
+17
-3
@@ -36,7 +36,7 @@
|
||||
| **跨文档同号不同义** | `Trap 02` 在 CH395F 是"缓冲区重叠"、在 GD5F 是"测试缓冲越界";`B10` 在规划是"送检窗口"、在陷阱审计是"孤儿监听" |
|
||||
| **语义进编号 → 事实一变编号就撒谎** | `P1-x` 把严重度写进号里,而审计中大量条目事后降级(`E-59` P0→P1、dhara `is_free` P1→P2):改号则引用全断,不改则号实不符 |
|
||||
| **孤儿编号(代码有、文档无)** | `I-1`/`I-2`、`Task #32` 会话号、`P1-01~P1-09`、`TC-GD5F-1100/1101/1102`、`TC-STORAGE-06`、`TC-AH-*`、`TC-PE-*`(前两项项目已在 `docs/测试说明/实机测试实施指南.md` 自行承认) |
|
||||
| **悬空引用(引用了不存在的号)** | `Trap 19` 从未存在却被 `docs/测试说明/CH395F_Test_Guide.md` 引用;`N-5/N-8/N-19/N-30/N-31/N-32` 销项删行后仍被引用(`N-32` = 监听生命周期模块化,被 `docs/网络/` 三篇与代码注释多处引用) |
|
||||
| **悬空引用(引用了不存在的号)** | `Trap 19`(裸形;**当时的 NET 域在册表里没有这一号**——别误读成"这个坑不存在",2026-10-13 全库重排后该域确有 `TRAP-NET-19` 这条真实条目,两回事)曾被 `docs/测试说明/CH395F_Test_Guide.md` 引用;`N-5/N-8/N-19/N-30/N-31/N-32` 销项删行后仍被引用(`N-32` = 监听生命周期模块化,被 `docs/网络/` 三篇与代码注释多处引用) |
|
||||
| **同一事物多种字面** | `Trap 07` / `TRAP-07` / `陷阱 1`;`gen 181` / `gen-288` / `gen68`;`TC-NET-704` / `TC704` / `TC-203` |
|
||||
| **规范自身就不自洽** | `docs/测试说明/测试文档模板规范.md` §6.3 同一行并列 `TC-STORAGE-03`(2 位)与 `TC-RTC-001`(3 位);`docs/测试说明/测试文档模板规范.md` §6.2 已废止 `PHY` 模块码,而阶段 ID 至今仍是 `TM-PHY-01` |
|
||||
| **机器校验只覆盖一个族** | (2026-10-15 现状,2026-10-20 已由 §8.1 收口)当时 31 个 pre-commit 钩子中只有 `TC` 有 `scripts/check_test_traceability.py`,且**未挂钩子、warn-only、正则 `TC-[A-Za-z0-9]+-\d+` 匹配不到大写后缀形态**;`E/N/S/B/C/D/A/U/O/gen/Trap` 全部裸奔 |
|
||||
@@ -322,7 +322,7 @@
|
||||
| `P0-x`~`P3-x` 在册项 | `DEF-*` | 严重度转列 |
|
||||
| 设计说明 `D1~D10` | `DR-001`~`DR-010` | 数字对齐 |
|
||||
| `B0-a/b/c`、`待确认-N` | `OQ-001`… | — |
|
||||
| `Trap NN` / `陷阱 N` | `TRAP-<MOD>-<nn>` | 数字不变,补模块码 |
|
||||
| `Trap NN` / `陷阱 N` | `TRAP-<MOD>-<nn>` | 数字不变,补模块码 —— **批 4 已做(2026-10-21)**:GD5F `01~07`、RTC `01`、NET `19`/`21`;`docs/硬件平台/` 属排除语料,里面的 `Trap05` 未动(见 §8.3 批 4 说明) |
|
||||
| `H-1~H-7`、`L-1~L-4`、差距 `N-1~N-6` | `GAP-01`~`GAP-17` | 按文档内出现顺序 |
|
||||
| 实机 `A1~A8`、看门狗 `V2/V4/V5` | `SC-01`… | — |
|
||||
| 测试分层 `L0/L0.5/L1/L2/L3` | `T0/T0.5/T1/T2/T3` | 门禁 `G0~G3` 不动(两套不同尺度,不合并) |
|
||||
@@ -448,6 +448,7 @@ git grep -n '<旧字面量>' # 零残留
|
||||
|
||||
| 批 | 日期 | 族 | 旧 → 新 | 处数 / 文件 | 别名 |
|
||||
|---|---|---|---|---|---|
|
||||
| **批 4(Trap)** | 2026-10-21 | 陷阱号形态 | `Trap 01~07` → `TRAP-GD5F-01~07`、`陷阱 1` → `TRAP-RTC-01`、`Trap 21`/`Trap 19` → `TRAP-NET-21`/`TRAP-NET-19`、`见陷阱 01` → `TRAP-GD5F-01` | 23 处 / 11 文件(含 `Drivers/BSP/GD5F2GQ5UE/*` 注释 4 处、`test/board/*` 2 处) | 11 条全部带 scope;映射表即审计轨迹 `scripts/rename_maps/batch3-trap.json` |
|
||||
| **批 1** | 2026-10-20 | 代码规范条款 | `S1`~`S19` → `CODE-RULE-01`~`19` | 78 处 / 2 文件 | 18 条(scoped:`scripts/check_coding_standard.py`、`docs/代码规范/pre-commit使用说明.md`) |
|
||||
| **批 3(口径)** | 2026-10-21 | 主机侧单测归属 | 建 9 族 `TC-HOST-*`(代码即属主)+ `subitem_ok` + `snapshot_only` + 补 README 属主 + `T-x` 入别名 | 判据与注册表改动,未改任何存量号 | 见 §8.1 口径修正记录 |
|
||||
| **批 2** | 2026-10-20 | 测试用例模块码 | 16 个码 → 单词化(见 §6) | 1,146 处 / 约 30 文件 | 全局别名(字面量已完全限定,无歧义) |
|
||||
@@ -457,6 +458,18 @@ git grep -n '<旧字面量>' # 零残留
|
||||
|
||||
---
|
||||
|
||||
**批 4 刻意不改的三处(写清楚,别被当成漏网)**
|
||||
|
||||
- `docs/环境与部署/并行任务工作树方案.md` 里的 `wip/trap22-fix` 是 **git 分支名**,不是编号——
|
||||
这类「非编号字面量」要靠**类型识别**处理(与位号 `T1`、IEEE 负序 `S2`、gitlint 规则 ID 同一批),
|
||||
不靠白名单硬豁免,也不许为它改分支名。
|
||||
- `docs/UI设计/菜单页面设计.md` 的变更记录行「陷阱 3」按 §8.1 冻结不改写;正文里指向本文自己小节的
|
||||
那处(原「见 §8.2 陷阱 1」)**本来就不是 `TRAP-*` 族的号**,已改写成
|
||||
「见本文 §8.2 第 1 条(`lv_text_get_width` 的 `length=0` 陷阱)」——引用要能当问题读,
|
||||
不必为两处文档内自指另立一族。
|
||||
- `docs/硬件平台/` 网表分析报告里 6 处 `Trap05`(语义 = `TRAP-NET-05`)留在排除语料里不动,
|
||||
盲区已登记进 `id_registry.json` 的 TRAP 族 `cursor_note`。
|
||||
|
||||
### 8.4 债务台账与增量拦截(2026-10-21 关闸)
|
||||
|
||||
**为什么不照 §8 原节奏「清零后再 `--strict`」**:存量 710 处(② 形态迁移 398 + ⑥ 裸引写全属主 269 + ③ 真悬空 44),
|
||||
@@ -474,7 +487,7 @@ git grep -n '<旧字面量>' # 零残留
|
||||
| 初始化 | `--write-backlog` 全量快照(关闸那次用过;之后再跑等于豁免新债,须显式确认) |
|
||||
| `--only` 与 `--strict` | **互斥**(局部扫描不能当门禁结论),同时给直接返回 2 |
|
||||
| 缺台账 | `--strict` 直接返回 2 并提示先生成,**绝不退化成「一次性拦死全部存量」**(那样必然逼人 `--no-verify`) |
|
||||
| 台账自身不得当语料 | 关闸第一次提交就被自己的台账咬了:`id_known_backlog.json` 里必然写着 `P1-3` / `Trap 05` 这些号,扫描器当成新引用 → 报 10 类新账、提交被拦。已把台账加入 `excluded_paths`(与 `id_aliases.json` / `id_registry.json` 同一条道理:**登记号的表不是引用号的文档**) |
|
||||
| 台账自身不得当语料 | 关闸第一次提交就被自己的台账咬了:`id_known_backlog.json` 里必然写着 `P1-3` / `Trap 05` 这些号,扫描器当成新引用 → 报 10 类新账、提交被拦。已把台账加入 `excluded_paths`(与 `id_aliases.json` / `id_registry.json` 同一条道理:**登记号的表不是引用号的文档**。第 4 次同样自循环:改名映射表 `scripts/rename_maps/batch3-trap.json` 里必然写着 `Trap 21` / `陷阱 1` 这些旧形态,关闸后第一次提交就被它自己拦下 6 类「新账」→ 整个 `scripts/rename_maps/` 目录一并入 `excluded_paths`(它是审计轨迹,不是引用语料) |
|
||||
|
||||
**关闸验收(三例,2026-10-21 实测)**:
|
||||
|
||||
@@ -521,6 +534,7 @@ git grep -n '<旧字面量>' # 零残留
|
||||
|---|---|---|
|
||||
| 2026-10-14 | 新增 P-7 与引用可读性规则 | §2 加 **P-7「编号不语义,引用必语义」**(编号本体保持无语义并冻结,但正文引用必须带语义括注、禁裸 ID 独担信息)→ 六条原则变**七条**;§5.1 加前置步"先问能不能不加号";新增 **§5.6「编号密集文档的对照节(强制)」**(≥3 个编号族必须加「导读:编号与术语」);§4.1 补登记 **`E\d+`**(N34 自愈实验编号族,已封闭)并把 `N-\d{2}` 的在册范围订正为「曾用最大 `N-33`,现存至 `N-29`」;§1.2 悬空引用示例补 `N-32`;§7.1 同步订正。起因:`docs/网络/网络自愈架构设计.md` 合并与导读节实践暴露"裸编号引用不可读",用户裁定以后尽量用语义标识 |
|
||||
| (规划稿) | 建立本文档 | 全库扫描 1,385 个不同编号 / 19,306 处出现后定稿的两层编号体系(全局编号 + 文档内编号)、六条原则、目标前缀总表、三批迁移映射与 `check_ids.py` 门禁设计;用户决策:`E-xx` 冻结保留、严重度档位词 `P0~P3` 不变、文档落 `docs/编号规范.md`、阶段 1 三批全做 |
|
||||
| 2026-10-21 | **批 4:陷阱号统一(② 清的第一族)** | 23 处 / 11 文件:`Trap 01~07` → `TRAP-GD5F-01~07`(属主文档 7 个标题行从此成为定义位)、`陷阱 1` → `TRAP-RTC-01`、`Trap 21`/`Trap 19` → `TRAP-NET-21`/`TRAP-NET-19`;UI 文档自指改写成平实语言。别名 11 条全部带 scope。改名后 `TRAP-GD5F-01/05/06` 三处历史悬空引用自动落地为已定义;三处刻意不改与 `docs/硬件平台/` 盲区写进 §8.3 批 4 |
|
||||
| 2026-10-21 | **关闸:`id-check` 转增量拦截** | `check_ids.py` 新增 `--write-backlog` / `--prune-backlog` 与按台账比对的 `--strict`(指纹 = 文件 + 校验号 + 字面量 + 计数,**不含行号**);生成 `scripts/id_known_backlog.json`(340 条覆盖 710 处存量);钩子 `entry` 加 `--strict`。验收三例:新字面量拦、同号计数增长拦、干净态放行,全通过。新增 §8.4 说明机制与「为什么不照清零再升 strict 的原节奏」 |
|
||||
| 2026-10-21 | **追溯脚本同口径对齐** | `check_test_traceability.py` 差异定义改为 DOC-ONLY / CODE-ONLY / IN-CODE 三档(真差异 45 = 38 + 7;弱保证 238 单列示数);顺带修 `TC_RE` 模块码上界 `{0,4}`→`{0,8}`——**同一个坑第二次踩**(代码侧一度从 556 缩到 217),已写进 §8.1 |
|
||||
| 2026-10-21 | **B 层口径落地(批 3)** | 主机侧单测 118 号实测在代码目录外零消费者 → 建 9 族 `TC-HOST-*` 认代码为属主登记处(不逐号补文档);新增 `subitem_ok`(小写子项后缀母号在册即算已定义)、`snapshot_only`(§4.3 冻结快照族不参与定义位优先)、`allow_orphans` 旗标与 `excluded_paths` 补两项;补 `docs/任务规划/README.md` 为 `N`/`S-LDG`/`T-LDG` 属主(**我的配置漏项,曾误判 74 处真条目悬空**);`T-2`/`T-3`/`T-4`/`T-6` 入别名表标 `void`。错误级 1318 → 711(其中 504 处属口径修正、74 处属修 bug,**真正变好 0 处**)。新增 §8.1 口径修正记录表 |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# GD5F2GQ5UE 陷阱记录
|
||||
|
||||
## Trap 01 — 块擦除地址错误(有效)
|
||||
## TRAP-GD5F-01 — 块擦除地址错误(有效)
|
||||
|
||||
**发现时间**:2026-07-21
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
- 块擦除不使用 `block × block_size`(字节偏移),而用块首页地址
|
||||
- 芯片手册的 memory mapping 必须严格遵守
|
||||
|
||||
## Trap 02 — 测试缓冲越界导致跨页比对误判(有效)
|
||||
## TRAP-GD5F-02 — 测试缓冲越界导致跨页比对误判(有效)
|
||||
|
||||
**发现时间**:2026-08-26
|
||||
|
||||
@@ -64,7 +64,7 @@ static uint8_t s_rbuf[GD5F_PAGE_SIZE * 2];
|
||||
- 任何“跨页 / 大于单页”的读写测试,缓冲必须按**实际长度上限**而非单页大小分配
|
||||
- 越界写会污染相邻全局变量,可能引起其它用例莫名失败,定位时优先怀疑缓冲尺寸
|
||||
|
||||
## Trap 03 — 驱动读写擦缺越界检查(有效 / 健壮性缺口)
|
||||
## TRAP-GD5F-03 — 驱动读写擦缺越界检查(有效 / 健壮性缺口)
|
||||
|
||||
**发现时间**:2026-08-26
|
||||
|
||||
@@ -90,19 +90,19 @@ if (offset < 0 || (unsigned long)offset + size > (unsigned long)GD5F_TOTAL_SIZE)
|
||||
**验证结果**:
|
||||
- TC-GD5F-1001 read/write 越界均被拒绝(ret=-1),测试 PASS
|
||||
- TC-GD5F-1002 size=0 仍返回 `GD5F_OK`(offset 合法且 size=0 不越界),符合预期
|
||||
- 该检查还顺带逮到 Trap 04 的测试越界擦除(见下)
|
||||
- 该检查还顺带逮到 TRAP-GD5F-04 的测试越界擦除(见下)
|
||||
|
||||
**经验教训**:
|
||||
- 面向字节偏移的裸 NAND 接口必须做容量边界检查,调用方传错参数时尽早失败
|
||||
- 无越界检查的驱动容易“静默回绕”,问题极难定位
|
||||
|
||||
## Trap 04 — gd5f_find_run 返回语义与多块擦除窗口错位(测试 bug)
|
||||
## TRAP-GD5F-04 — gd5f_find_run 返回语义与多块擦除窗口错位(测试 bug)
|
||||
|
||||
**发现时间**:2026-08-26
|
||||
|
||||
**现象**:
|
||||
TC-GD5F-402 多块擦除(`gd5f_find_run(3)` 后擦 3 块)返回 `ret=-1`。
|
||||
经 Trap 03 的边界检查定位:实际要擦的块超出了设备末尾。
|
||||
经 TRAP-GD5F-03 的边界检查定位:实际要擦的块超出了设备末尾。
|
||||
|
||||
**根因**:
|
||||
`gd5f_find_run(n)` 原实现返回的是**连续好块的末尾块号** `top`
|
||||
@@ -133,7 +133,7 @@ if (ok) {
|
||||
调用方与实现必须一致
|
||||
- 这类错位 bug 往往只在“区间贴到设备边界”时才触发,正常情况能过,建议测试覆盖边界块
|
||||
|
||||
## Trap 05 — FatFs 探针文件名非法 → 无限重格式化(已修复,2026-09-20)
|
||||
## TRAP-GD5F-05 — FatFs 探针文件名非法 → 无限重格式化(已修复,2026-09-20)
|
||||
|
||||
**发现时间**:2026-09-20(症状自卷健康探针引入之日起长期存在)
|
||||
|
||||
@@ -197,7 +197,7 @@ if (ok) {
|
||||
- 探针自身也可能有 bug:错误码要记录"是哪次调用返回的 + 枚举语义"——
|
||||
本例 fr=6 在日志里挂了几十个 boot 没人查过枚举表
|
||||
|
||||
## Trap 06 — 轮询路径"伪完成":HAL 失败被伪装成操作完成(已修复,2026-10-03)
|
||||
## TRAP-GD5F-06 — 轮询路径"伪完成":HAL 失败被伪装成操作完成(已修复,2026-10-03)
|
||||
|
||||
**发现时间**:2026-10-03(错误码传播审计 E-10/E-42/E-53/E-54/E-56/E-57 复核 + 台架套件回归)
|
||||
|
||||
@@ -232,7 +232,7 @@ if (ok) {
|
||||
保护既有好副本比刷新更重要;
|
||||
- 使能类配置(ECC)必须**回读校验**,不能只信写命令的返回。
|
||||
|
||||
## Trap 07 — dhara 移植层:`is_free` 只看页首 + HAL 无几何校验(已修复,2026-10-15)
|
||||
## TRAP-GD5F-07 — dhara 移植层:`is_free` 只看页首 + HAL 无几何校验(已修复,2026-10-15)
|
||||
|
||||
**发现时间**:2026-10-15(`项目审查与优化建议报告.md` N-12 / N-13 复核,登记簿原 N-21)
|
||||
|
||||
@@ -249,7 +249,7 @@ if (ok) {
|
||||
加完 `FTL_START_BLOCK` 偏移送进 SPI 命令后,被芯片地址位**截断成某个真实页**
|
||||
→ 静默读写、甚至把无辜页的数据 GC 搬走。
|
||||
|
||||
**与 Trap 03 的关系(本条的核心教训)**:Trap 03 已为**裸驱动字节偏移 API**
|
||||
**与 TRAP-GD5F-03 的关系(本条的核心教训)**:TRAP-GD5F-03 已为**裸驱动字节偏移 API**
|
||||
(`gd5f2gq5ue_read/write/erase`)补过容量检查,但**dhara 移植层是另一个入口**,同一教训在那儿
|
||||
原样重演。边界校验必须**逐层**做——"下层查过了"推不出"上层调用也安全",何况本例下层查的是
|
||||
字节偏移、上层传的是页号,两者根本不是同一个量。
|
||||
@@ -267,7 +267,7 @@ if (ok) {
|
||||
- 无错误通道的两个函数取**保守值**:`is_free` 越界返回 0(判非空,最多少用一页)、
|
||||
`is_bad` 越界返回 1(判坏,绝不读写)、`mark_bad` 越界直接返回(绝不标无辜好块)。
|
||||
- `is_free` 内 `gd5f_page_read` / `gd5f_read_from_cache` 任一失败 → 返回 0
|
||||
(Trap 06 同族:读失败**不得**伪装成"空闲")。
|
||||
(TRAP-GD5F-06 同族:读失败**不得**伪装成"空闲")。
|
||||
|
||||
**验证**:
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# SD2506API-G 陷阱记录 (Trap Records)
|
||||
|
||||
## 陷阱 1:KEIL/ARMCC 下十六进制字面量 `H` 后缀被编译为 0(严重)
|
||||
## TRAP-RTC-01:KEIL/ARMCC 下十六进制字面量 `H` 后缀被编译为 0(严重)
|
||||
|
||||
### 现象
|
||||
SD2506 RTC 时间写不进去:`sd2506_set_time()` 返回 OK,但回读 / 示波器 / 重启后时间不更新。
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|------|------|-----------|-----------------|
|
||||
| 项目结构 | **A−** | 六层分层真实可执行、命名一致、门禁到位;反向依赖控制在 4 处 | `NETCFG`/`UI` 语义层错位(S-1)、4 处裸 `extern`(S-2)、`rs485_task.c` 仍在注册白名单里等 B2 |
|
||||
| 文档分布 | **A−** | 工程文档 **87 篇 / 30,781 行**(2026-10-15 随 `错误码传播审计.md` 删除而 −1 篇 / −635 行),`docs/README.md` 索引 + `docs/文档规范.md` + 三档一致性门禁全部落地,`check_doc_links --all` = 0 失效 | **D-1**:`docs/` 占仓库 **71.8%**、手册图片 **36.3 MB**、`.git` 已 **235 MB**(已决策暂不处理,登记观察) |
|
||||
| 模块设计 | **A−** | 看门狗(IWDG + 心跳位图 + 4 个 Fault 现场 + `.noinit`)、就绪屏障、卷锁、FTP 鉴权、`Error_Handler` 自恢复、ADC 全链均已落地;**原列的 dhara 移植层两处缺陷(N-12/N-13)与日志逐条开关(N-16)已于 2026-10-15 修复** → `GD5F2GQ5UE_Trap_Records.md` Trap 07、`../架构设计/STM32F4-Base存储架构说明.md` §5.3、`../子系统设计/运行与自检记录设计说明.md` §4.4/§4.5 | 驱动层无统一错误码约定(S-5)、RS485 无协议栈(随 B2 暂缓) |
|
||||
| 模块设计 | **A−** | 看门狗(IWDG + 心跳位图 + 4 个 Fault 现场 + `.noinit`)、就绪屏障、卷锁、FTP 鉴权、`Error_Handler` 自恢复、ADC 全链均已落地;**原列的 dhara 移植层两处缺陷(N-12/N-13)与日志逐条开关(N-16)已于 2026-10-15 修复** → `GD5F2GQ5UE_Trap_Records.md` TRAP-GD5F-07、`../架构设计/STM32F4-Base存储架构说明.md` §5.3、`../子系统设计/运行与自检记录设计说明.md` §4.4/§4.5 | 驱动层无统一错误码约定(S-5)、RS485 无协议栈(随 B2 暂缓) |
|
||||
| 内存使用 | **B+** | 堆迁 CCM + 栈/堆三面观测常开 + `mem-budget` 92% 门禁 + 预算台账与趋势基线;**R-9 已落地(2026-10-15)→ SRAM1 由 74.9% 降到 56.1%;同日移植层与日志修复 +1.6 KB → 现 **57.4%(余 55,840 B)**,不再是卡点** | **内存优化簇已整簇暂缓**(用户裁定 2026-10-15):R-2 后半(待迁 29,570 B → CCM,只差缩堆 56→32 KB)与 R-3 / R-4 / R-6 不再排期,理由与重开条件见 §5.3;**当前真正的约束是 CCM 只剩 7,904 B**——加任务 / 抬栈 / 加堆会先在这里撞墙,届时按 §5.3 重开;MicroLIB 512 B C 堆仍无机械检查(§5.5) |
|
||||
| Flash 使用 | **A−** | F-1/F-2/F-3 落地省 64,576 B → 占用 **22.2%(232,280 B)** | F-4/F-5/F-6 ≈10 KB + 编译时长(§5.4) |
|
||||
| UI 标准化 | **B+** | W6 第一波已落地(2026-10-15):**L0 设计令牌层** `ui_tokens.h` 建成、**L2 页面注册表** `ui_page_registry.{c,h}` 由生成器产出并**删除了手写 `case` 分发**、`font-charset` 钩子 + `registration-check` 第 ④ 类接线校验上线、字体子集瘦身 −80 B | L1 组件库已起步(U2 首个 `ui_w_records`,2026-10-20),但仅此 1 个组件、**目标页未落地**(现存 7 个 `ui_page_*.c`)、**golden 像素回归已于 2026-10-20 挂入提交门禁**(`ui-golden`)、`ui_w_form` 推迟 U5(§6) |
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
| `section_aliases.json` | (被 `check_doc_links.py` 读) | 文档**昵称别名表**:「内存方案」→ `docs/内存管理/RAM使用分析与优化方案.md`。只登记无歧义昵称;登记一次即把该昵称的引用纳入硬门禁 |
|
||||
| `check_ids.py` | `id-check` | **编号门禁**:`docs/编号规范.md` §8 的八项校验(未登记前缀 / 形态 / 悬空 / 重复定义 / 越游标 / 未紧邻文档名 / 孤儿 / 可判定比例)。**warn-only**,`--strict` 才拦提交;比例跌破基线任何模式都失败。详表 → `docs/代码规范/pre-commit使用说明.md` §2.25 |
|
||||
| `id_registry.json` | (被 `check_ids.py` 读) | 前缀族**注册表**:属主登记处 / 形态正则 / 冻结 / 游标,逐项来自 `docs/编号规范.md` §4;`decidable_ratio_baseline` = 校验 8 的基线(只许涨)。与 `section_aliases.json` 同一套"别名表 + 可判定比例"范式 |
|
||||
| `id_aliases.json` | (被 `check_ids.py` 读) | 编号**别名/作废表**:旧字面量 → 现行字面量或 `status: void`(如 `N-32` 销项后仍被引用、`Trap 19` 从未存在、模块码 `PHY→NET`) |
|
||||
| `id_aliases.json` | (被 `check_ids.py` 读) | 编号**别名/作废表**:旧字面量 → 现行字面量或 `status: void`(如 `N-32` 销项后仍被引用、`T-4` 随销项永久作废、模块码 `PHY→NET`) |
|
||||
| `check_test_traceability.py` | (被 `id-check` 顺带调用) | **TC 用例双向追溯**:文档 ↔ 代码两侧的 TC 编号集合比对;2026-10-20 起范围扩到 `test/host/` 与 7 篇「单元测试说明.md」(`--board-only` 回退旧板级口径)。此前该脚本**未挂任何钩子** |
|
||||
| `gen_task_table.py` | `task-table` | FreeRTOS 任务表以 `Src/freertos.c` 为**唯一事实源**生成/校验(D-2/D-7) |
|
||||
| `check_mem_numbers.py` | `mem-numbers` | 内存/Flash 数字以 `.map` 为唯一事实源校验(D-7 体积档) |
|
||||
|
||||
+147
-6
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"generated_from": "docs/编号规范.md §7 迁移映射 + §4.3 冻结前缀;本表只登记**仓库里已实际出现**的旧字面量 → 现行字面量,不做尚未落地的批量改写(§7.2 阶段 1 一律保留存量)",
|
||||
"note": "旧号引用不因本表而改写:本表只让门禁把「旧号引用」判成可解析(校验 3 悬空引用 / 校验 4 重复定义)。批量改写属 §9 阶段 1,须逐批 dry-run + 三重复核(§7.3)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。",
|
||||
"note": "旧号引用不因本表而改写:本表只让门禁把「旧号引用」判成可解析(校验 3 悬空引用 / 校验 4 重复定义)。批量改写属 §9 阶段 1,须逐批 dry-run + 三重复核(§7.3)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。 带 scope 的条目只在所列文件内生效(同一裸形字面量可能属多族,全局别名会把真撞号洗成已解析)。",
|
||||
"aliases": {
|
||||
"N-31": {
|
||||
"to": null,
|
||||
@@ -23,11 +23,22 @@
|
||||
"status": "resolved-in-place",
|
||||
"note": "sock_reset 原语收口受阻项:登记簿行仍在(2026-10-14 建档),编号规范 §4.1 误记为已销项 → 以登记簿为准"
|
||||
},
|
||||
"Trap 19": {
|
||||
"to": null,
|
||||
"status": "void",
|
||||
"note": "从未存在的陷阱号被 docs/测试说明/CH395F_Test_Guide.md 引用(§1.2 / §7.2:删除或改指实际条目)"
|
||||
},
|
||||
"Trap 19": [
|
||||
{
|
||||
"to": null,
|
||||
"status": "void",
|
||||
"note": "从未存在的陷阱号被 docs/测试说明/CH395F_Test_Guide.md 引用(§1.2 / §7.2:删除或改指实际条目)"
|
||||
},
|
||||
{
|
||||
"to": "TRAP-NET-19",
|
||||
"status": "renamed",
|
||||
"note": "NET(CH395F)域:Trap 21 → TRAP-NET-21、Trap 19 → TRAP-NET-19;两处引用的都是 CH395F_Trap_Records.md 这个活登记处,号本身不变(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"MDK-ARM/retracted_bench_20260922/README.txt",
|
||||
"scripts/README.md"
|
||||
]
|
||||
}
|
||||
],
|
||||
"PHY": {
|
||||
"to": "NET",
|
||||
"status": "module-code",
|
||||
@@ -2688,6 +2699,136 @@
|
||||
"to": null,
|
||||
"status": "void",
|
||||
"note": "2026-10-02 版复审专项条目号(docs/任务规划/测试与架构专项.md 卷首声明「编号不随条目删除而回收」)。该条目已按「完成即销项」删行,仓内现存 T-1 仍在册;引用本号的 .dsh/skills 脚本与 test/ 文档属**引用未清**(§5.5 只做了一半)。本条只让门禁停止把它当自造号并如实指路:改写成语义标识(§3.3)或写全出处,**不要新发一个 T-2 号**(号不回收)"
|
||||
},
|
||||
"Trap 01": {
|
||||
"to": "TRAP-GD5F-01",
|
||||
"status": "renamed",
|
||||
"note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"docs/问题记录/项目审查与优化建议报告.md",
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h",
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"test/board/gd5f_test_task.c",
|
||||
"test/board/storage_test_task.c"
|
||||
]
|
||||
},
|
||||
"Trap 02": {
|
||||
"to": "TRAP-GD5F-02",
|
||||
"status": "renamed",
|
||||
"note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"docs/问题记录/项目审查与优化建议报告.md",
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h",
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"test/board/gd5f_test_task.c",
|
||||
"test/board/storage_test_task.c"
|
||||
]
|
||||
},
|
||||
"Trap 03": {
|
||||
"to": "TRAP-GD5F-03",
|
||||
"status": "renamed",
|
||||
"note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"docs/问题记录/项目审查与优化建议报告.md",
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h",
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"test/board/gd5f_test_task.c",
|
||||
"test/board/storage_test_task.c"
|
||||
]
|
||||
},
|
||||
"Trap 04": {
|
||||
"to": "TRAP-GD5F-04",
|
||||
"status": "renamed",
|
||||
"note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"docs/问题记录/项目审查与优化建议报告.md",
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h",
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"test/board/gd5f_test_task.c",
|
||||
"test/board/storage_test_task.c"
|
||||
]
|
||||
},
|
||||
"Trap 05": {
|
||||
"to": "TRAP-GD5F-05",
|
||||
"status": "renamed",
|
||||
"note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"docs/问题记录/项目审查与优化建议报告.md",
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h",
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"test/board/gd5f_test_task.c",
|
||||
"test/board/storage_test_task.c"
|
||||
]
|
||||
},
|
||||
"Trap 06": {
|
||||
"to": "TRAP-GD5F-06",
|
||||
"status": "renamed",
|
||||
"note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"docs/问题记录/项目审查与优化建议报告.md",
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h",
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"test/board/gd5f_test_task.c",
|
||||
"test/board/storage_test_task.c"
|
||||
]
|
||||
},
|
||||
"Trap 07": {
|
||||
"to": "TRAP-GD5F-07",
|
||||
"status": "renamed",
|
||||
"note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"docs/问题记录/项目审查与优化建议报告.md",
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h",
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"test/board/gd5f_test_task.c",
|
||||
"test/board/storage_test_task.c"
|
||||
]
|
||||
},
|
||||
"陷阱 01": {
|
||||
"to": "TRAP-GD5F-01",
|
||||
"status": "renamed",
|
||||
"note": "同一属主的中文形「见陷阱 01」→ 与空格形合并成同一个号(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md"
|
||||
]
|
||||
},
|
||||
"陷阱 1": {
|
||||
"to": "TRAP-RTC-01",
|
||||
"status": "renamed",
|
||||
"note": "SD2506(RTC 芯片)域:陷阱 1 → TRAP-RTC-01(§4.2 该域按 RTC 编号)(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"docs/问题记录/SD2506_Trap_Records.md"
|
||||
]
|
||||
},
|
||||
"Trap 21": {
|
||||
"to": "TRAP-NET-21",
|
||||
"status": "renamed",
|
||||
"note": "NET(CH395F)域:Trap 21 → TRAP-NET-21、Trap 19 → TRAP-NET-19;两处引用的都是 CH395F_Trap_Records.md 这个活登记处,号本身不变(scripts/rename_ids.py 批:族 TRAP)|旧号仅在本批 scope 内指向新号;scope 外同字面量属其它族,不受本条影响",
|
||||
"scope": [
|
||||
"MDK-ARM/retracted_bench_20260922/README.txt",
|
||||
"scripts/README.md"
|
||||
]
|
||||
}
|
||||
},
|
||||
"id_aliases": {}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"schema": 1,
|
||||
"note": "编号债务台账(docs/编号规范.md §8.4):--strict 只对**台账之外**的新错误级问题拦提交。台账只许减不许增——还清的用 --prune-backlog 收掉;确需新增一条必须写 reason 字段说明这笔债为什么该存在,默认禁止顺手加行(否则一周后台账就变成第二个 backlog)。指纹 = 文件 + 校验号 + 字面量,不含行号(行号会漂,用它台账天天假新增)。",
|
||||
"generated_by": "scripts/check_ids.py --write-backlog",
|
||||
"total_error_findings": 710,
|
||||
"decidable_ratio_at_generation": 82.73,
|
||||
"total_error_findings": 632,
|
||||
"decidable_ratio_at_generation": 82.99,
|
||||
"entries": [
|
||||
{
|
||||
"file": ".dsh/skills/serial-assistant/scripts/serial_tool.py",
|
||||
@@ -119,48 +119,12 @@
|
||||
"literal": "P2-9",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"file": "App/task/adc_task.c",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 8
|
||||
},
|
||||
{
|
||||
"file": "App/task/adc_task.c",
|
||||
"code": 6,
|
||||
"literal": "P0-2",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "App/task/adc_task.c",
|
||||
"code": 6,
|
||||
"literal": "P1-5",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"file": "App/task/adc_task.c",
|
||||
"code": 6,
|
||||
"literal": "P3-11",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "App/task/adc_task.h",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "App/task/adc_task.h",
|
||||
"code": 6,
|
||||
"literal": "P1-5",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "App/task/default_task.c",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"file": "App/task/default_task.c",
|
||||
"code": 6,
|
||||
@@ -179,12 +143,6 @@
|
||||
"literal": "I-1",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "App/task/net_task.c",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "App/task/net_task.c",
|
||||
"code": 6,
|
||||
@@ -221,30 +179,6 @@
|
||||
"literal": "P3-11",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "App/task/ui_task.c",
|
||||
"code": 2,
|
||||
"literal": "P1-4a",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "App/task/ui_task.c",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 3
|
||||
},
|
||||
{
|
||||
"file": "App/util/task_prof.c",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "App/util/task_prof.h",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Drivers/BSP/CH395F/ch395f.c",
|
||||
"code": 6,
|
||||
@@ -263,30 +197,6 @@
|
||||
"literal": "P2-2",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c",
|
||||
"code": 2,
|
||||
"literal": "Trap 05",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h",
|
||||
"code": 2,
|
||||
"literal": "Trap 05",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"code": 2,
|
||||
"literal": "Trap 05",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"code": 2,
|
||||
"literal": "Trap 07",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Drivers/BSP/NET/net_select.c",
|
||||
"code": 6,
|
||||
@@ -329,30 +239,6 @@
|
||||
"literal": "I-2",
|
||||
"count": 3
|
||||
},
|
||||
{
|
||||
"file": "Drivers/BSP/UI/ui_net_sink.c",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "MDK-ARM/retracted_bench_20260922/README.txt",
|
||||
"code": 2,
|
||||
"literal": "Trap 21",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Src/freertos.c",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Src/freertos.c",
|
||||
"code": 6,
|
||||
"literal": "P1-5",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Src/freertos.c",
|
||||
"code": 6,
|
||||
@@ -365,18 +251,6 @@
|
||||
"literal": "P2-13",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Src/main.c",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "Src/main.c",
|
||||
"code": 6,
|
||||
"literal": "P1-5",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "docs/CI/远程CI完整指南.md",
|
||||
"code": 2,
|
||||
@@ -437,12 +311,6 @@
|
||||
"literal": "P1-3",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/UI设计/菜单页面设计.md",
|
||||
"code": 2,
|
||||
"literal": "陷阱 1",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/UI设计/菜单页面设计.md",
|
||||
"code": 2,
|
||||
@@ -623,12 +491,6 @@
|
||||
"literal": "R-4",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/内存管理/存储栈RAM优化调研.md",
|
||||
"code": 3,
|
||||
"literal": "TRAP-GD5F-05",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/内存管理/存储栈RAM优化调研.md",
|
||||
"code": 6,
|
||||
@@ -677,30 +539,6 @@
|
||||
"literal": "P2-8",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/子系统设计/ADC采样节拍设计说明.md",
|
||||
"code": 2,
|
||||
"literal": "Task #32",
|
||||
"count": 6
|
||||
},
|
||||
{
|
||||
"file": "docs/子系统设计/ADC采样节拍设计说明.md",
|
||||
"code": 6,
|
||||
"literal": "P0-1",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "docs/子系统设计/ADC采样节拍设计说明.md",
|
||||
"code": 6,
|
||||
"literal": "P0-2",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "docs/子系统设计/ADC采样节拍设计说明.md",
|
||||
"code": 6,
|
||||
"literal": "P1-5",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"file": "docs/子系统设计/IEC104上行设计说明.md",
|
||||
"code": 2,
|
||||
@@ -923,24 +761,6 @@
|
||||
"literal": "TC-704",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"code": 2,
|
||||
"literal": "陷阱 01",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"code": 3,
|
||||
"literal": "TRAP-GD5F-01",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"code": 3,
|
||||
"literal": "TRAP-GD5F-06",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/测试说明/串口助手设计说明.md",
|
||||
"code": 2,
|
||||
@@ -1133,66 +953,12 @@
|
||||
"literal": "round 1",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"code": 2,
|
||||
"literal": "Trap 01",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"code": 2,
|
||||
"literal": "Trap 02",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"code": 2,
|
||||
"literal": "Trap 03",
|
||||
"count": 4
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"code": 2,
|
||||
"literal": "Trap 04",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"code": 2,
|
||||
"literal": "Trap 05",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"code": 2,
|
||||
"literal": "Trap 06",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"code": 2,
|
||||
"literal": "Trap 07",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"code": 2,
|
||||
"literal": "gen 45",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/SD2506_Trap_Records.md",
|
||||
"code": 2,
|
||||
"literal": "陷阱 1",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/项目审查与优化建议报告.md",
|
||||
"code": 2,
|
||||
"literal": "Trap 07",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "docs/问题记录/项目审查与优化建议报告.md",
|
||||
"code": 2,
|
||||
@@ -1253,12 +1019,6 @@
|
||||
"literal": "P2-9",
|
||||
"count": 2
|
||||
},
|
||||
{
|
||||
"file": "scripts/README.md",
|
||||
"code": 2,
|
||||
"literal": "Trap 19",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "scripts/README.md",
|
||||
"code": 6,
|
||||
@@ -1481,12 +1241,6 @@
|
||||
"literal": "P1-09",
|
||||
"count": 5
|
||||
},
|
||||
{
|
||||
"file": "test/board/gd5f_test_task.c",
|
||||
"code": 2,
|
||||
"literal": "Trap 05",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "test/board/gd5f_test_task.c",
|
||||
"code": 3,
|
||||
@@ -1511,12 +1265,6 @@
|
||||
"literal": "P1-9",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "test/board/storage_test_task.c",
|
||||
"code": 2,
|
||||
"literal": "Trap 05",
|
||||
"count": 1
|
||||
},
|
||||
{
|
||||
"file": "test/board/test_config.h",
|
||||
"code": 6,
|
||||
|
||||
@@ -58,7 +58,8 @@
|
||||
".dsh/skills/*/scripts/state/",
|
||||
".dsh/n31_neg_inject_gen217.log",
|
||||
".dsh/n31_neg_inject_gen221_form5.log",
|
||||
"scripts/id_known_backlog.json"
|
||||
"scripts/id_known_backlog.json",
|
||||
"scripts/rename_maps/"
|
||||
],
|
||||
"excluded_suffixes": [
|
||||
".svg",
|
||||
@@ -513,7 +514,7 @@
|
||||
2
|
||||
],
|
||||
"check_dangling": true,
|
||||
"cursor_note": "分模块各自递增:NET 01~21、GD5F 01~06、RTC 01~(§4.2);NET 域 2026-10-13 已全库重排连续",
|
||||
"cursor_note": "分模块各自递增:NET 01~21(属主 docs/问题记录/CH395F_Trap_Records.md)、GD5F 01~07(GD5F2GQ5UE_Trap_Records.md)、RTC 01(SD2506_Trap_Records.md)。批 4(2026-10-21)已把空格形 `Trap NN` 与中文形 `陷阱 N` 统一成 `TRAP-<MOD>-<nn>`,数字不变、只补模块码(§7.1)。**已知盲区(登记而非静默放过)**:docs/硬件平台/V0.0_网表详细分析报告.md(5 处)与 V0.1_网表详细分析报告.md(1 处)里的 `Trap05` 语义确指 `TRAP-NET-05`(CH395F 与 RTL8305 自动协商不兼容),但 docs/硬件平台/ 与 docs/芯片手册/ 同为门禁语料与本工具的共同排除目录,故本批不动笔、也不声称已合规。",
|
||||
"adjacent_cues": [
|
||||
"Trap",
|
||||
"trap",
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"batch": "批 3-Trap(2026-10-21)",
|
||||
"applied_by": "scripts/rename_ids.py",
|
||||
"record": "docs/编号规范.md §8.3 / §7.1",
|
||||
"note": "陷阱号统一为 TRAP-<模块码>-<nn>:数字不变、只补模块码(§7.1)。作用域按文件切分,因为同一空格形在不同文件里指向不同族的属主文档——GD5F 的属主是 GD5F2GQ5UE_Trap_Records.md,README.txt/scripts/README.md 里的 Trap 21/19 指向 CH395F_Trap_Records.md(NET 域),SD2506 的中文形按 §4.2 归 RTC 域。刻意不改:docs/环境与部署/并行任务工作树方案.md:39 的 wip/trap22-fix 是分支名不是编号;docs/UI设计/菜单页面设计.md:501 的「§8.2 陷阱 1」是本文小节内第 1 条(另走平实语言改写);:896 是变更记录行(§8.1 冻结不改写)。",
|
||||
"batches": [
|
||||
{
|
||||
"family": "TRAP",
|
||||
"old": "\\bTrap (?P<n>\\d{2})\\b",
|
||||
"new": "TRAP-GD5F-{n:02d}",
|
||||
"files": [
|
||||
"docs/问题记录/GD5F2GQ5UE_Trap_Records.md",
|
||||
"docs/问题记录/项目审查与优化建议报告.md",
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c",
|
||||
"Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h",
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"test/board/gd5f_test_task.c",
|
||||
"test/board/storage_test_task.c"
|
||||
],
|
||||
"note": "GD5F 存储域:Trap 01~07 → TRAP-GD5F-01~07(属主文档 7 个标题行为定义位,其余为引用)"
|
||||
},
|
||||
{
|
||||
"family": "TRAP",
|
||||
"old": "陷阱 (?P<n>\\d{2})\\b",
|
||||
"new": "TRAP-GD5F-{n:02d}",
|
||||
"files": [
|
||||
"docs/测试说明/GD5F2GQ5UE_Test_Guide.md"
|
||||
],
|
||||
"note": "同一属主的中文形「见陷阱 01」→ 与空格形合并成同一个号"
|
||||
},
|
||||
{
|
||||
"family": "TRAP",
|
||||
"old": "陷阱 (?P<n>\\d{1,2})\\b",
|
||||
"new": "TRAP-RTC-{n:02d}",
|
||||
"files": [
|
||||
"docs/问题记录/SD2506_Trap_Records.md"
|
||||
],
|
||||
"note": "SD2506(RTC 芯片)域:陷阱 1 → TRAP-RTC-01(§4.2 该域按 RTC 编号)"
|
||||
},
|
||||
{
|
||||
"family": "TRAP",
|
||||
"old": "\\bTrap (?P<n>\\d{1,2})\\b",
|
||||
"new": "TRAP-NET-{n:02d}",
|
||||
"files": [
|
||||
"MDK-ARM/retracted_bench_20260922/README.txt",
|
||||
"scripts/README.md"
|
||||
],
|
||||
"note": "NET(CH395F)域:Trap 21 → TRAP-NET-21、Trap 19 → TRAP-NET-19;两处引用的都是 CH395F_Trap_Records.md 这个活登记处,号本身不变"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -789,7 +789,7 @@ static void gd5f_phase10(void)
|
||||
* Phase 11 — 13h 锁存 / WIP 提前清零对照复现(2026-09-21 台架实验)
|
||||
*
|
||||
* 复现对象 = 09-20 两项读异常(归因/证伪史实见 GD5F Trap_Records
|
||||
* Trap 05,本用例只承担复现职能):
|
||||
* TRAP-GD5F-05,本用例只承担复现职能):
|
||||
* H1: 编程/擦除风暴后 13h 命令未被锁存(空操作)→ 0Bh 读残留缓存
|
||||
* H2: WIP 早于 array→cache 整页装载完成而清零 → 0Bh 读混合页
|
||||
* 设计:
|
||||
|
||||
@@ -261,7 +261,7 @@ static void storage_test_badblock(void)
|
||||
* 非法名字 f_open 必返 FR_INVALID_NAME(纯 RAM 名字判定、不碰盘);合法但
|
||||
* 不存在的名字返 FR_NO_FILE。本测试断言两类严格可区分——一旦哪天有人把
|
||||
* FR_INVALID_NAME 误归入"卷损坏"自愈集合,这条测试就是最后的机械防线。
|
||||
* (详见 docs/问题记录/GD5F2GQ5UE_Trap_Records.md Trap 05 / AGENTS.md)
|
||||
* (详见 docs/问题记录/GD5F2GQ5UE_Trap_Records.md TRAP-GD5F-05 / AGENTS.md)
|
||||
*/
|
||||
static void storage_test_name_validation(void)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user