2011-03-14 91 views
0

你好 你可以給我一個示例代碼溢出與c或.net堆棧嗎?並說我如何解決這個錯誤。堆棧溢出的示例代碼

謝謝

+2

分辨率很簡單。只是不要做任何樣本。 – 2011-03-14 08:22:17

回答

1

如何:

static void f(void) { 
    f(); 
} 
int main (void) { 
    f(); 
    return 0; 
} 

這應該給你一個很好的堆棧溢出,解決是:不這樣做。

0

你的意思是用完堆棧空間,或者做些惡意的事情?

上惡意溢出堆棧中的經典文章:

http://insecure.org/stf/smashstack.html

如果你的意思是跑出來的堆棧空間,所有你需要做的是在結束了對分配太多空間遞歸函數堆棧,並運行了:

int foo() 
{ 
    int something = 4; 
    foo(); 
    return something; /* Yeah, we never get here */ 
} 
+0

從技術上講,這是一個緩衝區溢出而不是堆棧溢出,但它仍然是一個非常好的文章。 – paxdiablo 2011-03-14 08:25:11

+0

我不認爲他意味着緩衝區溢出,但感謝張貼該文章!我沒有看到它之前 – 2011-03-14 08:25:59

+0

他說棧...我剛剛編輯了一個遞歸函數,最終會用完。 – 2011-03-14 08:27:25

0
int factorial(int x) 
{ 
    if (x == 1 || x == 0) return 1; 
    return factorial(x-1) * x; 
} 

factorial(-1); 

確保遞歸函數總是莫名其妙地達到基本情況。

int factorial(int x) 
{ 
    if (x < 0) return 0; 
    if (x == 1 || x == 0) return 1; 
    return factorial(x-1) *x; 
} 

factorial(-1); 
+0

這不會永久遞歸。 – 2011-03-14 08:24:54

+0

哦,很好,@Ignacio。 jon_d,你應該使用'=='而不是'=':-) – paxdiablo 2011-03-14 08:27:06

+0

哈哈感謝良好的調用 – 2011-03-14 08:27:28

1
#include <string.h> 

void function(char *str) { 
    char buf[8]; 

    strcpy(buffer,str); 
} 

void main(int argc, char *argv[]) { 
    function(argv[1]); 
} 

經典範例。 strcpy()副本不檢查任何大小。所以,如果你的源字符串(str)大於緩衝區(buf),你會得到一個緩衝區溢出。說它16chars你會得到一個堆棧溢出。

您可以通過使用像strncpy這樣更安全的函數來解決此錯誤。