docs/current/04-标准库与防线/标准库支持矩阵.md
GitHub ↗
当前有效

Vitro 标准库支持矩阵

5900 字·约 15 分钟 阅读 2026-10-10 17:07

状态:基于 标准库架构与测试防线.md 四层架构与分层规则,截至 2026-09-11(2026-06-07 基线 + 其后已核实变化的回填,逐项注明核实日期)。 设计原则:All in. Record don't hide. Fix real bugs, not test cases. MoonBit 侧现状(2026-10-07 复核):本表 Layer 列描述 Rust oracle(tag rust-oracle-freeze,已随 2026-10-05 删区退役)的实现路径;MoonBit 活跃区同位实现已落 moonbit/host(vitro/engine 0.8.0 在架,110 路由——host_route_coverage 机判复核不变:内存/ctype/math/字符串/转数值/printf-scanf/VFS 各族 handler),对拍由 clang_direct / vm_diff 承载(shadow 已随删区退役,语料域由 clang_direct 吸收——差量 0),路由覆盖由 scripts/moonbit/host_route_coverage 把关。函数级承诺以本表为单一清单,MoonBit 侧按此对齐。

本次修订(2026-09-11,前端切割后文档翻新):回填 2026-06-07 之后已核实的能力变化 —— ① scanf 族三修:返回值按 C11 7.21.6.2 返回成功项数、格式串普通字符指令精确匹配、%% 参与匹配 (见 C语言子集规范.md §2.8 与 CHANGELOG.md [Unreleased];同批还有空白指令跳白修复); ② 堆模型改为 bump 分配 + 有界隔离:free 进 FIFO 隔离区(预算 256KB、会话级可调),超预算 FIFO 驱逐复用 (见 堆有界隔离决议.md 与 C语言子集规范.md §2.9); ③ 补齐 §一 遗漏的 <stdarg.h>(已核实 native/runtime_libc/include/ 下实存 14 个头文件,文档原列 13 个)。 其余未复核的判定一律保持 2026-06-07 原样,不做推测性更新。


一、支持的头文件

头文件 状态 说明
<stdio.h> ✅ 完整 I/O:含 printf/scanf/getchar/putchar/fopen/fclose/fread/fwrite/fgets/fputs/feof/fprintf/puts/sprintf/snprintf/sscanf/fgetc/fputc/fseek/ftell/rewind/fflush/perror/clearerr/remove/rename
<stdlib.h> ✅ 完整核心:含 malloc/free/realloc/calloc/atoi/atof/atol/abs/rand/srand/exit/qsort/bsearch/abort/strtol/strtod/llabs
<ctype.h> ✅ 完整字符分类:含 isdigit/isalpha/islower/isupper/tolower/toupper/isspace/isalnum/isprint/iscntrl/isxdigit/isgraph/ispunct/isblank
<math.h> ✅ 完整教学 math:sin/cos/tan/sqrt/pow/atan/log/log10/exp/fabs/ceil/floor/round/fmod/asin/acos/atan2/sinh/cosh/tanh(libm double 精度)
<string.h> ✅ 完整字符串:含 strlen/strcpy/strncpy/strcmp/strncmp/strcat/strncat/memcpy/memmove/memset/memcmp/strchr/strrchr/strstr/memchr/strdup/strerror/strpbrk/strspn/strcspn
<stdarg.h> ✅ 变参:va_list(以 char* 模拟)+ va_start/va_arg/va_end 宏,展开为内部 Host 函数 __vitro_va_start/__vitro_va_arg/__vitro_va_end(native/crates/vitro_vm/src/host/misc.rs);支持 int/double/long long 等常见类型(遵循 C 默认实参提升);回归用例 native/tests/cases/baseline/variadic.c。原文档漏列本头文件,2026-09-11 核实补入
<limits.h> ✅ 空存根,宏由 Lexer 预定义(INT_MAX/INT_MIN/LONG_MAX/LONG_MIN/CHAR_BIT)
<stdbool.h> ✅ 存根声明已加载,bool typedef + true/false 宏
<stddef.h> ✅ 存根声明已加载,size_t/ptrdiff_t typedef;offsetof 为编译器内置
<stdint.h> ✅ 存根声明已加载,int8_t/uint8_t/int16_t/uint16_t/int32_t/uint32_t/int64_t/uint64_t typedef
<time.h> ✅ 存根声明已加载,time_t/clock_t typedef + CLOCKS_PER_SEC 宏;time/clock
<assert.h> ✅ 存根声明已加载,assert 宏展开为 __vitro_assert_fail Host Func
<errno.h> ✅ 存根声明已加载,extern int errno + EINVAL/ERANGE/EDOM/ENOENT/EACCES 宏
<float.h> ✅ 存根声明已加载,FLT_MAX/DBL_MAX/FLT_EPSILON/DBL_EPSILON 等宏

