我知道在C程序中执行某些操作时,结果是未定义的。但是,编译器不应该生成无效(机器)代码,对吗?如果代码做错了事或生成段错误之类的东西,那倒是合理的...
这是否符合编译器规范,还是编译器的一个漏洞?
这是我使用的(简单的)程序:
int main() {
char *ptr = 0;
*(ptr) = 0;
}
我正在使用-O3
进行编译。但这不会生成无效的硬件指令,对吧?如果使用-O0
,运行代码时我会遇到段错误。那样似乎更加合理。
编辑:它正在生成一个ud2
指令...