2009-07-17 270 views
4

可能重复:
What is the difference between a stack overflow and buffer overflow ?缓冲区溢出(VS)缓冲区溢出(VS)堆栈溢出

是什么缓冲区溢出和缓冲区溢出的区别?

Buffer Overrun和Stack Overflow之间的区别是什么?

请包括代码示例。我已经看过维基百科中的条款,但我无法与C或C++或Java中的编程相匹配。

+6

维基百科明确指出缓冲区溢出和缓冲区溢出是同义词。因此,你的问题是你自己的问题在http://stackoverflow.com/questions/1120575 – innaM 2009-07-17 15:44:51

+1

这个任务可能是可以解决的,只是缓冲区溢出和缓冲区溢出之间的区别(答:他们是同一概念的同义词)。没有理由让Wikipedia成为SO的来源。 – Yishai 2009-07-17 15:47:40

回答

24

缓冲剂如刚才阵列的思考。 A 缓冲区溢出是当您尝试将更多的项目放在数组中比数组可以容纳。换句话说,它来自写作

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

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

16

缓冲区溢出/ Bufferoverrun:

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

#1:

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

缓冲区溢出和缓冲区溢出有什么区别? 我会说缓冲区溢出是当你试图超出缓冲区的末尾写入,但你有一个阻止它的检查。缓冲区溢出是当你实际写入超出缓冲区的末尾时。第一个失败很快,第二个难以发现。

您不能在java中溢出缓冲区,因为它总是有边界检查,因此会产生BufferOverflowException。

Buffer Overrun和Stack Overflow之间的区别是什么?

他们没有任何关系。

1

你可以有缓冲区溢出之间的差异和C缓冲区溢出/ C++:

  • 我们可以定义溢出,当你索引/点超出了原来的缓冲区的大小(即g读取一个3元素数组的第6个元素)
  • 我们可以定义超限,当你有多个相邻的缓冲区后,你可以索引第二个元素(例如,读取第一个3元素数组的第6个元素,但是你获取第二个3元素数组的第三个元素)。

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