状态:基于 标准库架构与测试防线.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(可选):剩余补全
目标: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 原样)