当前位置: 首页 > 知识库问答 >
问题:

未定义的行为必须被定义为未定义的行为吗?

田昊天
2023-03-14

尽管标题出现了,但这并不是一个哲学问题。

从未初始化的数组读取

  • 使用错误数据
  • 使用不可移植构造。(即内存分配的细节1)
  • 导致具有
  • 的行为
  • 标准没有要求产生可预测的效果

我会称之为“未定义的行为”。但也许我错过了什么(?)

    null
    null

共有1个答案

越涛
2023-03-14

不,行为在未定义、禁止“不得”或明确标记为未定义时是未定义的。以下是C标准第4条“一致性”第2段中对这些东西的定义:

如果在约束或运行时约束之外出现的“shall”或“shall not”要求被违反,则该行为是未定义的。未定义的行为在本国际标准中以“未定义的行为”或省略行为的任何明确定义表示。这三者在侧重点上没有区别;它们都描述了“未定义的行为”。

 类似资料:
  • 本文向大家介绍C++未定义行为(undefined behavior),包括了C++未定义行为(undefined behavior)的使用技巧和注意事项,需要的朋友参考一下 衡量一个人是否真正活着的根本方法,就是看他是否有意愿、有能力做出主动的选择。 在计算机程序设计中,未定义行为(undefined behavior)是指行为不可预测的计算机代码。这是一些编程语言的一个特点,最有名的是在C语言

  • 问题内容: 什么是“序列点”? 未定义行为与序列点之间有什么关系? 我经常使用诸如的有趣且令人费解的表情a[++i] = i;来使自己感觉更好。为什么我应该停止使用它们? 问题答案: C 98和C 03 此答案适用于C 标准的较旧版本。该标准的C 11和C ++ 14版本没有正式包含“序列点”。操作是“先于”或“未排序”或“不确定地排序”。最终效果基本相同,但是术语不同。 免责声明:好的。这个答案

  • 在本网站的最后一节中,他们提供了 作为由于函数参数中子表达式的未排序求值而导致的未定义行为的示例。但是,由于在计算所有函数参数和函数指示符之后,在实际函数调用之前,存在一个序列点,始终使用 调用 f,并且分配。有没有可能不发生这种情况?

  • 我在chrome控制台中写了这样的表达式: 它返回:

  • 问题内容: var x int done := false go func() { x = f(…); done = true } while done == false { } 这是Go代码。我的恶魔告诉我,这是UB代码。为什么? 问题答案: Go Memory Model不保证该程序将始终遵守在goroutine中写入x的值。go常规销毁 部分中提供了一个类似的错误程序作为示例。 在本节中,G

  • 今天我遇到了一些在clang(3.7-git)、g(4.9.2)和Visual Studio 2013上表现出不同行为的代码。经过一些简化,我想出了这个突出问题的片段: g(4.9.2)给出了以下输出: 所以g将参数计算到缓冲区,然后缓冲区(...)本身,然后将索引参数计算到数组运算符。直观地说,这对我来说是有意义的。 clang(3.7-git)和Visual Studio 2013都提供: 我