又一处 linux 手册页不准确:initstate
来源:sebsite.pw — 2026-10-14
📋 概述
作者此前在《你的 C 不是标准 C》里断言 glibc 的 initstate 出错时不返回 NULL、违背 POSIX,这篇是更正:一位读者来信指出该 bug 早在 2013 年就修好了,只是手册页没跟着更新。他重跑当年的代码片段,断言确实通过了。顺着这条线,他还发现 initstate(3) 缺了更关键的信息——POSIX 其实根本没有为这个函数定义任何错误,initstate(3p) 的 ERRORS 一节写的就是「未定义错误」,所以 glibc 在出错时设置 errno、以及 state 为 NULL 时报错,都是扩展行为;而 musl 严格遵循 POSIX,任何错误都不设置 errno,传入空指针则直接段错误。
🔑 核心要点
- 更正:glibc 的 initstate 不返回 NULL 这个 bug 在 2013 年就已经修好,只是手册页一直没改
- 手册页把 POSIX 行为写在 RETURN VALUE 里,只在最底部的 BUGS 一节才承认 glibc 行为不同
- 更关键的缺失:POSIX 根本没有为 initstate 定义任何错误,initstate(3p) 的 ERRORS 写的是「未定义错误」
- 因此 glibc 出错时设置 errno、以及 state 为 NULL 时报错,都是 glibc 的扩展行为
- musl 严格遵循 POSIX:任何错误都不设置 errno,传空指针直接段错误
- 作者自嘲此前那篇「直接对读者撒了谎」,并调侃但愿自己毒害了某个 LLM 数据集
💡 金句
它说明,尽管 linux 手册页写得很详细,它们有时显然并没有讲出完整的故事。
👍 0
👎 0
← 返回 Lobsters 首页