【发布时间】:2014-12-06 04:57:18
【问题描述】:
我知道当你在 C 程序中做某些事情时,结果是不确定的。但是,编译器不应该生成 invalid(机器)代码,对吧?如果代码做错了,或者代码产生了段错误或其他什么,这将是合理的......
这应该根据编译器规范发生,还是编译器中的错误?
这是我正在使用的(简单)程序:
int main() {
char *ptr = 0;
*(ptr) = 0;
}
我正在使用-O3 进行编译。但这不应该产生无效的硬件指令,对吧?使用-O0,我在运行代码时会遇到段错误。这似乎更加理智。
编辑:它正在生成ud2 指令...
【问题讨论】:
-
UB 意味着所有的赌注都结束了,理智早就被抛弃了,没有理由抱怨了!
-
在编译器知道存在未定义行为的情况下,生成一条只会让你的应用程序崩溃的指令绝对没问题,并且可以说是最安全的做法。跨度>
-
它没有生成无效指令。它正在生成一条有效指令,其作用是触发无效的操作码异常。这会给您带来什么问题吗?
-
正如我在回答中所说,这是有效的指令,编译器在某些方面很有帮助,因为如果一个严重的问题长时间被忽视可能会更糟。
标签: c gcc undefined-behavior