docs/current/07-质量与裁定/已知限制与差异.md
GitHub ↗
当前有效

已知限制与差异(as-of S9 修复批,2026-10-07——0.8.0 发布后、0.9.0 发版前工作区态)

4492 字·约 12 分钟 阅读 2026-10-10 17:07

本清单是 vitro/engine 的主动披露:四类条目——已知缺陷(将修)、教学语义设计(有意为之,不是缺陷)、与 C 标准/Clang 的已知差异(架构决定)、路线图缺口(按片排期)。每条标注 Clang 对照状态(Clang 一致 / Clang 不一致 / 无 Clang 对应——Vitro 私有语义)与处置轨道。

这不是「修不了」的清单:第 ② 类是我们的产品语义(Clang 在同样输入下直接未定义行为,Vitro 给出可教学的诊断);第 ① 类已随 S9 修复批(批一~批五,2026-10-05~07,issue #47 母跟踪)全部销案——当前活缺陷为零(Rust oracle 已于 2026-10-05 删区退役,修复在 Clang + 固化 golden 双锚下进行,不再受「单侧修必破 vm_diff」约束);第 ③ 类是白箱 32 位内存模型等架构决定的连带,改它们等于改架构。

真值锚:差异台账 scripts/diff_ledger/ledger.json(现 30 条,其中 resolved-verified 12 条——2026-09-30 初始 14 条 = 蓝图 §⑦ 快照迁入;S8 批实测复核扩至 28;工序① 散点抽查收编 +1〔strerror 元数据微差〕;S9 修复批批一~批五连销 printf 族/atof/出口编码/CRLF/strncpy 族/N3N4 签名/static 地址通路等,台账逐条转 resolved-verified。DIFF-* 编号在册的条目此处标注) + clang_direct 全 KNOWN / 0 未预期(shadow 防线已随 2026-10-05 删区退役,shadow_c_* facts 键转 unavailable——历史对账叙事见 git 历史)。本清单为台账的人工导读层。

① 已知缺陷(当前活缺陷为零——S9 修复批全销,表留作历史账)

这些是真缺陷:与 C 语义或 Clang 行为不一致,且无教学理由。历史上为保持与 Rust oracle 逐字节对拍而照搬登记,S9 修复批(批一~批五,2026-10-05~07)在 Clang 直拍双锚下逐条销案;台账对应条目均转 resolved-verified。

# 条目 Clang 对照 位置
1 printf 旗标/精度三偏差〔DIFF-LIB-PRINTF-01——四偏差面定稿(2026-09-30 探针实锤):旗标×2 + 精度 + %*d 动态宽度 typeck 编译拒 **%d 子项已销案(批四 2026-10-07)——星号宽度/精度运行期语义落地(typeck 计数 + formatter 取参 + scanf %d 抑制),star2.c/scanf_star.c 探针与 Clang 逐位一致;前三偏差已随批二-b 销案〕 不一致 一致 host/host_format.mbt
4 fgets/fread 文本模式 CRLF 伸缩不分模式〔DIFF-VFS-CRLF-01〕:二进制读写也做 \r\n↔\n 转换 已销案(2026-10-05 批二-b,VFS fgets 二进制三连之一):台账转 resolved-verified 不一致 一致 host/vfs.mbt
5 ctype 域外按原值比较〔DIFF-LIB-CTYPE-01〕:部分 ctype 函数对域外输入返回恒 0 的比较形态 已销案(2026-10-05 工序① retest):差异面在 C locale 域实测不存在——一段 b 四点 + 工序① 十点 ×12 函数全套(含负码位/域外全域)两侧逐位一致;原描述「glibc 负码位按 256 取模非零」在 C locale 下数学上不成立(128-255 段表项全零/原值),台账转 resolved-verified 不一致 一致(C locale 域全域) host/host_ctype.mbt
6 strncpy/strcat 族边界行为按 oracle 现状〔DIFF-LIB-STRNCPY-01〕:负 n 补零到尾等界内软夹紧形态与 C 有出入 已销案(2026-10-05 批二-b 负 n 修复 + 批三段一路由改判 Host——strncpy/memcpy/memmove 转 Host 臂使负 n 越界写 trap 教学语义统一,Bytecode 预编译段静默穿过形态拔除**)**:台账转 resolved-verified 不一致 一致 host/host_string.mbt
7 多行宏规范反向漂移(DIFF-PREPROC-MULTILINE-01)——MoonBit 侧从未有此缺陷 + 规范已修正(2026-09-30 实测 + 用户审阅补 oracle 对照):蓝图 §⑦ 记载的「不支持」方是 Rust oracle(实测 vitro_cli 编译失败 E2005);MoonBit 独立 pass 天然支持(探针输出正确)= vitro_better 分叉(carry_over=drop,无欠账);规范 §表格 已更正为「已支持」 MoonBit 侧 Clang 一致;oracle 不一致(E2005) 台账在册(防将来以 oracle 为真值判 MoonBit 错)
8 libc 头文件存根声明冲突(N3/N4)〔DIFF-LIBC-STUB-CONFLICT-01,N3 行为面 2026-09-30 探针实锤:int n = printf(...) 报 E3004 vs Clang 通过〕:内置 puts/printf 声明与用户 include 的 stdio.h 存根冲突场景 已销案(2026-10-07 批四,#47):三面单源对齐 C 标准/存根——printf/putchar/fprintf 返回 int(typeck 放行 + 运行期返回输出字节数/写入字节);bytecode_libc_sig 的 strcpy 族/内存族返回类型对齐存根(strncpy/memcpy/memmove 无 include 时隐式调用返回类型曾错);探针与 Clang 22.1.4 逐位一致(exit 123);台账转 resolved-verified 无 Clang 对应 一致 libc/libc.mbt + typeck/builtin.mbt + host/host_io.mbt
9 static 局部两个观察项(2026-10-07 批四登记):① 聚合成员含字符串指针初值解引用报 TRAP NULL;② scanf 赋值抑制(%*f 等)的写目标投已解析格式串地址 两观察项均已收口:① 已销案(2026-10-07 批四第三条——static 局部聚合地址通路与初值落地,台账 DIFF-CODEGEN-STATIC-ADDR-01 连坐转 resolved-verified);② 已销案(2026-10-07 批五——16 处 store 包条件跳过为正解,哑地址写拔除) Clang 正常(罕见形态面) 一致 codegen/var_decl.mbt + host/host_io.mbt

② 教学语义设计(有意为之——不是缺陷)

Clang 在这些输入下是未定义行为或静默错误;Vitro 的白箱设计把它们变成可教学的确定性诊断。这些条目不会修——它们是产品本体。

# 条目 Clang 对照 语义
1 受检访存三缺口转 trap:NULL 解引用 / UAF 读 / 越界读——Clang UB 或读到垃圾,Vitro 给 E30xx 诊断并停 无 Clang 对应(Clang UB) memory/check_access 单入口
2 strcpy/strcat E3070 栈缓冲校验:写入目标容量校验(堆块容量 + 栈缓冲跨度),越界即停带文案 无 Clang 对应(Clang UB) host/host_string.mbt
3 memset 等写侧受检:界内软夹紧(超长截断)+ 越界 trap——oracle 无检形态不继承 不一致(有意) host/host_memory.mbt(U5 系列)
4 1MB 白箱内存 + 释放隔离区:全部内存可见可解释、UAF 有教学观察窗口、隔离预算可配 无 Clang 对应 memory 包
5 步数/调用深度保险丝 + deterministic 模式:无限循环给诊断不挂起;时钟恒 0 可回放 无 Clang 对应 vm/gateway config
6 扩展关键字(U0#1):fun/struct 字面量等教学扩展在宽松模式可用 不一致(有意) gap 语料域(keyword_compat)

③ 与 C 标准 / Clang 的已知差异(架构决定的连带)

白箱 32 位内存模型与教学定位的架构级决定,非实现疏漏。

# 条目 Clang 对照 说明
1 指针 4 字节模型(DIFF-PTR-4BYTE-01):sizeof(int*)=4,x64 Clang=8 不一致(架构) 1MB 可解释地址空间的连带;C 子集规范已记载
2 putchar(≥128) 单字节语义(DIFF-LIB-PUTCHAR-01——已修(2026-10-05 脱钩修复批批一):host_putchar 单字节直写 + 出口层 Bytes 直写,全链与 Clang 一致——putchar_range 语料双防线转 SAME):按 C 字节语义落 1 字节 Clang 一致 Rust oracle 曾重编码为 UTF-8 两字节(oracle 侧缺陷,已随修复销案)
3 strpbrk/strspn/strcspn 字节语义:ASCII 域与 Clang 逐字节一致 ASCII 一致 非 ASCII 域 oracle 侧 lossy 缺陷(Vitro 不继承)
4 powi10 e=126 偏离:10^126 与 IEEE 参考差 1 ulp(显式锁定) 边缘不一致 %g 极端指数域;633 指数全表对拍仅此一例
5 类型显示不区分 unsigned 变体:诊断/mangle 层 unsigned int 显示为 int 轨道 不一致(显示层) ast/types_render.mbt(mangle 轨道才区分)
6 struct packed 布局(DIFF-LAYOUT-PACKED-01):#pragma pack 未实现 不一致 §8 台账在册(防线零覆盖,先立 golden)
7 二次 fclose 受检 trap:释放后 FILE* 再操作给诊断(oracle 返 -1) 不一致(有意,同②方向) 分叉锚已设
8 vfs 预设注入(DIFF-VFS-PRESET-01,clang_direct known 在册):fopen("test.txt") 读教学演示预设(Clang 真读文件系统) 不一致(教学演示通道) known_direct 已归因

④ 路线图缺口(按片排期——未实现 ≠ 缺陷)

# 条目 排期
1 step 族五方法 已接(2026-10-01,44f63f5):serve_smoke MoonBit 臂豁免 12→2;rss_guard 批随审阅销项 已落
2 dump 族——四方法全接(ast/typeck/symbols 2026-10-01,44f63f5;diagnostics_probe 2026-10-02 S8 段三~四,双臂 67 断言全绿——fix 七元组经两侧独立 generate_fix/apply_fix 后 fixed_source 全文一致,分叉②销案的端到端证明)。S8 契约拍板(2026-09-29 用户裁定):MoonBit 侧实现只读语义(独立编译通道,不碰会话状态——与 oracle 的破坏性行为分叉:oracle symbols.dump 无条件覆盖会话、ast.dump 失败路径销毁已编译程序、diagnostics_probe 经 run_multi_file_pipeline 写 session,帧层 ok:true 承载内层失败,见 native/src/session_api.rs:95-253);分叉行为不照搬、在本清单与 serve_smoke 豁免面登记(dump 族无对拍断言锁定,直接实现正确语义无红线代价)。diagnostics_probe 专属三条分叉(2026-10-02):① 只读形态 = 一次性会话承载管线即弃(oracle 副作用同 dump 族拍板不照搬,gateway probe wbtest 只读锚在案);② intents 段恒 []——已裁定不照搬(2026-10-04 owner 拍板,issue #32:退役后按目标架构重新设计——cfg/data_flow/intent 系 oracle Phase 23 半成品,对烂尾楼照搬会把烂尾刻进新楼);本侧恒空由 wbtest 锚锁定,serve_smoke 只锁段数组形态;③ params.completion 键存在即 fail loud 报 protocol 错(M15 无 MoonBit 实现——不支持而非静默假空;显式 null 亦算键存在——oracle params.get 对 Some(Null) 走 error 帧同形,2026-10-02 审阅 P2 修复;无键时两侧同 [])。confidence 的 wire 形态已对齐 oracle(2026-10-02 审阅 P1 销案):oracle json! 走 Value 路径、f32 先提升 f64 ⇒ wire = f64 最短文本(2/3 → 0.6666666865348816);原登记「f32 最短表示(serde_json f32 同形)」系对序列化路径的误判(f32_shortest_text 已删),现 = 值面 round_to_f32(位模式对齐 as f32)+ 文本面 double_to_json_text(f64 ryu-pretty 单源) probe 三分叉已定案(①③ 形态差长期 / ② 挂 #32 退役后重设计——analysis 批 2026-10-04 收官)
3 wasm-gc 形态 quote-include:无文件系统,include 解析为 E1021(宿主注入文件表是扩展位) 视宿主需求
4 capabilities 不带 abi_version/engine_version(wasm 产物版本自检走 mooncakes 版本号) 形态差异,长期
5 Host Contract 三态对账——已完成(2026-10-04,scripts/host_contract_map --strict 103/103):14 条缺失锚全补(math 基本值族 10 + scanf B43 + strcpy 高边界/NULL + heap_offset 单调——host 112→126);CI moonbit job 已切 --strict 收官门(missing=0) S8 窗口 ✅ 已收官
6 Differential Stress(同函数强制 Host/Bytecode 双路由) libc 机制已裁定(S9 判定书 §6:单一路由表已落——判定书时点 86 Bytecode + 2 改判 + 108 Host;现值实测锚:Bytecode 预注册锚 83、改判集 5〔is_host_rerouted,批三段一 2→5:strncpy/memcpy/memmove 等改判 Host〕、Host 函数名 110〔HOST_FUNC_NAME_COUNT,route.mbt〕)——本项列单侧演化批候选(与 #32/#33 同列,不进 0.9.0)
7 Fuzz 直拍模式(随机生成 C 程序 → Vitro vs Clang) 脱钩已完成(2026-10-05 工序④),触发条件满足,列演化批候选(判定书 §6/§4.3:路 B 必建项、时机后延——csmith 裁剪工程量,开工前置探针 = 子集裁剪可编译率;路 A 不变量自检已随工序④建成〔de9c9b2b〕;issue #33)
8 DIFF-LIB-PUTCHAR-01 语料闭环(putchar≥128 的 golden 差异锚) 已闭环(2026-10-04):putchar_range 语料转正(cases/gap/ +1,shadow known_issue 连坐 +1 = 1) 已落
9 serve 帧 JSON 键序跨语言分叉(2026-10-01 审阅 P2 实测定案):Rust 出口经 serde_json::Value(Map=BTreeMap 未开 preserve_order)⇒ 一切键字典序;MoonBit 手写 emitter 按插入序(StepPayload 14 字段 Rust 输出 accessed_vars, algorithm_step, … vs 本侧 step_index, code_line, …)。经 canonicalize(键排序)后 dump 族 8/8 SAME、step 族语义一致、客户端不依赖键序——比较口径 = serve 帧一律经 canonicalize;逐字节对拍必红属预期,非缺陷(protocol_frames 现为单臂 vs 冻结基线形态——oracle 臂已随删区退役,canonicalize 口径不变) 形态差异,长期
10 step 流 trap 语义两侧分叉(issue #29,2026-10-03 实测):oracle(Rust)的 step.next 在 trap 后不终止——每批 rollback→重执行 trap 指令→再 Trap(UAF 程序实测 45 批内首批 trap 后 23 批全部继续产帧),且 trap_message 恒空串(vm.get_error 抓取时机/回滚序差异);本侧实现终态粘性(is_trapped + 死因留存——trap 批后空批 + trapped=true + trap_message 照报,消费方见 trapped 即停;端到端实测后续 22 空批仅 1 冲刷批)。mb 侧为正确语义,oracle 已随 2026-10-05 删区退役收敛(本条现为单实现叙事留档;dump 族只读语义同款拍板模式);seek 重放遇 trap 的置位连坐(失败也记终态)。另:step.begin 的 argv 为会话级(run 通道 params.argv 写入后 step 流复用,双臂实测同形)——step.begin(params.argv) 两侧同构忽略,非分叉 oracle 随退役收敛。【2026-10-03 M14 连锁补充】oracle 的 root_cause_hint 亦恒 null——engine.rs:209 装配代码在,但上游 trap_message 恒空串 ⇒ analyze_trap 分派全不命中;mb 侧已全量接线(trace_analyzer 六分析器照搬 + run_batch Trap 装配,UAF 端到端 wire 实测全量)——同根因随退役收敛。删区回灌(2026-10-07):oracle 臂已物理删除,protocol_frames 转单臂 vs 冻结基线形态。D 桶收口(2026-10-09,refs #47 批五):基线已翻转 MoonBit 臂真值,本条与 #11/#12 的值 mask 行随基线翻转删除——step trap 语义/root_cause_hint 面现为 MoonBit 单实现真值冻结
11 oracle session 级 heatmap 跨 run 残留(protocol_frames 首跑实测,2026-10-04;oracle 已删区退役):oracle step.begin 重建 vm 但不清 session.runtime.heatmap(U2#11 它在快照态)⇒ 热力图被同会话历史 run 污染(fib 场景 seek 帧 12 = 前两 run 残留 vs 本侧 2 = 本次干净累计)——教学展示缺陷族;本侧重建即清(⑤-5.1 重放确定性口径)。D 桶收口(2026-10-09):heatmap-count-mask 已删,heatmap_count 恢复真值冻结(基线翻转 MoonBit 臂) oracle 缺陷,已随删区退役收敛;豁免面已随 D 桶清除
12 oracle session.reset 丢弃会话级 max_steps(protocol_frames 首跑实测,2026-10-04;oracle 已删区退役):oracle reset 后回默认 1000 万(config.set 5000 丢失),与帧内自宣文案「清空编译/运行状态,保留会话级配置」矛盾;本侧 SessionConfig 值对象保留(符合自宣)。D 桶收口(2026-10-09):reset-max-steps-mask 已删,max_steps 恢复真值冻结(基线=5000 保留语义在案) oracle 缺陷,已随删区退役收敛;豁免面已随 D 桶清除
13 未知方法错误文案清单:本侧错误帧附带已接方法清单(教学可调试性增强,2026-10-04 定性);oracle 裸方法名。D 桶收口(2026-10-09):基线翻转 MoonBit 臂后清单入基线真值,unknown-method-listing-del 删除——清单面恢复值冻结(方法表扩张须连坐基线刷新) 分叉已随基线翻转收敛

维护义务:① 类条目修复后划线销案(连坐 CHANGELOG Fixed + 台账转 resolved-verified);本清单为差异台账(scripts/diff_ledger/ledger.json)的人工导读层;as-of 随发版刷新(当前 = S9 修复批工作区态,0.9.0 发版时刷新)。