正在打印空指针未定义的行为
Is printing a null-pointer Undefined Behavior?
在研究这个问题的示例代码时,我认为这是"未定义的行为",它阻止了std::cout
的后续使用。但事实证明,试图打印空指针导致std::ios_base::badbit
和std::ios_base::failbit
被设置为其流状态,这是其不可操作的真正原因。正因为如此,我现在很好奇是否真的是未定义的行为来(尝试)打印空指针。以下是我的问题:
-
打印空指针是未定义的行为吗?如果是这样的话,流插入器是什么原因导致了这种情况?我确信插入器足够聪明,不会取消引用空指针。
-
我还想知道为什么插入器在遇到这种上下文中的空指针(特别是
badbit
)时会设置错误掩码。为什么它不把它当作字符串文字的终止?
我手头没有Standard,到目前为止我只找到了一个不幸导致死链接的来源。
basic_ostream
的operator<<(basic_ostream<>&, const char*)
函数要求char*
为非null-它被设计为打印指针指向的字符串。因此,向cout
发送null char*
是未定义的行为。(请参见C++11 27.7.3.6.4/3"字符插入器函数模板")。
然而,basic_ostream
的operator<<(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只是执行一个标准不保证的检查,这很好,因为它无论如何都是未定义的。
相关文章:
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 成员访问是否在空指针上定义C++?
- boost::any 如何检查空值/未定义的值
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- C++:私有类指针成员返回未定义的值
- 返回对未定义指针的引用
- 使用无效指针初始化指针声明符的行为是否未定义?
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 强制转换为指针引用是否会导致未定义的行为
- C++编译并链接到指向未定义函数的指针
- C++数组上的指针数学中的未定义行为
- 异常未手动 - 这是空指针C++
- 通过空指针获取成员变量的地址是否会产生未定义的行为
- 在C++中删除一个空指针被认为是未定义的行为
- c++中未定义结构指针名称的typdef是如何工作的
- c++断言中的未定义行为:访问无效/空指针
- 为什么解引用空指针是未定义的行为
- 正在打印空指针未定义的行为
- 抛出自定义空指针异常