【问题标题】:Is dereferencing a NULL pointer considered unspecified or undefined behaviour?取消引用 NULL 指针是否被视为未指定或未定义的行为?
【发布时间】:2017-02-17 03:40:13
【问题描述】:

stackoverflow 问题的共识说这是未定义的行为。

不过,我最近看到了 Charles Bay 在 2016 年的演讲,题目是:
指令重新排序无处不在:C++ 的“假设”规则和序列的作用。

37:53,他显​​示以下内容:

C++ 术语

未定义行为:缺乏约束
(全局初始化的顺序)

未指定行为:违反约束
(取消引用 NULL 指针)

现在我有相互矛盾的信息。
这是一个错字吗?有什么变化吗?

【问题讨论】:

  • 这是向后的。失败!
  • 应该交换示例。这很可能是一个错字!
  • 正如纳瓦兹所说。该标准没有指定初始化全局变量/静态变量的总顺序,但它确实定义了它们初始化(以某些未指定顺序)。空指针取消引用仍然是未定义的行为。
  • @Xeo:同时,DR#315 (open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#315) 声称,如果不涉及左值到右值的转换,则可以取消引用空指针来调用成员函数。

标签: c++ pointers null undefined-behavior unspecified-behavior


【解决方案1】:

这是未定义的行为。

来自 C++11 标准的 8.3.2 References(重点是我的):

5 ... [注意:特别是,空引用不能存在于定义良好的程序中,因为创建此类引用的唯一方法是将其绑定到“对象”通过取消引用空指针而获得,这会导致未定义的行为。如 9.6 中所述,引用不能直接绑定到位域。 —尾注 ]

【讨论】:

  • 不存在......规范提到的其他地方 dereferencing nullptr 是 UB。
  • @Nawaz,我在 Note 中发现了未定义的行为位。
  • 嗯,这意味着第一个引号在这里无关紧要(如果是这样,它应该从这个答案中删除)。
  • @Nawaz,真的。我觉得很奇怪,语言的如此重要的方面会留给 Note
  • 我刚刚问了一个关于这件事的问题stackoverflow.com/questions/39860732/…,我觉得它的详细说明太严重了。 DR#315 (open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#315) 声称可以取消对空指针(标记为 NAD)的引用。然而,DR#232 (open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232) 计划允许空指针解引用自 2000 年以来一直处于“起草”阶段。相应的措辞不在标准中。
【解决方案2】:

这些示例与错误的事物相关联。无论您采用什么版本的 C++ 标准(即在这方面,标准内没有任何变化)。

取消引用 NULL 指针会产生未定义的行为。该标准没有对结果发生任何限制。

全局变量初始化的顺序是未指定行为的一个示例(标准保证所有全局变量都将被初始化[这是对全局变量如何初始化的限制],但未指定顺序)。

【讨论】:

    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2014-06-10
    • 2019-07-22
    • 2017-12-27
    • 1970-01-01
    相关资源
    最近更新 更多