c++ bufferoverflow 的执行顺序

c++ bufferoverflow order of execution

我在理解 C++ 程序的执行顺序时遇到了一些麻烦。我有一个缓冲区溢出的程序。但奇怪的是段错误(由于缓冲区溢出)发生在缓冲区溢出之前的几行代码中。

我的程序如下:

//Some code ...
file.seekg(0, std::ios::end);
auto file_size = file.tellg();
file.seekg(0);

std::vector<uint8_t> buffer(file_size);

//Some code
char t[1];
t[2] = 1;

//Some code

所以矫揉造作 t[2] = 1 产生了 缓冲区溢出 。但是段错误发生在向量初始化期间。 file_size 计算得很好,但是当执行 std::vector<uint8_t> buffer(file_size) 时,file_size 变为 -1(生成段错误)。此段错误是由缓冲区溢出产生的。如果我删除语句 t[2] = 1,一切正常。

所以我的问题是段错误是如何在缓冲区溢出执行之前发生的?代码的执行可以被编译器改变?

So my question is how the segfault can happen before the execution of the bufferoverflow? The execution of code can be altered by the compiler?

编译器可以自由地重新安排堆栈上不相关数据的初始化。您的向量和数组之间没有逻辑关系,因此编译器可以根据需要决定重新排序初始化。

但是您通过溢出数组边界调用了未定义的行为。这意味着您违反了编译器关于如何重新排序内存或代码的任何假设。所以现在所有的赌注都取消了。任何事情都可能发生,即使它没有意义。