缓冲区溢出(vs)缓冲区溢出(vs)堆栈溢出

时间:2009-07-17 15:41:26

标签: java c++ c operating-system

  

可能重复:
  What is the difference between a stack overflow and buffer overflow ?

Buffer Overflow和Buffer Overrun有什么区别?

Buffer Overrun和Stack Overflow有什么区别?

请包含代码示例。我查看了维基百科中的术语,但我无法与C或C ++或Java编程相匹配。

4 个答案:

答案 0 :(得分:28)

将缓冲区视为一个数组。当您尝试引用超出数组末尾的索引时,人们通常会交替使用“溢出”和“溢出”。就个人而言,我做了一个区别:

缓冲区溢出是指您尝试在阵列中放入的项目数多于阵列可容纳的项目数。换句话说,它来自 写作

缓冲区溢出是指迭代缓冲区并继续读取数组末尾的时间。换句话说,它来自 阅读

堆栈溢出有很大不同。大多数现代编程环境都是基于堆栈的,它们使用堆栈数据结构来控制程序流。每次调用函数时,都会在程序的调用堆栈中放置一个新项。函数返回时,项目将从堆栈中弹出。当堆栈为空时,程序停止。问题是,这个堆栈的大小有限。可以一次调用太多函数并填满堆栈。此时您有堆栈溢出。最常见的方法是在函数调用自身时(递归)。

答案 1 :(得分:16)

Bufferoverflow / Bufferoverrun:

void k()
{
    BYTE buf[5];
    for( int i = 0; i < 10; ++i )
        buf[i] = 0xcd;
}

Stackoverflow:

void f()
{
     int k = 0;
     f();
}

答案 2 :(得分:1)

在C / C ++中,缓冲区溢出和缓冲区溢出之间可能存在差异:

  • 我们可以在索引/指向超出原始缓冲区大小时定义溢出(例如,读取3元素数组的第6个元素)
  • 我们可以定义溢出,当你有多个相邻的缓冲区后,你索引到第二个(例如读取第一个3元素数组的第6个元素,但你得到第二个3元素数组的第3个元素) )。

当你填满整个堆栈的“内存缓冲区”时,堆栈溢出有点缓冲区溢出。

答案 3 :(得分:0)

  

Buffer Overflow和Buffer Overrun有什么区别?   我会说缓冲溢出是指当你尝试写入超出缓冲区末尾的时候,但你有一个阻止它的检查。缓冲区溢出是指实际写入超出缓冲区末尾的时间。第一种是快速失败,第二种难以检测。

你不能在java中溢出缓冲区,因为它总是有边界检查,从而产生一个BufferOverflowException。

  

Buffer Overrun和Stack Overflow有什么区别?

他们彼此无关。