回答
如何:
static void f(void) {
f();
}
int main (void) {
f();
return 0;
}
這應該給你一個很好的堆棧溢出,解決是:不這樣做。
你的意思是用完堆棧空間,或者做些惡意的事情?
上惡意溢出堆棧中的經典文章:
http://insecure.org/stf/smashstack.html
如果你的意思是跑出來的堆棧空間,所有你需要做的是在結束了對分配太多空間遞歸函數堆棧,並運行了:
int foo()
{
int something = 4;
foo();
return something; /* Yeah, we never get here */
}
從技術上講,這是一個緩衝區溢出而不是堆棧溢出,但它仍然是一個非常好的文章。 – paxdiablo 2011-03-14 08:25:11
我不認爲他意味着緩衝區溢出,但感謝張貼該文章!我沒有看到它之前 – 2011-03-14 08:25:59
他說棧...我剛剛編輯了一個遞歸函數,最終會用完。 – 2011-03-14 08:27:25
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);
這不會永久遞歸。 – 2011-03-14 08:24:54
哦,很好,@Ignacio。 jon_d,你應該使用'=='而不是'=':-) – paxdiablo 2011-03-14 08:27:06
哈哈感謝良好的調用 – 2011-03-14 08:27:28
#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這樣更安全的函數來解決此錯誤。
- 1. 代碼中的堆棧溢出錯誤
- 2. 堆棧溢出堆棧溢出
- 3. 循環代碼導致堆棧溢出
- 4. 堆棧溢出
- 5. Java代理示例正在創建堆棧溢出?
- 6. 堆棧溢出C++
- 7. C#堆棧溢出
- 8. Malloc堆棧溢出
- 9. 堆棧溢出C++
- 10. LINQ2SQL堆棧溢出
- 11. 堆棧溢出ToArray()
- 12. C++堆棧溢出
- 13. 堆棧溢出:: regex_replace
- 14. .NET堆棧溢出?
- 15. MPMoviePlayerController堆棧溢出
- 16. ViewDragHelper堆棧溢出
- 17. Lua堆棧溢出
- 18. GinMapProvider堆棧溢出
- 19. Threading.Timer堆棧溢出
- 20. 單例模式堆棧溢出錯誤
- 21. 堆棧溢出調用堆棧#timememoryfunctionlocation 10.0000143728
- 22. 堆棧搜索導致堆棧溢出
- 23. java.util.Properties.getProperty的堆棧溢出
- 24. freertos中的堆棧溢出
- 25. 堆棧溢出的原因
- 26. 堆棧溢出的Java
- 27. 堆棧溢出的serialport上
- 28. FreeRTOS的堆棧溢出鉤
- 29. Jboss中的堆棧溢出
- 30. 奇怪的堆棧溢出?
分辨率很簡單。只是不要做任何樣本。 – 2011-03-14 08:22:17