二、函数级支持矩阵

2.1 stdio.h

函数 Layer 类型检查 Host Contract Bytecode Consistency Differential 备注
printf B 硬编码(变参) ✅ N/A N/A 格式字符串诊断 W3032/W3062(批四 2026-10-07 降 warning——Clang -Wformat 口径)
scanf B 硬编码(变参;返回类型 2026-09-11 由 void 改 int) ✅ N/A N/A 2026-09-11 三修:按 C11 7.21.6.2 返回成功项数 / 普通字符指令精确匹配 / %% 参与匹配;同批空白指令跳白修复(C语言子集规范.md §2.8)
fprintf B 硬编码(变参) ✅ N/A N/A ⚠️ 既有偏差(2026-09-11 E-P1-5 核查记录):fprintf(fp, …)(fp 来自 fopen)不写入 VFS 文件,而是被当作 stdout 输出;写 stderr 已正确分流。需要写文件请用 fputs/fwrite/fputc
getchar B 硬编码 ✅ N/A N/A —
putchar B 硬编码 ✅ N/A N/A —
puts B 硬编码 ✅ N/A N/A —
sprintf B 硬编码(变参) ✅ N/A N/A —
snprintf B 硬编码(变参) ✅ N/A N/A —
sscanf B 硬编码(变参) ✅ N/A N/A 与 scanf 共享同一份格式串解析,2026-09-11 scanf 族三修同步生效
fopen B 硬编码 N/A N/A N/A VFS-backed
fclose B 硬编码 N/A N/A N/A VFS-backed
fread B 硬编码 N/A N/A N/A VFS-backed
fwrite B 硬编码 N/A N/A N/A VFS-backed
fgets B 硬编码 N/A N/A N/A VFS-backed
fputs B 硬编码 N/A N/A N/A VFS-backed
feof B 硬编码 N/A N/A N/A VFS-backed
ungetc B 硬编码 N/A N/A N/A VFS-backed
fgetc B 硬编码 N/A N/A N/A VFS-backed
fputc B 硬编码 N/A N/A N/A VFS-backed
fseek B 硬编码 N/A N/A N/A VFS-backed
ftell B 硬编码 N/A N/A N/A VFS-backed
rewind B 硬编码 N/A N/A N/A VFS-backed
fflush B 硬编码 N/A N/A N/A VFS 内存模式为空操作
perror B 硬编码 N/A N/A N/A 简化版:忽略 errno
clearerr B 硬编码 N/A N/A N/A VFS-backed
remove B 硬编码 N/A N/A N/A VFS-backed
rename B 硬编码 N/A N/A N/A VFS-backed

2.2 stdlib.h

函数 Layer 类型检查 Host Contract Bytecode Consistency Differential 备注
malloc B 硬编码 ✅ N/A N/A bump 顶指针推进 + 隔离区驱逐复用(2026-09-11 起);UAF/泄漏检测
free B 硬编码 ✅ N/A N/A 进入 FIFO 隔离区,隔离期内地址不复用(2026-09-11 起,预算 256KB 会话级可调);UAF/Double-Free 检测保留
realloc B 硬编码 ✅ N/A N/A 恒为新块拷贝,旧块进隔离区(2026-09-11 起)
calloc B 硬编码 ✅ N/A N/A 零初始化 + 统一堆分配入口(bump + 驱逐复用,2026-09-11 起)
atoi B 硬编码 ✅ ✅ ✅ —
atof B 硬编码 ✅ N/A N/A —
atol B 硬编码 ✅ N/A N/A —
strtol B 硬编码 N/A N/A N/A 支持 endptr,解析失败时设置 errno=EINVAL
strtod B 硬编码 N/A N/A N/A 支持 endptr,解析失败时设置 errno=EINVAL
abs B 存根声明 ✅ ✅ ✅ 已替代硬编码
llabs B 硬编码 N/A N/A N/A long long 绝对值
rand B 硬编码 ✅ ✅ ✅ —
srand B 硬编码 ✅ ✅ ✅ —
exit B 硬编码 N/A N/A N/A —
abort B 硬编码 N/A N/A N/A 终止并输出诊断
qsort B 硬编码 N/A N/A N/A VM 回调敏感(存根已声明,见 §5.2.1 与 §5.7 Phase A)
bsearch B 硬编码 N/A N/A N/A VM 回调敏感

