2016-06-10 45 views
-1

有一些技巧正在練習C++程序員確實知道像「Scope Guard」,也可能涉及到涉及臨時對象的其他技巧。有沒有一種很好的方法來破壞C++中的調用者堆棧?

我不是一個練習C++程序員,但我想問一下(好奇)是否有方法第三方庫可能會以某種方式傷害調用者的堆棧。也許涉及突然的析構函數或某種其他範圍的生命魔法?

+1

當然,第三方庫可以很容易地吹掉主叫方的堆棧。編寫錯誤代碼並不需要很多技巧。真正的技巧是編寫無錯代碼。這是棘手的部分。 –

+0

'exit(0)'傾向於破壞堆棧(和其他任何東西)。我不認爲這真的是個好問題。 – MSalters

+0

@MSalters感謝您的反饋。隨時關閉該問題。我最初的意圖是關於返回的臨時對象和析構函數的引用等。 – rostamn739

回答

3

方式第三方庫可能會損害呼叫者的堆棧

每當從第三零件庫運行的代碼 - 無論是初始化程序爲操作系統加載器知道調用動態加載庫,或來自客戶端應用程序代碼的顯式調用 - 它通常(在大多數操作系統的/實現的安全模型中)具有與客戶端應用程序本身一起使用堆棧(或任何其他內存)的能力;例如:

void library_code() 
{ 
    char x; 
    char* p = &x; 
    *(p - 2) = 23; // undefined behaviour - may do nothing or anything, 
        // but usually overwrites stack or SIGSEGVs 
    *(p + 54) = 99; // stacks might grow up or down, so may have to + or - 
        // from &x to address in-use stack memory... 
} 
+0

謝謝!我想這同樣適用於調用堆棧的特定調用者區域(或稱框架)。你能想到一個涉及範圍/生命期/ RAII的例子嗎? :) – rostamn739

+1

堆棧往往是一個連續的內存區域,而不是不相交的地址區域;幀僅僅是當前調用堆棧中的特定功能當前使用的字節,其中在調用之後可能還有一些保存的CPU/GPU寄存器以及返回地址,接着是函數參數和局部變量編譯器選擇放在堆棧上。 Re scopes/lifetime/RAII - 任何堆棧託管對象的析構函數都可以通過'this'指針執行相同類型的堆棧廢棄。 –

相關問題