【问题标题】:Is it possible to have UB by default?默认情况下可以有UB吗?
【发布时间】:2019-11-15 20:57:08
【问题描述】:

所以,我一直在阅读 the C++ standard 并来到 [defns.undefined](我正在阅读的 C++17 草案中的 3.27。请注意,虽然我在这里引用 C++17,但我'在other standards) 中找到了类似的措辞——这是未定义行为的定义。我注意到这个措辞(强调我的):

注意:当本国际标准省略任何明确的定义时,可能会出现未定义的行为 行为或当程序使用错误的构造或错误的数据时

现在,考虑到这一点,这是有道理的。有点意思是,如果标准没有为它提供行为,它就有未定义的行为。似乎是在说,如果你做的事情超出了标准的范围,标准就没有什么可说的了。这是有道理的。

然而,这也有点奇怪,因为我一直认为未定义的行为必须由标准明确声明。然而,这似乎暗示我们应该假设未定义的行为,除非我们另有说明。

如果是这种情况,那么由于标准没有明确地为某些构造提供行为,是否会有未定义行为的实例是未定义行为?如果这样的事情是可能的,是否有可能生成一个未定义行为的示例(仍然可以编译),因为这个措辞是未定义的行为,或者任何属于这种情况的东西都在附近由于某种原因无法构建?

【问题讨论】:

标签: c++ language-lawyer undefined-behavior


【解决方案1】:

如果是这种情况,那么由于标准没有明确地为某些构造提供行为,难道没有未定义行为的实例是未定义行为吗?

我认为这是正确的观点。如果标准“意外地”省略了对特定构造行为方式的规范,但我们都知道“应该”明确定义,那么它就是标准中的缺陷,需要修复。另一方面,如果它是一个“应该”是 UB 的构造,那么该标准已经“正确”(尽管明确有好处)。

例如,如果对象的构造函数尚未开始执行或析构函数已完成,则标准未提及如果将 typeid 应用于多态类类型的左值会发生什么。因此,行为是未定义的遗漏。这也是“显然”UB的东西。所以没有问题。

【讨论】:

  • 优秀。感谢您生成示例。
  • 我认为向量的连续性是那些“偶然的 UB”之一;它已在 C++03 中修复。
  • 鉴于 C 标准的作者明确认识到,如果无法有意义地处理任何非人为和无用的程序,那么质量差的实现可能会符合要求,我认为他们并不担心关于显而易见的事情是否被实际定义,或者考虑到某些这样的事情实际上并未被定义为“缺陷”。
【解决方案2】:

是否有可能生成一个未定义行为的示例(仍然可以编译),因为这个措辞是未定义行为

经典示例是通过空指针 (CWG232) 进行间接寻址:

*(int*)nullptr;

[expr.unary.op]/1 表示应用间接运算符的结果是一个左值,它表示运算符的参数指向的对象,而空指针不指向任何对象。因此,通过空指针的间接是 UB,因为在参数不指向对象的情况下省略了明确的行为定义。

【讨论】:

  • 顺便说一句,就我个人而言,我不喜欢这个例子,也不觉得它 100% 有说服力。
  • 这是一个令人不安的例子,因为并非所有左值都引用现有对象。
猜你喜欢
  • 2019-02-28
  • 2022-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2012-02-29
  • 2019-05-21
  • 1970-01-01
  • 2011-04-17
相关资源
最近更新 更多