分配器语义变更(2026-09-11,已核实):malloc/calloc/realloc/free 的底层堆模型改为 bump 分配 + 有界隔离(Bounded Quarantine) —— 隔离预算 = 堆上限的 1/4 = 256KB(会话级可调,vitro_set_quarantine_budget); 超预算时 FIFO 驱逐最老已释放块归还复用;堆耗尽(1MB 墙)返回 NULL + 教学提示(不 trap)。 决策与验收清单见 堆有界隔离决议.md,与 Clang 的四项差异见 C语言子集规范.md §2.9。 上表函数在 Layer / 类型检查 / 三层验证状态上均无变化,仅分配行为语义变更。

2.3 ctype.h

函数 Layer 类型检查 Host Contract Bytecode Consistency Differential 备注
isdigit B 存根声明 N/A ✅ ✅ —
isalpha B 存根声明 N/A ✅ ✅ —
islower B 存根声明 N/A ✅ ✅ —
isupper B 存根声明 N/A ✅ ✅ —
tolower B 存根声明 N/A ✅ ✅ —
toupper B 存根声明 N/A ✅ ✅ —
isspace B 存根声明 N/A ✅ ✅ —
isalnum B 存根声明 N/A ✅ ✅ —
isprint B 存根声明 N/A ✅ ✅ —
iscntrl B 存根声明 N/A ✅ ✅ —
isxdigit B 存根声明 N/A ✅ ✅ —
isgraph B 存根声明 N/A N/A N/A —
ispunct B 存根声明 N/A N/A N/A —
isblank B 存根声明 N/A N/A N/A —

2.4 math.h

函数 Layer 类型检查 Host Contract Bytecode Consistency Differential 备注
sin B 存根声明 ✅ N/A N/A libm::sin,double
cos B 存根声明 ✅ N/A N/A libm::cos,double
tan B 存根声明 ✅ N/A N/A libm::tan,double
sqrt B 存根声明 ✅ N/A N/A libm::sqrt,double
pow B 存根声明 ✅ N/A N/A libm::pow,double
atan B 存根声明 ✅ N/A N/A libm::atan,double
log B 存根声明 ✅ N/A N/A libm::log(自然对数),double
log10 B 存根声明 ✅ N/A N/A libm::log10,double
exp B 存根声明 ✅ N/A N/A libm::exp,double
fabs B 存根声明 ✅ N/A N/A libm::fabs,double
ceil B 存根声明 ✅ N/A N/A libm::ceil,double
floor B 存根声明 ✅ N/A N/A libm::floor,double
round B 存根声明 ✅ N/A N/A libm::round,double
fmod B 存根声明 ✅ N/A N/A libm::fmod,double
asin B 存根声明 ✅ N/A N/A libm::asin,double
acos B 存根声明 ✅ N/A N/A libm::acos,double
atan2 B 存根声明 ✅ N/A N/A libm::atan2,double
sinh B 存根声明 ✅ N/A N/A libm::sinh,double
cosh B 存根声明 ✅ N/A N/A libm::cosh,double
tanh B 存根声明 ✅ N/A N/A libm::tanh,double

2.5 string.h

