无法访问的代码如何导致我的程序崩溃?
How can unreachable code cause my program to crash?
我有一个这样的函数:
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 语句后面的行存在时,它才会恰好表现为崩溃,因为未定义的行为是不可预测的。请参阅对该问题的评论。
相关文章:
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我的程序在for循环中k=0时返回垃圾值
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 我的程序没有从文件中读取并输入数据
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 为什么我的程序不能显示斐波那契级数?
- 为什么我的程序在使用预留后没有加速?
- 为什么如果我添加这一行,我的程序会不断询问值
- 为什么当我输入较大的数字时,我的程序会到达文件末尾?
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 为什么我的 c++ 程序检查不是初始化的变量?
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- C++ - 为什么我的程序在再次调用函数后关闭?
- 我的程序将 26 个字母转换为 ascII 没有显示正确答案
- 为什么我的程序在读取/写入文件时会删除最重要的数字?
- 我需要如何更改我的程序以使用打开/关闭原则?
- 我的 c++ 程序似乎没有发现字符串和我拥有但输入使用 getline 的变量之间的比较