状态:P0 只读盘点产物(零代码改动)——设计稿 §7 P0 的验收件,须人工确认后才进 P1。 实测口径:全部数字为 2026-10-10 亲跑文本提取(原始数据
tmp/review_20261010/p0_data.txt,脚本一次性内联),非引用旧记录。 盘点基线:mastere85f7439。
1. 十点对照表(事实 → 现居 → 新归 → 分档)
分档口径:自有 = 真值锚已改 C 标准/头文件存根(#39 批四后),可自由重排;照搬 = 头注自述照搬 Rust、E1 对拍面,内容不可私改(搬迁不改内容可,须登记);生成 = @generated 产物,改输入再跑生成器。
| # | 现居 | 事实内容(2026-10-10 实测) | 新归(方案 A) | 分档 |
|---|---|---|---|---|
| 1 | libc_src/include/*.h(14 头) |
105 函数声明(stdio 27/string 20/math 20/ctype 14/stdlib 18 + stdarg 4 + assert 1 + stddef 1,含 __vitro_va_*×4、__vitro_assert_fail 等 5 条内部辅助)+ 24 个 #define(float 13/errno 5/stdarg 4/assert 1/time 1);limits.h 空壳、stdbool.h/stdint.h 零宏零声明 |
留 .h(surface 真源不动) |
自有 |
| 2 | libc_src/src/*.c(3 文件) |
ctype 11 + stdlib 4 + string 7 = 22 函数 bytecode 实现(→ vm/libc_data_gen.mbt 预编译产物) |
留原处(behavior) | 自有 |
| 3 | libc/libc.mbt |
libc_table 57 条(= visit_call 56 臂名口径:58 臂 − std__move − 三名共享一臂),param_kinds 非空 28 条;builtin_all 175 放行名 |
stdlib 吸收(sig()) |
已转自有(初始内容提取自 Rust check_builtin_*,批四销案后锚 = C 标准,N3/N4 已对齐存根) |
| 4 | libc/bytecode_sig.mbt |
76 名 → 类型(typeck check_user_func 第四级);与 #6 的 88 名差集双向在案:sig 独有 3(vitro_sort 族)、idx 独有 12+(__ctor__ 族)——两表本非同一集合(typeck 面 ≠ 发射面) |
stdlib 派生(P2 与 #3 收敛) | 已转自有(N4 销案对齐存根) |
| 5 | bytecode/host_func_id_gen.mbt |
110 常量 + by_user_name 逐对 + PURE 14 名短路(@generated,源 = Rust 快照 host_func_id.snapshot.rs) |
P2 输入改事实包,删 Rust 快照 | 生成(gen_host_route) |
| 6 | bytecode/libc_index.mbt |
88 名固定索引(1000+ 序,锚 = wbtest Rust 源 88 对硬编码 + codegen_diff) | stdlib/binding 派生 | 照搬(Rust 照搬,锚声明在头注) |
| 7 | bytecode/route.mbt |
改判 5(strcpy/strcat/strncpy/memcpy/memmove)+ 遮蔽 17(实测集合运算,见 §2②)+ shadowed_host_names() 显式清单 |
binding 派生 + 遮蔽清单保留 | 自有(S9 教学语义裁定:负 n trap) |
| 8 | typeck/builtin.mbt |
26 方法 = check_builtin_table 入口 + 25 具体专臂(visit_call 实调名单:FILE 族 14 + 格式串 6 + malloc/realloc/qsort/bsearch/print_int 等);15 臂名走 table 入口 |
专臂留 typeck(Special);table 入口改消费 stdlib |
照搬(头注自述逐字照搬、E1 对拍面)——专臂内容不可动 |
| 9 | lexer/internal/pp/builtins.mbt |
对象宏 23(INT_MAX/EOF/RAND_MAX/stdout…)+ 函数宏 4(va_arg/va_copy/va_end/va_start——头注写「三条」实测 4 条) | 预定义宏迁 stdlib.macro_def |
照搬(macros.rs 全量语义)——搬迁不改内容可,须登记 |
| 10 | host/*.mbt(23 文件) |
110 handler(host_format.mbt = printf 引擎照搬核心;其余按文件头注分档见 §4) |
留原处(behavior) | 混合(host_format 照搬不动;纯数据/接线 handler 分文件核) |
2. 必答三题
① 病 11 过渡路径(已收编臂如何被 stdlib 吸收)
- 现状链:
libc_table57 条(kinds 非空 28:putchar/puts/strlen/strcpy/strdup/strcmp/strcat/atoi/strncat/strncmp/memcmp/strchr/strrchr/strstr/memchr/atof/atol/srand/tan/log10/fabs/ceil/floor/round/fmod/free/memset/exit)→@libc.sig_of→check_builtin_table;visit_call 56 臂名中其余 25 走专臂方法。 - 吸收方式:
stdlib.sig()从libc_table反向提取,57 条零作废;param_kinds的P/I/D字符编码换枚举(check_builtin_table内k==80/k==68魔数同步消灭);入口改import stdlib。 - 验收线:重排前后 typeck_diff hash 等价(与病 11 验收同口径,设计稿 §3.5)。
- 第二层停手建议维持(§8 裁定项):kinds 非空 28 > 已切 table 的 15 臂名——第二层正在半途(填了值未全切臂),恰好是停手的最佳时点:剩余填值工作并入 stdlib 一次做。
② 遮蔽名单处置(实测 17 名,非 route.mbt 头注的 20)
集合运算实测:idx(88) ∩ host(110) = 22,− 改判 5 = 17:
abs, atoi, isalnum, isalpha, iscntrl, isdigit, islower, isprint,
isspace, isupper, isxdigit, rand, srand, strcmp, strlen, tolower, toupper
- 与 C3 历史实例对上:当年「14 臂不可达」= ctype 11 + abs/rand/srand,现已含 atoi/strcmp/strlen 共 17。
- 处置建议(P2 执行):这 17 名 bytecode 版与 host 版语义等价(纯函数/无诊断面),实际路径恒 bytecode——host handler 属写而不可达死面,建议随 binding() 生成实际路径表后删;
shadowed_host_names()保留为断言(删后清单应清零,闸即转红——死面消灭的机器证据)。 - 副产物勘误:
route.mbt头注「20 个静默遮蔽」是 2026-10-06 改判 3 条(交集 25→22)前的旧口径,未随改判连坐——应改 17(修不修随 P2 批顺带,本批不动他人文件)。
③ 宏两分边界清点
| 侧 | 清单(实测) | 新归 |
|---|---|---|
| 预定义(lexer 常在,不依赖 include) | 对象宏 23:stdout/stderr/stdin/EOF/EXIT_SUCCESS/EXIT_FAILURE/RAND_MAX/SEEK_SET/SEEK_CUR/SEEK_END/INT_MAX/INT_MIN/LONG_MAX/LONG_MIN/CHAR_BIT/SCHAR_MIN/SCHAR_MAX/UCHAR_MAX/SHRT_MIN/SHRT_MAX/USHRT_MAX/true/false;函数宏 4:va_arg/va_copy/va_end/va_start | stdlib.macro_def |
| 头文件(include 后由 pp 解析) | 24 个 #define:float.h 13(DBL_/FLT_)+ errno.h 5(EACCES/EDOM/EINVAL/ENOENT/ERANGE)+ stdarg.h 4(va_* 函数式展开)+ assert.h 1(assert)+ time.h 1(CLOCKS_PER_SEC) | 留 .h |
- 新发现盲区(P1 批已读码定案 2026-10-10):
va_*同名字两处定义——stdarg.h用#define va_start(ap,last) __vitro_va_start(...)(展开到辅助函数),builtins.mbt用 token 预定义(显式 token 列表)。定案:Pp::new初始化即装builtin_macro_table()(预定义兜底——不 include stdarg.h 也可用),include 后.h的#define走正常define_macro通道覆盖同名预定义——两处都可达、按 include 切换,非死数据;stdlib 迁移时va_*4 条随预定义面走(macro_def),.h版本留 surface,语义同构(均展开到__vitro_va_*辅助函数)。 - 边界判据建议:「出现在空壳/近空壳头(limits/stdbool/stdint)的宏 = 预定义」——空壳头机制本身是教学子集的有意设计(头文件存在性检查 + 宏预定义),应在
C语言子集规范.md补一段。
3. P1 就绪判定
就绪。P1 范围(设计稿 §7):建 stdlib 包(从 #3 libc_table + #9 预定义宏反向提取)+ 接线 stubs_gen/headers() 一个消费面,验收 = 产物逐字节一致。前置条件全满足:
- 数据源明确(#3 自有可迁、#9 照搬可搬迁须登记);
- 与并发工作零冲突(issue #50 在 typeck 诊断面,P1 不碰 typeck);
- pkg_deps/surface 连坐清单已列(设计稿 §6.2)。
P1 起排 0.9.0 之后(设计稿 §8 时机裁定不变)。
4. 未尽事项(下批/顺带)
route.mbt头注 20→17 勘误(随 P2)。builtins.mbt头注「va_* 三条」→ 4 条勘误(随 #9 搬迁批)。- host 23 文件逐头注分档(P2 接 host 路由面时做,本表只点了 host_format)。
- PURE 14 名与 stdlib
binding()的关系建模(P2)。