0f7b5a87fb
登记簿、文档与代码注释里的存量字母加数字编号(N-x / S-x / T-x / E-x / A-x / 卡号) 一律改写为语义短语,净删 2,028 处引用;删除基线与待确认、并行分道方案、排期详述、 采集保护收尾 4 篇(内容已并入 docs/任务规划/README 与登记簿)。 门禁机器与三张账同批重打:check_ids.py 新增变更记录行豁免与第二根护栏 undecidable_total_ceiling;check_test_traceability.py 只加 stdout/stderr UTF-8 reconfigure(TC_RE 未动);check_cubemx_survival.py 的 --write 固定 newline=LF; id_registry / id_aliases(+19 条 retired-to-phrase)/ id_known_backlog 重打。 test/ 56 个文件同步 TC 标签语义化,其中 18 个 TU 改了 CHECK / printf 里的标签文字, 是本批唯一改变构建产物的文件集合。 为什么合成一笔、不拆四笔(实测撞闸,非偏好):pre-commit 跑钩子前会 stash 未 staged 部分,拆开后中间提交必然是「新规则 + 旧语料」——实跑可判定 85.15% < 基线 86.00%、 不可判定 1,453 > 上限 1,166,编号门禁直接拦下。编号识别面与它描述的语料只能同码移动。 实跑基线(工作区全量):754 文件 / 8,230 处编号字面量 / 可判定 7,079 = 86.01% (基线 86.0%,容差 0.1pp)/ 不可判定绝对数 1,151(上限 1,166)/ 校验 1-6 错误级 0 / 告警 = 悬空 2(App/algo/freq.c 的 S2,属 §4.4 同号不同义)+ 孤儿 50。 基线从 84.0 抬到 86.0 的理由见 docs/门禁说明/id-check.md §7.6:本批真删了 2,028 处 引用,可判定面随真实内容上升,不是把分母做小。同批新增排除 docs/硬件平台/ 语料,使 识别面少 264 处——芯片手册位号与网表料号不属编号空间(registry 有 excluded_paths_note)。 ⚠ 余量只剩 0.11pp(约 10 处)与绝对数 15 处:把「可判定的引用」改成散文会立刻撞第二 根护栏。另遗留一项:id_aliases 里 retired 的 N / S / T / A 别名没有 scope(U1~U5 有), 今后有人新写一个 A-4,校验 3 不会响,只能靠人,建议下批补 scope。 固件不变证据:115 个 .c/.h 剥注释并归一字符串后与 HEAD 逐字节全等,残留代码差异 0; App / Src / Drivers 的字符串字面量零改动。@build 0 错误 0 警告;40/40 主机套件、2,889 断言全通过;覆盖率 line 89.2% / func 92.6%;pre-commit 48 钩子 --all-files 全绿; check_doc_links --all 通过(176 文档,章节引用无法判定 0);逐字节卫生核过:14 个带 BOM 文件与 HEAD 一致、0 个 CR、0 个 U+FFFD,字符串字面量纯 ASCII。 .cubemx_survival_baseline.json 的 watchdog-module 哈希 56bf27 变 2bb051 属合法: Src/freertos.c 的 USER CODE 区内只有注释文字随编号改写,代码未变。 同批带上体积同码凭证与 RAM 台账行(@build 之后盖戳):RW_IRAM1 79,008 B / 60.3%, RW_CCM 57,376 B / 87.9%,阈值 92%。
5.0 KiB
5.0 KiB
registration-check — 双端注册反向校验(源文件有没有真的参与编译)
一句话:本仓两处注册表都是显式文件列表,忘了登记的文件能编过、能提交,但从不参与编译 ——这一门专抓"写了却从不生效"的死代码,包括第四种更隐蔽的:页面描述符没接线。
- 配置:
entry: python scripts/check_registration.py --strict、pass_filenames: false。 - 背景:登记簿条目「rs485_task 白名单缺口」;UI 页面那类是「UI 字符集与像素回归门禁」补强(2026-10-15)。
1. 它在查什么(四类缺口)
扫描 App/、Drivers/BSP/、Src/ 下全部 .c(排除第三方),对照 MDK-ARM/STM32F407-Demo.uvprojx 的 <FilePath> 与 simulator/CMakeLists.txt 的源列表:
| 类 | 情形 | 后果 |
|---|---|---|
| ① | 文件存在但未进 uvprojx | 固件端不编译(死代码或漏注册) |
| ② | 文件存在但未进 CMakeLists | 模拟器端不编译——MCU-only 文件不进模拟器是正确的,脚本按豁免判定 |
| ③ | 注册了但文件不存在(反向) | 幽灵注册(改名/删除后残留条目) |
| ④ | Drivers/BSP/UI/ui_page_*.c 定义了 ui_page_<name>_desc,但该符号在 UI 目录内除自身 .c/.h 外无人引用 |
页面没接进 ui_content_page.c 的 s_defs[] 描述符表:两端编译链接全过(无人引用的 desc 被链接器整段剥离),菜单永远打不开这一页 |
- UI 页面的"注册"有两层,第 ④ 类只管第二层:第一层是构建注册(uvprojx + CMakeLists,
即 ①② 类);第二层是框架注册(
ui_content_page.h的枚举 +ui_content_page.c的s_defs[]描述符表)。只做第一层 → 编译链接全过,但菜单里就是没有这一页。
2. 为什么要它
- 真事故:
App/task/rs485_task.c、Drivers/BSP/NET/lftpd/lftpd_log.c历史上两处都没注册, 等于代码从不参与任何一端编译,而读者以为功能已生效。 - 第 ④ 类尤其值:2026-10-15 实测,前三类对"页面写了但没接线"完全照不出(编译链接都过), 所以才有"新增 UI 页面必须过本门"的机械口径。
3. 触发面
files: 覆盖 \.c$|\.uvprojx$|CMakeLists\.txt$|^scripts/check_registration\.py$;
pass_filenames: false → 每次全量对照两份注册表。
4. 报错怎么读
双端注册反向校验 (uvprojx + CMakeLists).......Failed
[示例] [GAP-1] App/x/y.c 未出现在 MDK-ARM/STM32F407-Demo.uvprojx
- 单独跑:
& '.venv\Scripts\python.exe' scripts/check_registration.py --strict。 - 修法是补注册(新
.c走new-source-fileskill 的两处登记),不是把文件删掉凑绿。 - 新目录还要把目录加进
uvprojx的<IncludePath>,否则报错会落在消费者编译单元上 (cannot open source input file),容易被误判成别人的问题。
5. 好处
- 把"显式列表 = 必须登记两次"这条极易忘的约定机械化;
- 反向校验(③)让改名/删文件不留幽灵条目,配合
scripts/rename_ref.py才敢说"改名安全"。
6. 限制与盲区
- 只管"在不在列表里",不管"注册得对不对":把
a.c的<FilePath>指向b.c,只要路径 存在就过。 - MCU-only / 模拟器专用的判定靠豁免清单(脚本内
KNOWN_GAPS一类,存量 + 逐条理由)。 新增一个正确的 MCU-only 文件需要同时改豁免清单,否则②会误报——反过来也成立:进了豁免 清单的文件就永久不再被检查。 - 第 ④ 类只覆盖
ui_page_*.c+ui_page_<name>_desc这一种接线形态;其它"注册了但运行期 无人调用"的入口(命令表、事件回调)不在内。 - 头文件不校验:只漏
.h不会报(漏的是 include 路径,不是注册表)。 - 它不看条件编译:文件在列表里但整个文件被
#ifdef关掉,仍然算"已注册"。
7. 豁免与基线
-
无"只减不增"的基线,而是逐条带理由的已知缺口清单(
KNOWN_GAPS形态):新增条目必须写 理由,性质上比基线更容易被滥用,改动时要看得到理由文本。 -
豁免用显式清单 + 每行理由(命名模式
*_mcu.c加个别点名),不整目录一刀切——一刀切等于 把该目录所有漏注册都免了。 -
存量缺口走白名单只打
[WARN]不拦:KNOWN_GAPS里登记着App/task/rs485_task.c、Drivers/BSP/NET/lftpd/lftpd_log.c(Lead 处置中)。
8. 改这个门禁本身
- 加新的注册面(例如新增一套第三方构建脚本)要同步"正向 + 反向"两向检查,只查单向会漏幽灵注册;
- 放宽第 ② 类(更多豁免)前,先确认该文件真的不需要在 PC 上跑——模拟器不编译意味着该文件的
逻辑永远没有主机侧单测(见
host-unit-tests)。
9. 变更记录
| 日期 | 变更 |
|---|---|
| 2026-10-23 | 首篇逐项文档(四类缺口与两条真实死代码案例) |