打印空指针未定义行为?

时间:2014-04-25 03:44:21

标签: c++ iostream undefined-behavior null-pointer

在研究this question的示例代码时,我认为是未定义的行为,这阻止了后续使用std::cout的打印。但事实证明,attempting to print a null pointer caused std::ios_base::badbit and std::ios_base::failbit to be set in its stream state这是其不可操作的真正原因。因此,我现在很好奇它是否真的 未定义行为(尝试)打印空指针。所以这是我的问题:

  1. 打印空指针是未定义的行为吗?如果是这样,那么流插入器会导致什么呢?我非常确定插入器足够智能,不会取消引用空指针。

  2. 我还想知道为什么插入器在此上下文中遇到空指针时设置其错误掩码(特别是badbit)。为什么它不像字符串文字的终止那样对待它?

  3. 我没有标准的方便,到目前为止我只发现了一个来源,不幸导致死链接。

2 个答案:

答案 0 :(得分:11)

basic_ostream的{​​{1}}函数要求operator<<(basic_ostream<>&, const char*)为非null - 它旨在打印指针指向的字符串。因此,将char*发送到char*是未定义的行为。 (参见C ++ 11 27.7.3.6.4 / 3“字符插入器功能模板”)。

但是,cout的{​​{1}}函数只是打印指针的值,因此空指针可以正常处理该重载。

答案 1 :(得分:2)

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只是执行标准不保证的检查,这很好,因为它无论如何都是未定义的。