函数 Layer 类型检查 Host Contract Bytecode Consistency Differential 备注
strlen C 存根声明 ✅ ✅ ✅ 已切换为 Bytecode Libc 路径
strcpy B 硬编码 ✅ ✅ ✅ E3070 Buffer Overflow 诊断
strncpy B 硬编码 ✅ ✅ ✅ —
strcmp C 存根声明 N/A ✅ ✅ 已切换为 Bytecode Libc 路径
strncmp B 硬编码 N/A N/A N/A —
strcat B 硬编码 ✅ ✅ ✅ E3070 Buffer Overflow 诊断
strncat B 硬编码 N/A N/A N/A —
memcpy B 硬编码 N/A ✅ ✅ —
memmove B 硬编码 N/A ✅ ✅ —
memset B 硬编码 ✅ ✅ ✅ —
memcmp B 硬编码 N/A N/A N/A —
strchr B 硬编码 N/A N/A N/A —
strrchr B 硬编码 N/A N/A N/A —
strstr B 硬编码 N/A N/A N/A —
memchr B 硬编码 N/A N/A N/A —
strdup B 硬编码 N/A N/A N/A malloc+strcpy,内存追踪
strerror B 硬编码 N/A N/A N/A 映射 5 种常见错误码
strpbrk B 硬编码 N/A N/A N/A —
strspn B 硬编码 N/A N/A N/A —
strcspn B 硬编码 N/A N/A N/A —

2.6 time.h

函数 Layer 类型检查 Host Contract Bytecode Consistency Differential 备注
time B 硬编码 N/A N/A N/A 返回 Unix 时间戳(秒)
clock B 硬编码 N/A N/A N/A 返回微秒级近似时钟

2.7 assert.h

宏/函数 Layer 类型检查 Host Contract Bytecode Consistency Differential 备注
assert B 宏展开 N/A N/A N/A 展开为 if (!(expr)) __vitro_assert_fail()
__vitro_assert_fail B 硬编码 N/A N/A N/A 输出诊断并终止程序

三、宏与类型定义

名称 值 来源 备注
NULL 0 Lexer 预定义宏 全局可用
EOF -1 Lexer 预定义宏 全局可用
stdin 0 Lexer 预定义宏 全局可用
stdout 1 Lexer 预定义宏 全局可用
stderr 2 Lexer 预定义宏 全局可用
size_t unsigned int 存根 typedef 多文件声明,覆盖不报错
ptrdiff_t int 存根 typedef stddef.h 中定义
time_t long long 存根 typedef time.h 中定义
clock_t long long 存根 typedef time.h 中定义
FILE void* 存根 typedef stdio.h 中定义
EXIT_SUCCESS 0 Lexer 预定义宏 stdlib.h
EXIT_FAILURE 1 Lexer 预定义宏 stdlib.h
RAND_MAX 32767 Lexer 预定义宏 stdlib.h
SEEK_SET 0 Lexer 预定义宏 stdio.h
SEEK_CUR 1 Lexer 预定义宏 stdio.h
SEEK_END 2 Lexer 预定义宏 stdio.h
INT_MAX 2147483647 Lexer 预定义宏 limits.h
INT_MIN -2147483648 Lexer 预定义宏 limits.h
LONG_MAX 2147483647 Lexer 预定义宏 limits.h
LONG_MIN -2147483648 Lexer 预定义宏 limits.h
CHAR_BIT 8 Lexer 预定义宏 limits.h
true 1 Lexer 预定义宏 stdbool.h
false 0 Lexer 预定义宏 stdbool.h
CLOCKS_PER_SEC 1000000 存根宏 time.h
EINVAL 1 存根宏 errno.h
ERANGE 2 存根宏 errno.h
EDOM 3 存根宏 errno.h
ENOENT 4 存根宏 errno.h
EACCES 5 存根宏 errno.h
FLT_MAX 3.40282347e+38F 存根宏 float.h
DBL_MAX 1.7976931348623157e+308 存根宏 float.h
FLT_EPSILON 1.19209290e-7F 存根宏 float.h
DBL_EPSILON 2.2204460492503131e-16 存根宏 float.h

四、已解除的缺口

