数组缓冲区溢出

Array buffer overflow

本文关键字:溢出 缓冲区 数组      更新时间:2023-10-16

我一直在研究缓冲

#include <iostream>
using namespace std;
int main()
  {
 char input[3];
 for(int i=0;i<100;i++){
    cin>>input[i];
  }
return 0;
}

程序继续运行,没有停止,也没有溢出的迹象(在2个linux盒子中测试)

如果我交换,也会发生同样的情况

cin>>input[i];

带有:

input[i]='a';

这是缓冲区溢出,而不是堆栈溢出。该代码将丢弃堆栈,但如果幸运的话,您可能会看到访问违规崩溃。它不会触发堆栈溢出,只有在调用过多函数时才会发生这种情况——通常是通过递归。

void f()
{
    f(); // <-- stack overflow sure to happen
}

如果你正在寻找一些事情发生,并不能保证它会发生。写入超过数组末尾是未定义的行为。如果系统检测到你在做什么,几乎肯定会让你崩溃,但如果你只是覆盖了实际上属于你的进程的内存,那么在你写得远远超过末尾之前,这可能不会发生。

请参阅堆栈和堆是什么以及在哪里?

如果您生成一个无休止地调用自身的函数,那么很快就会出现堆栈溢出。每个函数调用都会占用堆栈上的空间,而且很快就会用完堆栈空间!

void f()
{
    f();
}

在Visual Studio 2012中,此代码甚至生成了一个警告

warning C4717: 'f' : recursive on all control paths, function will cause runtime stack overflow

该函数在Visual Studio 2012上没有得到优化,但正如@MooingDuck所指出的,编译器在发现代码中的优化和潜在错误方面可以相当聪明。

堆栈溢出的信号是当程序崩溃时,在程序的调用堆栈中看到相同的函数一遍又一遍地重复!也许最好看看它现在的样子,这样你现在就可以在未来认出它了。。。