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?
编译器可以自由地重新安排堆栈上不相关数据的初始化。您的向量和数组之间没有逻辑关系,因此编译器可以根据需要决定重新排序初始化。
但是您通过溢出数组边界调用了未定义的行为。这意味着您违反了编译器关于如何重新排序内存或代码的任何假设。所以现在所有的赌注都取消了。任何事情都可能发生,即使它没有意义。
我在理解 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?
编译器可以自由地重新安排堆栈上不相关数据的初始化。您的向量和数组之间没有逻辑关系,因此编译器可以根据需要决定重新排序初始化。
但是您通过溢出数组边界调用了未定义的行为。这意味着您违反了编译器关于如何重新排序内存或代码的任何假设。所以现在所有的赌注都取消了。任何事情都可能发生,即使它没有意义。