缺口 解除时间 说明
math.h 不支持 2026-06-07 引入 libm,注册 20 个数学函数 Host Func
#include <stdio.h> 被跳过 2026-06-07 Lexer 加载存根,TypeChecker 识别声明
strdup 不支持 2026-06-07 新增 STRDUP Host Func,复用 allocate_raw + MemoryRegion 追踪
大量函数缺存根声明 2026-06-07 补全全部 6 个已有头文件存根;新增 7 个存骨头文件
P1 核心函数缺失 2026-06-07 完成 abort/strtol/strtod/strerror/fflush/perror/clearerr/time/clock/assert/errno/remove/rename/strpbrk/strspn/strcspn + ctype/math 补全
scanf 返回值未实现(被视作 void) 2026-09-11 按 C11 7.21.6.2 返回成功匹配并赋值的项数;int r = scanf(...)、while (scanf(...) != EOF) 恢复可用(C语言子集规范.md §2.8、CHANGELOG.md [Unreleased])
scanf 格式串普通字符指令被忽略 2026-09-11 新增 ScanfItem::Literal(u8):与输入流下一个字符精确比较,不匹配即停止解析;%% 展开为字面 % 同样参与匹配;sscanf 同族同修(回归 baseline/scanf_literal_match.c / scanf_literal_mismatch.c)
scanf 格式串空白指令不跳白 2026-09-11 按 C11 7.21.6.2 匹配输入中任意数量(含零)空白字符;此前 scanf("%d %c %d", …) 读 3 + 4 时 %c 捕获空格而非 +(教学阻断)
输入耗尽的 EOF 语义(InputMode::Batch 之前缺失) 2026-09-12 行 233 只接了"返回值语义"(成功项数),耗尽→EOF 未接通:while (scanf(...) != EOF) 在有限输入下永久挂起 waiting_input。现 InputMode::Batch(batch_input:true / CLI run)下流耗尽返回 EOF(-1)、程序正常结束;默认 Interactive 保留"等待键入"挂起语义(crates/vitro_vm/src/host/io.rs,与 getchar 同口径)。对端需求清单 A1
EOF 粘滞语义(stdin_eof,同日补) 2026-09-12 A1 首修只覆盖"判定 EOF 的那一次调用":判定后未推进游标、也无粘滞标志,于是 scanf 触发的 EOF 对 getchar 不可见。实测输入 7\n:Clang 给 r1=1 r2=-1 c=-1,Vitro 给 c=10(把 scanf 未消费的 '\n' 当普通字符读出)。现 RuntimeState::stdin_eof 为粘滞位(对齐 C11 7.21.5.1 feof),判定 EOF 时置位并把游标推到底,三条读取路径(scanf / getchar / ungetc 前置检查)统一查询;set_stdin / push_stdin_text 重新喂入时清位。回归 baseline/scanf_eof_loop.c / scanf_eof_after_exhaust.c(native/crates/vitro_vm/src/host/io.rs)

五、下一阶段全面拓展蓝图(基于四层架构分层规则)

目标:一次性规划到位,覆盖 C89 教学高频函数 + C99 补充,避免反复修补。 分层依据:标准库架构与测试防线.md 第 2.1 节分层规则。

5.1 分层规则速查

类型 必须放在 原因
内存安全诊断敏感 Layer B 需要注入边界检查、UAF 检测、行号追踪
I/O 沙盒敏感 Layer B 需要操作会话输出通道(session.runtime.output_chunks,按 stdout/stderr/note 打标)/ VFS
VM 回调敏感 Layer B 需要 call_user_function 回调 VM 函数
纯计算、无副作用 Layer C(优先)或 Layer B Bytecode 可教学展示源码;Rust 可借助 libm
超高频内存原语 Layer A 原生执行,避免 CallHost 开销(待 profiling)

5.2 🔴 P0 — 立即填补(学生代码编译失败最高频)

5.2.1 零成本修复(Host Func 已实现,仅缺存根声明 / 宏定义)

