2009-07-17 272 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元素數組的第三個元素)。

當你填充你的整個堆棧的「內存緩衝區」時,堆棧溢出是有點緩衝區溢出。