【问题标题】:Array buffer overflow数组缓冲区溢出
【发布时间】:2013-07-19 08:15:47
【问题描述】:

我一直在研究缓冲区

#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';

【问题讨论】:

  • 不会溢出堆栈,而是写入数组末尾。显然你没有很努力地学习......顺便说一句,将循环大小更改为 4100 并且您更有可能(尽管仍不能保证)发生崩溃或其他情况
  • 是的,抱歉,我没有完整阅读您的回答。然而,在许多教程中,他们使用这样的代码来编辑函数的 ret 地址
  • 这不是堆栈溢出,而是缓冲区溢出。
  • 是的,缓冲区溢出,抱歉
  • 很抱歉在提问之前没有彻底搜索.....我认为这个问题已经结束。谢谢

标签: c++ arrays buffer overflow boundary


【解决方案1】:

这是缓冲区溢出,而不是堆栈溢出。该代码将破坏堆栈,但如果幸运的话,您可能会看到访问冲突崩溃。它不会触发堆栈溢出,只有当您调用太多函数时才会发生堆栈溢出 - 通常是通过递归。

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

如果您正在寻找要发生的事情,则无法保证一定会发生。写入数组末尾是未定义的行为。如果系统检测到你在做什么,它几乎肯定会让你崩溃,但如果你只是覆盖实际上属于你的进程的内存,它可能不会发生,直到你写到最后。

【讨论】:

  • 啊,现在明白了,是的,直到现在我都无法区分这两者。对不起你的时间。
  • 哈哈好吧,所以,在非优化的调试版本上运行它,你可能会遇到堆栈溢出。
【解决方案2】:

What and where are the stack and heap?

如果您生成一个无休止地调用自身的函数,您将很快发生堆栈溢出。每个函数调用都会占用栈空间,很快就会耗尽栈空间!

void f()
{
    f();
}

在 Visual Studio 2012 中,此代码甚至产生了警告

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

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

堆栈溢出的迹象是当程序崩溃时,在程序的调用堆栈中看到相同的函数一遍又一遍地重复!可能更好地看看它现在的样子,所以你现在如何识别它......

【讨论】:

  • 空函数可以优化掉
  • @Mooing 哈哈!谢谢,我会调查的。对于避免这样的优化,我通常很迂腐......
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2019-07-15
  • 2018-12-31
  • 2013-11-06
  • 2013-04-11
相关资源
最近更新 更多