如果程序的一部分表现出未定义的行为,它会影响程序的其余部分吗?

mac*_*e_1 6 c c++ undefined-behavior

假设程序员忘记初始化他的一个自动变量,并且他使用了它的值,从而调用了未定义的行为.

...
int i = 0, j;
...
printf("value of 'j': %d\n", j);
...
...
char buf[256];
fputs("Enter query:", stdout);
fgets(buf, sizeof(buf), stdin);
... //process input
... perform other tasks
Run Code Online (Sandbox Code Playgroud)

程序员注意到屏幕上出现了乱码,并意识到他的程序是错误的,但它并没有崩溃,反正还在继续.

假设在此之后,程序提示用户输入并期望处理它,显示结果并执行所有独立于未初始化变量的其他任务,鼓励程序员停止使用该程序,修复错误,重新编译和运行?该计划的其余部分是否会不一致?

Bat*_*eba 16

一旦达到具有未定义行为的语句,则整个程序的行为是未定义的.

矛盾的是,之前运行的语句的行为也是未定义的.

  • 在许多情况下,这不是一个悖论,例如,当代码执行`++ i; ++*p;`和`p`碰巧是nullptr.假设正常的整数,编译器可以自由地重新排序这些,例如,因此程序可能会在递增"i"之前发生段错误.当安装了segfault处理程序,或者`i`​​驻留在共享内存中时,差异可能是可观察的.此外,编译器可以从可证明包含无条件UB的函数或块中消除后续和*前面*语句,并且它们[实际上这样做](https://www.youtube.com/watch?v=ehyHyAIa5so). (2认同)