数组缓冲区溢出
Array buffer overflow
我一直在研究缓冲
#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所指出的,编译器在发现代码中的优化和潜在错误方面可以相当聪明。
堆栈溢出的信号是当程序崩溃时,在程序的调用堆栈中看到相同的函数一遍又一遍地重复!也许最好看看它现在的样子,这样你现在就可以在未来认出它了。。。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 使用向量的缓冲区溢出
- 重新增长阵列时出错:写入时缓冲区溢出
- Leetcode 1366:堆缓冲区溢出
- 缓冲区溢出 - 数组索引越界(严重)
- C++二维矢量导致缓冲区溢出
- 缓冲区溢出怎么会成为黑客的攻击
- 如何防止缓冲区溢出
- 应该如何读取堆缓冲区溢出错误消息?
- 自动截断和 null 终止缓冲区溢出中的字符串缓冲区
- 如果用户输入两个或多个由空格分隔的字符串C++如何防止缓冲区溢出?
- MSVC C6029 警告:缓冲区可能溢出,使用未经检查的值.检查缓冲区大小时,警告不会消失
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 我不能溢出缓冲区
- 包含溢出缓冲区的堆栈分配变量,也称为缓冲区
- STL矢量溢出缓冲区