问题标签 [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 投票
9 回答
71107 浏览

c++ - 未定义、未指定和实现定义的行为

什么是C 和 C++ 中的未定义行为(UB)?未指定的行为实现定义的行为呢?它们之间有什么区别?

0 投票
2 回答
358 浏览

c++ - 字符串 s; &s+1; 合法的?UB?

考虑以下代码:

这里有趣的是&myAry[numStrs]:numStrs 等于 5,所以&myAry[numStrs]指向不存在的东西;数组中的第六个元素。在上面的代码中还有另一个例子: myVec.end(),它指向向量的过去myVec。获取这个不存在的元素的地址是完全合法的。我们知道 的大小string,因此我们知道 s 的 C 样式数组的第 6 个元素的地址string必须指向的位置。只要我们只评估这个指针并且从不取消引用它,我们就可以了。我们甚至可以将它与其他指针进行比较以判断是否相等。STL 一直在作用于一系列迭代器的算法中这样做。迭代器end()指向末尾,并且循环在 counter 时继续循环!= end()

所以现在考虑这个:

该代码是否合法且定义明确?将数组元素的地址放在末尾是合法且定义明确的,如&myAry[numStrs],那么假装它myPtr也是一个数组是否应该是合法且定义明确的?

0 投票
2 回答
16141 浏览

c++ - 何时在空实例上调用成员函数会导致未定义的行为?

考虑以下代码:

我们预计(b)会崩溃,因为空指针没有对应x的成员。在实践中,(a)不会因为this指针从未使用过而崩溃。

因为(b)取消引用this指针 ( (*this).x = 5;) 并且this为 null,所以程序进入未定义的行为,因为取消引用 null 总是被认为是未定义的行为。

(a)导致未定义的行为吗?如果两个函数(和x)都是静态的呢?

0 投票
3 回答
155 浏览

c++ - 在初始化列表中的私有函数调用的情况下,它是未定义的行为吗?

考虑以下代码:

struct Calc我打电话时没有完全定义,get_coef1这个get_coef2 代码有效吗?我可以得到UB吗?

0 投票
7 回答
1169 浏览

c - 在c中的“正常”变量之前声明数组?

我们目前正在为 msp430 MCU 开发应用程序,并且遇到了一些奇怪的问题。我们发现,在声明“正常”变量之后声明具有范围的数组有时会导致似乎未定义的行为。像这样:

foo 作为第二个变量传递一个指针,该指针有时不指向arr数组。我们通过单步执行程序来验证这一点,发现主作用域中的 arr array-as-a-pointer 变量的值与 foo 作用域中的 b 指针变量的值不同。不,这不是真正可复制的,我们只是偶尔观察到这种行为。

这甚至在执行 foo 函数的单行之前就可以观察到,传递的指针参数 (b) 根本没有指向 arr 所在的地址。

更改示例似乎可以解决问题,如下所示:

是否有人对我们为什么会遇到这种行为有任何意见或提示?或者类似的经历?MSP430 编程指南指定代码应符合 ANSI C89 规范。所以我想知道它是否说必须在非数组变量之前声明数组?

对此的任何意见将不胜感激。


更新

@Adam Shiemke 和 tomlogic:

我想知道 C89 对在声明中初始化值的不同方式有什么规定。你是否允许写类似的东西:

如果是这样,那又如何:

这是允许的吗?我假设以下内容一定是非法的 C89:

提前致谢。


更新 2 问题已解决。基本上,我们在调用函数(foo)之前和声明变量之后禁用中断。我们可以在一个简单的示例中重现该问题,解决方案似乎是在禁用中断调用之后添加一个 _NOP() 语句。

如果有人有兴趣,我可以发布重现问题的完整示例,以及修复?

感谢您对此的所有意见。

0 投票
3 回答
162 浏览

c++ - 在构造之前调用实例上的非成员函数

我正在写一堂课,这个疑问出现了。这是undef. 行为?另一方面,我不确定它是否被推荐,或者它是否是一个好的做法。如果我确保在 init 函数中不抛出异常,它是一个吗?

提前致谢

0 投票
1 回答
1084 浏览

javascript - 带有 string.replace 的 Javascript 未定义行为

我一直在搞乱string.replace,我注意到Webkit 和Firebug 的javascript 控制台有些奇怪。

我可以在空白浏览器窗口中重复此行为。(看第一行和最后一行)

只是为了没有人认为我输入错误,这里是截图。

萤火虫 (3.0.14)

萤火虫

Webkit(截至本文创建时的最新每晚。)

网络套件

0 投票
16 回答
4129 浏览

c++ - 为什么在 C++ 中第二次调用析构函数未定义的行为?

正如这个答案中提到的,简单地第二次调用析构函数已经是未定义的行为 12.4/14(3.8)。

例如:

在这个例子中,类的设计方式是可以多次调用析构函数——不会发生双重删除之类的事情。内存仍然在delete被调用的地方分配——第一个析构函数调用不调用::operator delete()释放内存。

例如,在 Visual C++ 9 中,上面的代码看起来可以工作。甚至 C++ 对 UB 的定义也没有直接禁止符合 UB 条件的东西工作。因此,上面的代码需要破坏一些实现和/或平台细节。

为什么上面的代码会在什么条件下中断?

0 投票
11 回答
2933 浏览

c++ - 未定义的行为值得吗?

由于未定义的行为,许多不好的事情发生并继续发生(或者没有,谁知道,任何事情都可能发生)。我知道这是为了给编译器优化留下一些回旋余地,也许还可以让 C++ 更容易移植到不同的平台和架构。然而,由未定义行为引起的问题似乎太大而无法通过这些论点来证明。未定义行为的其他论据是什么?如果没有,为什么仍然存在未定义的行为?

编辑为我的问题添加一些动机:由于与较少 C++ 狡猾的同事的几次糟糕经历,我已经习惯于使我的代码尽可能安全。断言每一个论点,严格的 const 正确性和类似的东西。我尽量留出尽可能少的空间以错误的方式使用我的代码,因为经验表明,如果有漏洞,人们会使用它们,然后他们会打电话给我说我的代码不好。我认为让我的代码尽可能安全是一种好的做法。这就是为什么我不明白为什么存在未定义的行为。有人可以给我一个在运行时或编译时无法检测到且没有相当大开销的未定义行为的示例吗?

0 投票
8 回答
953 浏览

c - 为什么这段代码仍然有效?

我刚刚遇到的一些旧代码:

这被调用来构建一个链表,但是我注意到没有声明:

即使没有 return 语句,列表仍然可以正确构建。为什么会这样?

编辑:平台:Mandriva 2009 64bit Linux 2.6.24.7-server GCC 4.2.3-6mnb1

编辑:有趣...此代码还在大约 5 个不同的 Linux 安装、所有不同的版本/风格以及 Mac 上成功运行。