gpt4 book ai didi

c++ bufferoverflow 执行顺序

转载 作者:行者123 更新时间:2023-11-30 02:33:13 25 4
gpt4 key购买 nike

我在理解 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产生一个bufferoverflow。但是段错误发生在 vector 初始化期间。 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?

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

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

关于c++ bufferoverflow 执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35712932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com