2012-03-12 105 views
0

問題是非常明顯的,所以我只會告訴你一些代碼:)有什麼辦法可以避免靜態內存區溢出?

#include <stdio.h> 
#include <string.h> 
char *test1() 
{ 
    static char c; 
    char *p; 
    p = &c; 
    printf("p[%08x] : %s\n", (unsigned int)p, p); 
    return p; 
} 

void *test2() 
{ 
    static char i; 
    char *buf; 
    int counter = 0; 
    for(buf = (char *)&i ; ;counter += 8) 
    { 
     memset(buf + counter, 0xff, 8); 
     printf("write %d bytes to static area!\n", counter); 
    } 
} 

int main() 
{ 
    char *p; 
    p = test1(); 
    strcpy(p, "lol i asd"); 
    p = test1(); 
    strcpy(p, "sunus again!"); 
    p = test1(); 
    strcpy(p, "sunus again! i am hacking this!!asdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); 
    p = test1(); 
    test2(); 
    return 0; 
} 

首先我寫了test1()。 正如你所看到的,那些strcpys應該會導致段錯誤,因爲它顯然訪問非法的內存區域。我知道一些關於靜態變量的基本知識,但這對我來說很奇怪。

然後我寫了test2()。 最後,它引起了段錯誤,之後它寫了將近4k字節。

所以,我不知道如何避免這種錯誤(靜態變量溢出)發生?

爲什麼我可以訪問這些靜態內存區域? 我知道他們不在堆棧中,也沒有堆積。

PS。也許我沒有清楚地描述我的問題。我有幾年的C編程經驗;我知道如果這不是靜態的,會發生什麼。 現在靜態變化幾乎所有,我想知道爲什麼。

+1

如果您使用Shift鍵,您的問題會更容易閱讀。 – 2012-03-12 04:44:36

+0

@Eric J .:或者至少學會正確使用它。 – BoltClock 2012-03-12 04:45:25

回答

1

未定義的行爲就是這樣 - undefined。它看起來可能正在工作,它可能會崩潰,它可能會偷走你的午餐錢。只是不要這樣做。

+0

我知道,這是不正常的。不是靜態的變量會導致錯誤錯誤發生之後,但這,只是隱藏.. – sunus 2012-03-12 04:49:00

+0

沒有保證什麼,看起來像一個錯誤會不管你碰巧使用您的變量的存儲類別的發生。 – 2012-03-12 04:50:25

0

不能避免覆蓋內存,你沒有在C.

分配至於失敗的方式...潛在何時,何地以及如何您的應用程序崩潰或其它怪異現象,完全取決於你的編譯器,編譯器標誌和隨機狀態存儲器在你的程序開始執行之前。您正在訪問您不應該訪問的內存,並且它在訪問對操作環境的影響方面完全未定義。

管理內存(例如Java,C#)的語言會爲您做這件事,但邊界檢查當然會有成本。

你當然可以使用內存管理庫(替換爲malloc/free/new/delete),它將嘗試檢測不正確的內存管理。當你超出內存頁,這是4KB,所以運氣好的話在它發生之前,你可以寫完整的4K發生

1

分段故障,而如果下一個頁面已經被利用 - 甚至不能保證。海灣合作委員會的堆棧保護有時可以幫助,但在這種情況下不能。 Valgrind也可以提供幫助。這些都不能保證。你最好自己照顧它。

0

通過了解您的存儲區域有多大以及不在這些區域的邊界之外進行書寫,避免了這個問題。沒有其他可靠的方法來處理這個問題。

+0

我的意思是,在test1中,我可以將靜態字符c更改爲靜態字符c [2];然後讓p = c。而且一切都保持不變。 – sunus 2012-03-12 07:57:33

相關問題