问题标签 [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 回答
269 浏览

c++ - 在这种情况下捕获访问冲突是否安全?

我读了很多书,包括这里的 SO,这表明这通常是一个非常糟糕的主意,你唯一可以安全地做的就是退出程序。我不确定这是不是真的。

这是用于将大量分配交给 malloc 的池化内存分配器。在 pool_free() 期间,需要检查指针是否属于池或使用 malloc 分配。通过将地址向下舍入到最近的 1MB 边界,我得到了一个指向池中内存块开头的指针,或者如果使用了 malloc,则为 undefined。在第一种情况下,我可以轻松地验证内存块是否属于池,但是,如果不是,我将无法通过此验证,或者我将遇到访问冲突(请注意,这是一个只读进程)。我不能用 SEH (Windows) 捕捉到这一点或处理信号 (POSIX) 并简单地将其视为失败的验证吗?(即只有在使用 malloc 时才有可能,因此将 ptr 传递给 free())

编辑:人们似乎缺少上面的 OR。如果指针是用 malloc 分配的,我不希望出现访问冲突,但这是一种可能的结果。使用指向块开头(在 1MB 边界处)的指针的过程是验证幻数,然后跟随指向内存池的指针,并检查它是否确实包含上述​​指向块的指针。如果这些只读步骤中的任何一个产生访问冲突,它肯定会失败验证,就像任何单个步骤失败一样。

0 投票
3 回答
254 浏览

ruby - 为什么在 Ruby 中,一个 || 1 当 `a` 未定义时会抛出错误,但是 a = a || 1不会?

a未定义时,a || 1会抛出错误,但a = a || 1不会。是不是有点不协调?

0 投票
8 回答
26986 浏览

c++ - 除以零:在 C 和/或 C++ 中定义的未定义行为或实现?

关于除以零,标准说:

C99 6.5.5p5 - / 运算符的结果是第一个操作数除以第二个的商;% 运算符的结果是余数。在这两种操作中,如果第二个操作数的值为零,则行为未定义。

C++03 5.6.4 - 二元 / 运算符产生商,二元 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义。

如果我们从表面上看上面的段落,答案显然是两种语言的未定义行为。但是,如果我们进一步查看 C99 标准,我们会看到以下段落似乎是矛盾的 (1):

C99 7.12p4 - 宏 INFINITY 扩展为浮点类型的常量表达式,表示正或无符号无穷大(如果可用);

标准是否有某种黄金法则,即未定义的行为不能被(可能)矛盾的陈述所取代?除此之外,我认为如果您的实现定义了 INFINITY 宏,那么除以零被定义为这样的结论是不合理的。但是,如果您的实现没有定义这样的宏,则行为是未定义的。

我很好奇这两种语言在这个问题上的共识是什么(如果有的话)。如果我们谈论整数除法int i = 1 / 0与浮点除法,答案会改变float i = 1.0 / 0.0吗?

注意 (1) C++03 标准谈到了<cmath>包含 INFINITY 宏的库。

0 投票
10 回答
2693 浏览

c++ - 如何发现未定义的行为

有没有办法知道你的程序在 C++(甚至 C)中是否有未定义的行为,而不是记住整个规范?

我问的原因是我注意到很多程序在调试但没有发布的情况下是由于未定义的行为。如果有一个工具至少可以帮助发现 UB,那就太好了,所以我们知道存在问题的可能性。

0 投票
3 回答
2015 浏览

c++ - C++ 中的命名空间别名

众所周知,添加声明/定义会namespace std导致未定义的行为。此规则的唯一例外是模板特化。

那么下面的“hack”呢?

就标准而言,这真的定义得很好吗?当然,在这种情况下,我真的没有添加任何东西namespace std。我测试过的每个编译器似乎都乐于接受它。


在有人发表类似“你为什么要那样做?”的评论之前。——这只是为了满足我的好奇心……

0 投票
5 回答
3594 浏览

c++ - 我可以获取数组的最后一个元素的地址吗?

可能重复:
通过下标获取一个过去的数组元素的地址:C++ 标准是否合法?

最后一行是否有效?

0 投票
2 回答
350 浏览

visual-c++ - 这是 ATL::CComVariant 中的自分配错误吗?

ATL::CComVariant少数赋值运算符。我在实现中看到的是赋值运算符接受LPCOLESTRIUnknown*或者IDispatch*第一个动作是调用Clear()

如果以这样一种方式调用运算符,即传递同一对象的成员变量

(具有相同效果的笨方法较少)Clear()将释放封装的对象,并且对现在悬空指针的所有后续操作将导致未定义的行为。

我是正确的还是我误解了什么?

0 投票
7 回答
615 浏览

c - C 中带有 char 数组的未定义行为 (?)

当我尝试

strlen(bla) < i < 32bla[i]总是\0。但这实际上不是未定义的行为,应该避免吗?

0 投票
9 回答
1622 浏览

c++ - 在这里显式调用析构函数会导致未定义的行为吗?

在我看来,以下代码(来自一些 C++ 问题)应该导致 UB,但似乎不是。这是代码:

答案是:

我从 c++ faq lite 中了解到,我们不应该显式调用析构函数。我认为在显式调用析构函数之后,应该删除对象 s 。程序完成后会自动再次调用析构函数,应该是UB。但是,我在 g++ 上进行了尝试,并得到与上述答案相同的结果。

是因为类太简单(不涉及新/删除)吗?或者在这种情况下根本不是UB?

0 投票
4 回答
368 浏览

c++ - 表达式的行为:已定义还是未定义?

我有以下代码

我的朋友告诉我,Expression A他的行为定义明确,但我不确定他是否正确。

根据他的说法,函数在两者之间f()引入了一个sequence point,因此行为是明确定义的。

有人请澄清。

PS:我知道我们不应该出于实际目的编写这样的代码。只是为了学习。:)