2012-04-06 29 views
3

是否有可能通過代碼破壞c/C++中的調用堆棧? 我並不是指一種黑客攻擊或某種東西,只是一種監督錯誤或某種東西,但不是隨機的,這樣每次都會損壞它。 有人告訴我,一位前同事管理,但我不認爲這是可能的。 有人有這樣的經歷嗎?破壞調用堆棧的C/C++代碼

+0

在C/C++中損壞調用堆棧非常容易。這就是很多人討厭他們的原因。 – iammilind 2012-04-06 12:22:09

回答

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 '雙惡(空隙); //聲明only' INT主(無效) { 的printf( 「結果是%F,\ n」 個,惡());// BOOM return 0; } – 2012-04-06 12:10:19