Skip to content

Commit cefa12a

Browse files
committed
docs(spec): §8.7/§8.8 —— 又两条被判据抓住的问题
1 parent 74908f3 commit cefa12a

1 file changed

Lines changed: 59 additions & 0 deletions

File tree

‎.agents/docs/2026-08-25-mcpp-target-vocabulary-spec.md‎

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,3 +774,62 @@ tree 0.8.0 → exit 1 1.0 以下,minor 前进即为破坏性
774774
`SURFACE.txt` 和 README 的表是同一份清单的四种陈述,而 CI 只比对前三种 ——
775775
表面检查器读的是 `SURFACE.txt` 和头文件,README 对它来说是散文。这就是一行
776776
能在若干次发布里一直缺着的原因。
777+
778+
### 8.7 一处排除,两个决定
779+
780+
`openkal-llvm-runtime` 里 `!llvm/libcxx/src/random.cpp` 这条排除被删掉,对
781+
hosted 是对的 —— 它同时把 `_LIBCPP_HAS_RANDOM_DEVICE` 打开了。但 **freestanding
782+
那份配置仍是 0**,而同一次删除也波及了它:
783+
784+
```
785+
llvm/libcxx/src/random.cpp:68:1: error: use of undeclared identifier 'random_device'
786+
```
787+
788+
开关关掉时 `<random>` 不声明这个类,而 `src/random.cpp` 无条件定义它的成员 ——
789+
这个文件**自己不带守卫**,不像旁边的 filesystem 源码。
790+
791+
⚠️ **hosted 块的注释里早就写着 freestanding 的立场**("The freestanding
792+
configuration keeps the switch at 0"),只是没有人照着做。一条排除服务于两个
793+
互相不同意的配置,删它就要分别回答。
794+
795+
判据取的是**构建图**而不是「编过了」:`libcxx/src/random.cpp` 在 freestanding 的
796+
`build.ninja` 里出现 0 次(与已知被排除的 filesystem 一致),而应当在的
797+
`random_shuffle.cpp` 出现 2 次。再把排除注释掉重建 —— 复现同一条错误。
798+
799+
### 8.8 可选接口的转发者让「可选」变成了「必需」
800+
801+
`openkal.random` 是可选接口,裸机后端不提供它。而 `openkal-musl` 的系统调用
802+
分发器**无条件**引用 `kal_random_fill`,且这个分发器被链接进**每一个**程序:
803+
804+
```
805+
ld.lld: error: undefined symbol: kal_random_fill
806+
>>> referenced by okm_syscall.c:409
807+
```
808+
809+
于是一条可选接口的缺席,变成了**所有裸机程序**的链接失败 —— 哪怕它一个随机
810+
字节都不要。这是 6.1 条在另一个方向上的后果:该条把「不提供」表达为「没有定义」,
811+
而任何**无条件引用**都会把这句话翻译成「必须提供」。
812+
813+
⭐ **可选接口的转发者必须弱引用**,缺席时返回该层自己的「没有这个东西」的答案。
814+
这里是 `ENOSYS` —— Linux 系统调用 ABI 对未实现调用的定义答案,而 musl 自己的
815+
`getrandom` 正是照着它写的。
816+
817+
⚠️ **这不是 6.1 条禁止的运行期拒绝。** 那一条约束的是 **openkal 的实现**:
818+
不得提供一个运行时报告不支持的接口。弱引用发生在**层的另一侧** —— 转发者实现的
819+
是 Linux 的契约,不是 openkal 的。
820+
821+
⚠️ **惯用法和约定这个仓库本来都有,一个都没被用上**:`okm_phdr.c` 就在用
822+
`__attribute__((weak))`,而 `okm_syscall.c` 开头第 11 行写着「能被告知没有的
823+
调用返回 -ENOSYS」。
824+
825+
**这条缺陷发布出去了,而 openkal-musl 自己的 CI 一格都没看见它** —— 是下游
826+
`openkal-llvm-runtime` 的裸机程序把它顶出来的。补的检查落在**符号类别**上,
827+
不需要裸机工具链,也比一次链接更直接地陈述这个不变量;并且自带控制项:
828+
829+
```
830+
有 weak w kal_random_fill U kal_time_sleep → 绿
831+
去掉 weak U kal_random_fill U kal_time_sleep → 红
832+
```
833+
834+
只断言「random_fill 是弱的」会在符号消失或对象没被构建时同样通过,所以旁边那个
835+
**必需**接口必须仍是未定义强引用。

0 commit comments

Comments
 (0)