簡體   English   中英

損壞調用堆棧的 C/C++ 代碼

[英]C/C++ code that damages call stack

是否有可能在 c/c++ 中損壞調用堆棧的常用代碼? 我不是指某種黑客攻擊或其他什么,只是一個疏忽錯誤或其他什么,但不是隨機的,這樣每次都會損壞它。 有人告訴我,一位前同事成功了,但我認為這不可能。 有人有這樣的經歷嗎?

是的,很簡單。 事實上,這是非常常見的問題之一。 考慮一下:

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
}

許多越界訪問本地數組/緩沖區的情況最終都會導致堆棧被破壞。

是的。 在許多平台上,局部變量與調用堆棧一起存儲; 在這種情況下,在本地數組外部寫入是破壞它的一種非常簡單的方法:

void evil() {
    int array[1];
    std::fill(array, array+1000000, 0);
    return; // BOOM!
}

更微妙的是,返回對局部變量的引用可能會破壞稍后調用的 function 的堆棧:

int & evil() {
    int x;
    return x;
}
void good(int & x) {
    x = 0;
    return; // BOOM!
}
void innocent() {
    good(evil());
}

請注意,這些(以及任何其他可能破壞堆棧的東西)都不合法; 但編譯器不必診斷它們。 幸運的是,只要您啟用適當的警告,大多數編譯器都會發現這些錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM