正在打印空指针未定义的行为

Is printing a null-pointer Undefined Behavior?

本文关键字:未定义 空指针 打印      更新时间:2023-10-16

在研究这个问题的示例代码时,我认为这是"未定义的行为",它阻止了std::cout的后续使用。但事实证明,试图打印空指针导致std::ios_base::badbitstd::ios_base::failbit被设置为其流状态,这是其不可操作的真正原因。正因为如此,我现在很好奇是否真的未定义的行为来(尝试)打印空指针。以下是我的问题:

  1. 打印空指针是未定义的行为吗?如果是这样的话,流插入器是什么原因导致了这种情况?我确信插入器足够聪明,不会取消引用空指针。

  2. 我还想知道为什么插入器在遇到这种上下文中的空指针(特别是badbit)时会设置错误掩码。为什么它不把它当作字符串文字的终止?

我手头没有Standard,到目前为止我只找到了一个不幸导致死链接的来源。

basic_ostreamoperator<<(basic_ostream<>&, const char*)函数要求char*为非null-它被设计为打印指针指向的字符串。因此,向cout发送null char*是未定义的行为。(请参见C++11 27.7.3.6.4/3"字符插入器函数模板")。

然而,basic_ostreamoperator<<(basic_ostream<>&, const void*)函数只是打印指针的值,因此空指针可以正常使用该重载。

gcc ostream.tcc第319行:

template<typename _CharT, typename _Traits>
  basic_ostream<_CharT, _Traits>&
  operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
  {
    if (!__s)
__out.setstate(ios_base::badbit);

gcc只是执行一个标准不保证的检查,这很好,因为它无论如何都是未定义的。