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

objective-c - 我可以使用类别来覆盖本身在超类类别中的方法吗?

是否定义了将调用 -myMethod 的哪个实现?

Kochan 在 Objective-C 编程中指出:

如果多个类别为同一个类声明了同名的方法,则不定义调用时将执行哪个方法。

但我不确定在这种情况下,超类上的类别是否被视为同一类上的类别。

0 投票
8 回答
1608 浏览

c - 这是未定义的 C 行为吗?

C 编程教授向我们的班级提出了这个问题:

您将获得以下代码:

它总是会产生什么输出?

大多数学生表示不确定的行为。谁能帮我理解为什么会这样?

感谢您的编辑和答案,但我仍然感到困惑。

0 投票
3 回答
328 浏览

c++ - 通过间接使指针集无效

考虑以下程序。它创建一组指向整数的指针,并使用自定义的 indrect_less 比较器,该比较器根据指向的整数的值对集合进行排序。完成此操作后,我将更改指向整数之一的值。然后,可以看到集合的顺序不再排序(我想是因为集合不知道有什么改变了)。

(不要介意 C++0x 循环,我在 VS2010 上运行)

1)我在调用未定义的行为是对的吗?行后整个状态是否myset无效*a = 9;

2)这样做是擦除然后重新插入的唯一正确方法a吗?

3)有什么方法,一旦*a = 9;运行,重新平衡集合到排序顺序,具有明确定义的行为?

0 投票
1 回答
1085 浏览

c - C中的隐式声明

以下程序是否Undefined Behaviour在 C 中调用?

在上面的程序中有一个隐式声明printf(),那么上面的代码是完全符合标准的还是它只是有一些特定于实现的行为?

0 投票
6 回答
104 浏览

c++ - UB 可以导致多个单线程应用程序运行产生不同的输出吗?

对于相同的输入,满足以下条件的代码是否可以为每次运行产生不同的输出?

  • 该代码是单线程的,尽管它确实链接到一个线程安全的运行时库。
  • 没有明确调用 rand() 或 time() 或它们的朋友。
  • 有一些堆内存分配。
  • 可能有一些(错误的)代码会导致未定义的行为。
0 投票
8 回答
15845 浏览

c++ - 优化“while(1);” 在 C++0x 中

已更新,见下文!

我听说并读到 C++0x 允许编译器为以下代码段打印“Hello”

它显然与线程和优化能力有关。在我看来,这可能会让很多人感到惊讶。

有人对为什么有必要允许这样做有很好的解释吗?作为参考,最新的 C++0x 草案在6.5/5

在 for 语句的情况下,在 for-init 语句之外的循环,

  • 不调用库 I/O 函数,并且
  • 不访问或修改易失性对象,并且
  • 不执行同步操作(1.10)或原子操作(第 29 条)

可以假定由实现终止。[ 注意:这旨在允许编译器转换,例如删除空循环,即使无法证明终止也是如此。——尾注]

编辑:

这篇有见地的文章谈到了标准文本

不幸的是,没有使用“未定义的行为”一词。但是,只要标准说“编译器可能假定 P”,就暗示具有非 P 属性的程序具有未定义的语义。

这是正确的,编译器是否允许为上述程序打印“Bye”?


这里有一个更有洞察力的线程,它是关于对 C 的类似更改,由完成上述链接文章的 Guy 开始。在其他有用的事实中,他们提出了一个似乎也适用于 C++0x 的解决方案(更新:这将不再适用于 n3225 - 见下文!)

似乎不允许编译器对其进行优化,因为它不是循环,而是跳转。另一个人总结了 C++0x 和 C201X 中的提议更改

通过编写循环,程序员要么断言循环做了一些具有可见行为的事情(执行 I/O、访问易失性对象,或者执行同步或原子操作), 要么它最终终止。如果我通过编写一个没有副作用的无限循环来违反该假设,那么我就是在对编译器撒谎,并且我的程序的行为是未定义的。(如果我很幸运,编译器可能会警告我。)该语言不提供(不再提供?)一种在没有可见行为的情况下表达无限循环的方法。


更新 3.1.2011 与 n3225:委员会将文本移至 1.10/24 并说

实现可能假设任何线程最终都会执行以下操作之一:

  • 终止,
  • 调用库 I/O 函数,
  • 访问或修改 volatile 对象,或
  • 执行同步操作或原子操作。

这个goto技巧将不再起作用!

0 投票
8 回答
10729 浏览

c - “struct hack”在技术上是未定义的行为吗?

我要问的是众所周知的“结构的最后一个成员具有可变长度”技巧。它是这样的:

由于结构在内存中的布局方式,我们能够将结构覆盖在一个大于必要的块上,并将最后一个成员视为大于1 char指定的。

所以问题是:这种技术在技术上是未定义的行为吗?. 我希望它是,但很好奇标准对此有何看法。

PS:我知道 C99 的方法,我希望答案专门针对上面列出的技巧版本。

0 投票
6 回答
3885 浏览

c - 签名右移=奇怪的结果?

我正在帮助某人完成家庭作业并遇到了这个奇怪的问题。问题是编写一个函数来反转有符号整数的字节顺序(这就是函数的指定方式),这是我想出的解决方案:

如果你传递0xFF000000给这个函数,第一个赋值将导致0xFFFFFFFF. 我真的不明白发生了什么,但我知道这与有符号和无符号之间的来回转换或类似的事情有关。

如果我追加ul0xFF它工作正常,我认为这是因为它被迫无符号然后转换为有符号或那个方向的东西。生成的代码也会发生变化;没有说明ul符,它使用 sar(右移算术),但作为无符号,它按预期使用 shr。

如果有人能为我阐明这一点,我将不胜感激。我应该知道这些东西,我以为我知道了,但我真的不确定这里发生了什么。

提前致谢!

0 投票
5 回答
724 浏览

c - 是无符号字符 a[4][5]; 一个[1][7];未定义的行为?

C 标准中未定义行为的示例之一是 (J.2):

— 数组下标超出范围,即使对象显然可以使用给定的下标访问(如在给定声明 int a[4][5] 的左值表达式 a[1][7] 中)(6.5.6)

如果声明从int a[4][5]to更改unsigned char a[4][5],访问是否a[1][7]仍会导致未定义的行为?我的观点是它没有,但我从其他人那里听到了不同意的意见,我想看看其他一些可能成为 SO 专家的想法。

我的推理:

  • 按照对 6.2.6.1 第 4 段和 6.5 第 7 段的通常解释,对象的表示asizeof (unsigned char [4][5])*CHAR_BIT位,并且可以作为unsigned char [20]与对象重叠的类型数组来访问。

  • a[1]具有unsigned char [5]作为左值的类型,但在表达式中使用(作为运算符的操作数[],或等效地作为运算+符 in的操作数*(a[1]+7)),它衰减为类型的指针unsigned char *

  • 的值a[1]也是一个指向“表示”a形式的字节的指针unsigned char [20]。这样解释,加7a[1]有效。

0 投票
2 回答
239 浏览

c - C程序中的混乱

给定的程序是否定义明确?