问题标签 [undefined-behavior]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1786 浏览

c++ - 读取不确定值未定义行为吗?

问题的答案的评论中出现了这个问题,当类型转换为 int 时,C/C++ bool 类型总是保证为 0 或 1?

有问题的代码分配了一个(本地)数组bool而不初始化它们的值。

显然,其中的值b是不确定的。

一些评论者认为阅读 egb[0]是未定义的行为。这在 C++ 标准中的任何地方都有说明吗?我仍然坚信相反的观点:

  1. 显然分配了存储并且基本 bool 类型的初始化已完成,因为它没有构造函数。因此,它肯定与取消引用未初始化的指针或在未初始化的非平凡对象上调用方法/强制转换运算符不同。标准似乎涵盖了这些特定情况。

  2. 这种行为在 C 中确实是未定义的:在 C中声明的、未初始化的变量会发生什么?它有价值吗?一些受访者似乎混淆了这两者。

  3. 在最新的 C++0x 草案中,我找不到不确定值的定义,尤其是没有允许访问此类值以触发处理器陷阱的定义。事实上,Bjarne Stroustrup 不确定什么是不确定值:http: //zamanbakshifirst.blogspot.com/2007/02/c-indeterminate-value.html

0 投票
7 回答
4695 浏览

c++ - C++ 标准究竟在哪里说取消引用未初始化的指针是未定义的行为?

到目前为止,我找不到如何推断以下内容:

是未定义的行为。

首先,有 5.3.1/1 声明这*意味着间接转换T*T. 但这并没有说明UB。

然后经常引用 3.7.3.2/4 说,在非空指针上使用释放函数会使指针无效,然后无效指针的使用是 UB。但在上面的代码中,没有关于释放的内容。

上面的代码中如何推导出UB?

0 投票
3 回答
395 浏览

c++ - 通过 const_cast 进行的 const 初始化是否具有未定义的行为?

根据我的小测试,此代码有效。但是,它有未定义的行为吗?在我之前的测试中,通过使用 const_cast 修改 const 对象导致了运行时访问冲突,但我不记得它们有何不同。那么,这里是否存在根本性的问题?



(请注意 sizeof(bigLut_t) 太大而无法放入堆栈。)

编辑:我实际上最喜欢 ybungalobill 的小评论中的想法,最适合初始化这些大对象的方法:


0 投票
3 回答
257 浏览

c++ - 返回一个前向声明的结构未定义的行为吗?

我有以下代码(为简单起见,省略了包含守卫):

= foo.hpp=

= main.cpp=

= foo_generator.hpp=

= foo_generator.cpp=

就目前而言,这段代码编译得非常好,没有任何警告。如果我的理解是正确的,它应该输出:

但相反,它随机显示:

或者只是崩溃。

如果我用 替换 FOO 的前向声明foo_generator.hpp#include "foo.hpp"那么它可以工作。

所以这是我的问题:返回一个前向声明的结构会导致未定义的行为吗?或者什么可能出错?

使用的编译器:MSVC 9.0 和 10.0(都显示问题)

0 投票
3 回答
1539 浏览

c++ - 删除指向自动变量的指针

请看这段代码

这段代码的结果是什么?尤其是第 3、5 和 7 行?他们会调用未定义的行为吗?输出会是什么?

编辑:我尝试使用 g++ 运行它,它正在编译和运行良好!我在 Windows 7 上使用 MinGW。

标准在这种情况下怎么说?

0 投票
2 回答
1871 浏览

c++ - (++i)++ 是未定义的行为吗?

(++i)++未定义的行为吗?在检索增量对象以进行后缀增量操作后,前缀增量的副作用是否可能发生?这对我来说似乎很奇怪。

我的直觉说这在 C++03 中是未定义的,在 C++11 中是明确定义的。我对吗?

0 投票
1 回答
441 浏览

fortran - Fortran 90中意图(输出)拼接数组的未定义行为?

当我这样做时,我遇到了非常奇怪的行为。我认为这是问题的根源,但我可能是错的。如果你们中的任何人都可以确认这确实是未定义的行为,我至少会知道发生了什么

假设我有(不假装编译)

我的问题是:我在做一些奇怪的事情吗?我觉得意图(出)未定义整个块,即使我通过了一个切片,我也需要一个 inout。你能从标准中确认吗?

编辑: inout 给出相同的未定义行为,但将非切片数组传递给 Sub 有效。这是否意味着传递切片数组来初始化子块是违反标准的?

谢谢

0 投票
2 回答
536 浏览

c++ - C++03 和 C++11 之间的未定义行为有什么区别?

新标准与旧标准具有不同的未定义行为。例如,新的排序规则意味着一些以前未定义的算术运算(由于序列点之间的多次写入等原因)现在被定义了。

那么,对于未定义的行为,我们需要重新学习什么?

0 投票
2 回答
783 浏览

c++ - Virtual Constructor Idiom - Virtuous or Complete Utter Fallacy

C++ 中的黄金法则之一是实例的生命周期从其构造函数成功完成时开始,并在其析构函数开始时结束。

根据这条规则,我们得出结论,在构造函数中调用虚方法不是一个好主意,因为可能的派生实例无效,这将导致未定义的行为。

C++ FAQ 20.8中提到的 Virtual Constructor Idiom似乎表明相反的情况。

我的问题是:

  • 标准中定义对象相对于构造函数和析构函数调用的生命周期的确切定义是什么?
  • 此外,所谓的“Virtual Constructor Idom”是否有效?
0 投票
4 回答
629 浏览

c++ - 非虚拟析构函数的未定义行为 - 这是现实世界的问题吗?

考虑以下代码:

我的理解是 C++ 标准说删除 b 是未定义的行为 - 即,任何事情都可能发生。但是,在现实世界中,我的经验是 ~A()总是被调用,并且内存被正确释放。

如果 B 引入任何具有自己的析构函数的类成员,它们将不会被调用,但我只对上述简单的情况感兴趣,其中使用继承可能修复源代码所在的一个类方法中的错误不可用。

显然,在非平凡的情况下,这不会是您想要的,但至少是一致的。对于显示的代码,您是否知道没有发生上述情况的任何C++ 实现?