2013-07-19 244 views
0

我一直在研究有關緩衝數組緩衝區溢出

#include <iostream> 

using namespace std; 

int main() 
    { 
char input[3]; 
for(int i=0;i<100;i++){ 
    cin>>input[i]; 
    } 
return 0; 
} 

程序推移和不停止,並沒有溢出的跡象(2 Linux系統測試)

發生,如果相同的I交換:

cin>>input[i]; 

有:

input[i]='a'; 
+3

這不會溢出堆棧,即寫入超過數組的末尾。很明顯,你沒有很努力地學習......順便說一句,把環路大小改爲4100,儘管仍然沒有保證,但你更有可能得到一個崩潰或某事 –

+0

是啊對不起,我沒有讀你回答完全。然而,在很多教程中,他們使用這樣的代碼來編輯函數的ret地址。 – user2455103

+0

它不是堆棧溢出,而是緩衝區溢出。 – syam

回答

2

這是一個緩衝區溢出,而不是堆棧溢出。該代碼會垃圾堆棧,但如果幸運的話,您可能會看到訪問衝突崩潰。它不會觸發堆棧溢出,只有在調用過多的函數時纔會發生 - 通常是通過遞歸。

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

如果您正在尋找可能發生的事情,我們無法保證它會發生。寫入數組末尾是未定義的行爲。如果系統檢測到你正在做什麼,它幾乎肯定會讓你崩潰,但是如果你只是覆蓋了實際上屬於你的進程的內存,那麼直到你寫完結束纔會發生。

+0

「堆棧溢出肯定會發生」,除非優化器優化出來... –

+0

啊現在呢,是的,我無法區分兩者,直到現在。對不起你的時間。 – user2455103

+0

haha​​ ok true - 因此,在未優化的調試版本上運行該程序,您可能會遇到堆棧溢出問題。 – Joel

1

參見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指出,編譯器可相當聰明地發現代碼中的優化和潛在的錯誤。

當您的程序崩潰時,堆棧溢出的告示符號會在程序的調用堆棧中反覆出現相同的函數!可能更好地看看它現在看起來如何,所以你現在如何在將來如何識別它...

+0

空功能可以優化出 –

+0

@ Mooing哈哈!謝謝,我會投資。我通常很迂腐,避免這樣的優化... – TooTone