头文件 内容 分层 动作 学生场景
<stdlib.h> qsort Layer B ✅ 存根已添加 LeetCode 排序、数据结构教材
<limits.h> INT_MAX, INT_MIN, LONG_MAX, LONG_MIN, CHAR_BIT 无 Layer ✅ Lexer 预定义宏 + stub 头文件 DP 初始化、边界判断
<stdbool.h> bool, true, false 无 Layer ✅ stub typedef + Lexer 预定义宏 现代 C 代码标配
<stdlib.h> EXIT_SUCCESS, EXIT_FAILURE, RAND_MAX 无 Layer ✅ Lexer 预定义宏 程序返回值、随机数范围
<stdio.h> SEEK_SET, SEEK_CUR, SEEK_END 无 Layer ✅ Lexer 预定义宏 fseek 定位
<stddef.h> size_t, ptrdiff_t 无 Layer ✅ stub 头文件 + 编译器内置 offsetof 标准类型
<stdint.h> int32_t, uint64_t 等 无 Layer ✅ stub typedef 头文件 精确宽度整数类型
<time.h> time_t, clock_t, CLOCKS_PER_SEC 无 Layer ✅ stub 头文件 + 宏 时间/计时类型
<assert.h> assert 宏 无 Layer ✅ stub 头文件 + Host Func 调试断言
<errno.h> errno, EINVAL/ERANGE/EDOM/ENOENT/EACCES 无 Layer ✅ stub 头文件 + Host 设置 错误码处理
<float.h> FLT_MAX, DBL_MAX, FLT_EPSILON, DBL_EPSILON 无 Layer ✅ stub 宏头文件 浮点边界

5.2.2 新增函数(P0 核心)

头文件 函数 分层 学生场景
<stdio.h> puts Layer B ✅ 已实现
<stdio.h> sprintf, snprintf Layer B ✅ 已实现
<stdio.h> sscanf Layer B ✅ 已实现
<stdio.h> fgetc, fputc Layer B ✅ 已实现
<stdio.h> fseek, ftell, rewind Layer B ✅ 已实现
<stdio.h> fflush, perror, clearerr Layer B ✅ 已实现
<stdio.h> remove, rename Layer B ✅ 已实现
<stdlib.h> calloc Layer B ✅ 已实现
<stdlib.h> bsearch Layer B ✅ 已实现
<stdlib.h> atof, atol Layer B ✅ 已实现
<stdlib.h> abort Layer B ✅ 已实现
<stdlib.h> strtol, strtod Layer B ✅ 已实现
<stdlib.h> llabs Layer B ✅ 已实现
<string.h> strchr, strrchr, strstr Layer B ✅ 已实现
<string.h> strncmp, strncat Layer B ✅ 已实现
<string.h> memcmp, memchr Layer B ✅ 已实现
<string.h> strerror Layer B ✅ 已实现
<string.h> strpbrk, strspn, strcspn Layer B ✅ 已实现
<math.h> tan, log10, fabs, ceil, floor, round, fmod Layer B ✅ 已实现
<math.h> asin, acos, atan2, sinh, cosh, tanh Layer B ✅ 已实现
<ctype.h> isgraph, ispunct, isblank Layer B ✅ 已实现
<time.h> time, clock Layer B ✅ 已实现

5.3 🟠 P1 — 短期实现(教学/算法必备)

5.3.1 已有头文件补全

头文件 函数 分层 分层依据
<string.h> strtok Layer C 纯计算但涉及全局静态状态;建议走 Bytecode Libc

5.3.2 新增头文件

头文件 内容 分层 实现方式
<assert.h> assert Layer B ✅ 已实现
<time.h> time, clock Layer B ✅ 已实现
<time.h> CLOCKS_PER_SEC 无 Layer ✅ 已实现
<errno.h> errno, EDOM, ERANGE, EINVAL, ENOENT, EACCES 无 Layer ✅ 已实现
<stdio.h> fflush, perror, clearerr, remove, rename Layer B ✅ 已实现
<stddef.h> offsetof 无 Layer ✅ 已实现
<float.h> FLT_MAX, DBL_MAX, FLT_EPSILON, DBL_EPSILON 无 Layer ✅ 已实现

5.4 🟡 P2 — 中期实现(进阶补全)

以下项目经评估后明确不支持,已在排除项中登记。

头文件 内容 不支持理由
<math.h> INFINITY, NAN, HUGE_VAL 可用 1e309 或 0.0/0.0 替代;标准宏在不同平台值不同,教学不依赖
<string.h> strtok 需全局静态状态,线程不安全;教学价值有限,学生可用 strchr/strcspn 自行实现

5.5 ⚫ 明确排除项(实现复杂 / 教学价值极低)

