簡體   English   中英

數組緩沖區溢出

[英]Array buffer overflow

我一直在研究緩沖

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

那是緩沖區溢出,而不是堆棧溢出。 該代碼將破壞堆棧,但是如果幸運的話,您可能會看到訪問沖突崩潰。 它不會觸發堆棧溢出,只有在您調用太多函數(通常是通過遞歸)時才會發生。

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

如果您正在尋找可能發生的事情,則不能保證一定會發生。 超出數組末尾的寫入是未定義的行為。 如果系統檢測到您正在執行的操作,幾乎肯定會使您崩潰,但是如果您只是覆蓋實際上確實屬於您的進程的內存,則可能要等到您寫完結尾之后,才會發生。

請參閱堆棧和堆在哪里?

如果產生一個不斷調用自身的函數,則很快就會導致堆棧溢出。 每個函數調用都會占用堆棧空間,並且您很快就會用完堆棧空間!

void f()
{
    f();
}

在Visual Studio 2012中,此代碼甚至產生警告

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

該功能尚未在Visual Studio 2012上進行優化,但是正如@MooingDuck指出的那樣,編譯器可以非常聰明地發現優化和代碼中的潛在錯誤。

當程序崩潰時,堆棧溢出的跡象表明在程序的調用堆棧中反復看到相同的函數! 大概更好地了解它的外觀,以便您現在如何在將來識別它...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM