是否有可能通過代碼破壞c/C++中的調用堆棧? 我並不是指一種黑客攻擊或某種東西,只是一種監督錯誤或某種東西,但不是隨機的,這樣每次都會損壞它。 有人告訴我,一位前同事管理,但我不認爲這是可能的。 有人有這樣的經歷嗎?破壞調用堆棧的C/C++代碼
3
A
回答
6
是的,簡單。事實上,這是一個非常普遍的問題。考慮到這一點:
void foo()
{
int i;
int *p = &i;
p -= 5; // now point somewhere god knows where, generally undefined behavior
*p = 0; // boom, on different compilers will end up with various bad things,
// including potentially trashing the call stack
}
本地數組/緩衝區超出邊界訪問的許多情況都以最終的堆棧結束。
6
是的。在許多平臺上,局部變量與調用堆棧一起存儲;在這種情況下,寫一個本地陣列外面是一個非常簡單的方法來腐敗吧:
void evil() {
int array[1];
std::fill(array, array+1000000, 0);
return; // BOOM!
}
更微妙的是,返回一個參考給本地變量可能會破壞一個這就是所謂的後來函數的棧:
int & evil() {
int x;
return x;
}
void good(int & x) {
x = 0;
return; // BOOM!
}
void innocent() {
good(evil());
}
請注意,這些(以及其他任何可能破壞堆棧的內容)都不合法;但編譯器不需要診斷它們。幸運的是,只要啓用適當的警告,大多數編譯器都會發現這些錯誤。
+0
而我作爲鏈接器的c變體會發現雙重惡(double a); ... file1.h '雙邪(雙A);' file1.c中 的#include 「file1.h」 雙邪(雙A){返回* 5;}' main.c中 的#include
相關問題
- 1. 堆棧框架破壞
- 2. 破壞內核堆棧的函數
- 3. 爲什麼在循環中調用ReadConsole會破壞堆棧?
- 4. 在堆棧上處理對象破壞
- 5. 堆棧損壞並使用替代信號堆棧
- 6. 堆棧損壞
- 7. 損壞的堆棧
- 8. 堆棧PHP代碼?
- 9. 訂單破壞堆棧/堆分配數組
- 10. 堆棧被損壞
- 11. GetCPUDescriptorHandleForHeapStart堆棧損壞
- 12. Python堆棧損壞?
- 13. LinkedList堆棧損壞
- 14. 堆棧被損壞
- 15. WAMP堆棧的源代碼
- 16. 是我的代碼堆棧?
- 17. C++映射迭代和堆棧損壞
- 18. 調試錯誤堆棧變量損壞
- 19. 如何在只有損壞的堆棧文件時找到調用堆棧?
- 20. c中的堆棧損壞
- 21. 堆棧上的值損壞
- 22. initsip()與損壞的堆棧
- 23. 調用堆棧
- 24. 服務時破壞清晰的多任務堆棧的Android
- 25. 堆棧周圍的變量的「被破壞
- 26. VS 2010:調用堆棧說:[外部代碼]並不會顯示調用代碼
- 27. 是否有在C++堆棧變量的順序被破壞
- 28. 在C程序中堆棧破壞的典型例子
- 29. 用於貨架堆棧的僞代碼
- 30. C代碼堆棧損壞改變變量
在C/C++中損壞調用堆棧非常容易。這就是很多人討厭他們的原因。 – iammilind 2012-04-06 12:22:09