[英]Why are glibc printf()-functions inconsistent about null pointer formatting?
这是 Roland McGrath 的问题。
他在 1995 年 2 月 17 日添加了 vfprintf.c 作为 glibc 初始提交的一部分。这个初始版本包含针对这些特定情况硬编码的“(nil)”和“(null)”。 对此提交的唯一评论是“初始提交”。
https://github.com/lattera/glibc/blob/28f540f45bbacd939bfd07f213bcad2bf730b1bf/stdio/vfprintf.c
对于更多上下文,至少从 1994 年 5 月 27 日起,FreeBSD 4.4 中就出现了“(null)”作为字符串的使用,尽管%p
格式说明符没有特殊的字符串:
https://github.com/freebsd/freebsd-src/commit/58f0484fa251c266ede97b591b499fe3dd4f578e
C标准。 7.1.4
¶1 除非在随后的详细说明中另有明确说明,否则以下每一条语句都适用:如果函数的参数具有无效值(例如函数域之外的值,或函数地址空间之外的指针)程序,或空指针,或指向不可修改存储的指针,当相应的参数不是 const 限定的)或类型(提升后)不是具有可变数量参数的函数所期望的,行为是未定义的。
由于 C 标准没有指定如果程序员使用%s
格式说明符传递 NULL 指针会发生什么,上述一般规则适用。
IMO 这是未定义的行为,没有不一致之处。 任何使用%s
将 NULL 传递给print
函数%s
都是无效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.