特性/头文件 排除理由
bitfield(位域) 文档已排除;嵌入式专用,初学者不需要
<complex.h> / _Complex 数学/工程专用,教学不用
<fenv.h> 浮点环境控制,教学不用
<locale.h> 本地化,教学不用
<wchar.h> / <wctype.h> / <uchar.h> 宽字符/国际化,除非专门课程
<threads.h> / <stdatomic.h> 并发编程,通常用 pthreads 或 C++ 教学
<setjmp.h> / longjmp 非局部跳转,教学不鼓励
_Generic / _Static_assert / _Alignas / _Alignof C11 进阶,学生几乎不用
_Noreturn / _Thread_local / _Atomic 同上
div / ldiv / lldiv 除法同时获取商和余数,极少使用
atexit / at_quick_exit 退出处理函数,教学不用
getenv / system 环境变量/系统命令,沙盒中意义有限
frexp / ldexp / modf / scalbn 等 math 高级函数 数值分析专用
strtok 需全局静态状态,教学价值有限,可用 strchr/strcspn 自行实现
INFINITY / NAN / HUGE_VAL 可用 1e309 或 0.0/0.0 替代,教学使用频率极低

5.6 按分层统计的工作量估算

定位注记(2026-09-27):本节为 2026-06-07 蓝图口径的历史留存——Rust 区已冻结,剩余项(如 strtok、INFINITY/NAN 近似宏)若要落地应走 MoonBit 侧 moonbit/host,不在 Rust oracle 内补。

分层 新增项数 估算工作量
无 Layer(宏/typedef) 0 全部完成
Layer C: Bytecode Libc strtok 约 1 个函数,需全局静态状态支持
Layer B: Rust Host INFINITY/NAN 近似宏 约 1 天
Layer A: VM Builtin 暂不接 codegen(待 profiling) 0

总计:标准库教学子集已基本完整,剩余工作量 < 1 天。


5.7 推荐实施路线图

Phase A(第 1 周):基础设施 + 立即可用 ✅

  • qsort 存根声明修复(1 行)
  • 新增 stub 头文件:limits.h, stdbool.h, stddef.h, stdint.h, time.h, assert.h, errno.h, float.h
  • 补全已有头文件宏:EXIT_SUCCESS, EXIT_FAILURE, RAND_MAX, SEEK_SET/CUR/END
  • puts, sprintf, snprintf, sscanf
  • calloc, bsearch
  • fgetc, fputc, fseek, ftell, rewind
  • strchr, strrchr, strstr, strncmp, strncat, memcmp, memchr
  • atof, atol
  • tan, log10, fabs, ceil, floor, round, fmod
  • asin, acos, atan2, sinh, cosh, tanh
  • isgraph, ispunct, isblank
  • abort, strtol, strtod, llabs
  • fflush, perror, clearerr, remove, rename
  • strerror, strpbrk, strspn, strcspn
  • time, clock
  • assert 宏
  • errno 全局变量 + Host 设置
  • float.h 常量宏

目标:LeetCode 中 90% 的 C 解法能编译通过。

Phase B(可选):剩余补全

  • strtok → 明确不支持:需全局静态状态,教学价值有限,学生可用 strchr/strcspn 自行实现
  • INFINITY, NAN, HUGE_VAL → 明确不支持:可用 1e309 或 0.0/0.0 替代,教学使用频率极低

目标:K&R《C程序设计语言》全书示例代码 95% 能编译通过。


5.8 关键校正说明(与早期分析的差异)

函数 早期误标 严格分层后 原因
bsearch Bytecode C Layer B VM 回调敏感,需调用用户比较函数
strncat Bytecode C Layer B 内存安全诊断敏感,需 Buffer Overflow 检测
strtol / strtod Bytecode C / Host B Layer B 涉及 errno + endptr,非纯计算
strtok Bytecode C Layer C 虽有全局状态但无诊断需求,走 C 可展示源码
strchr/strrchr/strstr/strncmp/memcmp/memchr Bytecode C(规划) Layer B 实际实现为 Host Func,保留灵活性

文档状态:产品化进度追踪 + 下一阶段全面拓展蓝图 最后更新:2026-09-11(前端切割后文档翻新:回填 scanf 族三修与堆模型变更,核实并补齐 <stdarg.h>;其余判定保持 2026-06-07 原样)