无法访问的代码如何导致我的程序崩溃?

How can unreachable code cause my program to crash?

本文关键字:我的 程序 崩溃 何导致 访问 代码      更新时间:2023-10-16

我有一个这样的函数:

bool func(args) {
execute_something();
return true;
/* code that is optionally included or omitted, with no source code change above the return statement */
}

包含代码块会导致程序在到达 execute_something(( 之前退出,但省略它可以正常运行。我错过了什么?

澄清这个问题:我很想知道这种行为是否可能,鉴于我描述它的方式。

是的,可以。事实上,你甚至根本不需要调用函数,因为代码块在return true;后会导致未定义的行为。例:

#include<iostream>
template<typename>
auto var = []{
int* i;
return *i; // undefined behavior!
}();
bool func() {
return true;
(void)(var<int>); // UB if and only if line included
}
int main() {
std::cout << "This is main!"; // Also forces static initialization not to be deferred forever
}

如果return true;之后的行存在,则将初始化var<int>,其初始值设定项将在运行时执行,从而导致未定义的行为。如果该行不存在,则不会实例化var<int>并且永远不会执行具有未定义行为的代码。

参见 GCC 9.2 和-O2中的 godbolt 进行演示。使用该行,程序崩溃(返回值 255(,没有它,它正确打印cout语句并返回成功(返回值 0(。


然而,这些都是非常具体的情况,更有可能的是,如果你观察到崩溃,你的程序中的其他地方有未定义的行为,并且只有当 return 语句后面的行存在时,它才会恰好表现为崩溃,因为未定义的行为是不可预测的。请参阅对该问题的评论。

相关文章: