2009-09-03 28 views
32

在linux/gcc的C++中使用longjmp和setjmp關於以下方面是否安全?C++:安全使用longjmp和setjmp?

  1. 異常處理(我不使用的longjmp/setjmp的執行異常處理。我想知道有什麼副作用的longjmp/setjmp的會對標準異常處理)
  2. *this指針
  3. 信號
  4. 智能指針(提升的共享和侵入指針)
  5. 任何其他你可以想到的。

回答

54

setjmp()/longjmp()完全顛覆堆棧展開,因此也是異常處理以及RAII(一般的析構函數)。

從18.7/4「的其他運行時支持」中的標準:

如果任何自動對象將被拋出的異常傳送 控制到另一(目標)被破壞點在節目中,則調用到longjmp(jbuf, val)在將控制轉移到相同(目標)點的轉移點具有未定義的行爲。

因此底線是setjmp()/longjmp()在C++中播放不好。

+0

你能解釋一下如何使用顯式內存刪除和析構函數來調用longjmp嗎? – jameszhao00

+12

通常,只要有某種方式可以退出C++(返回,拋出或其他)的作用域,編譯器就會發出指令來調用dtors以獲取任何自動變量,這些自動變量因離開該塊而需要銷燬。 'longjmp()'只是跳轉到代碼中的一個新位置,所以它不會提供調用dtors的機會。標準實際上不是那麼具體 - 標準並沒有說dtors不會被調用 - 它說所有的投注都是關閉的。在這種情況下,你不能依賴任何特定的行爲。 –

+0

我對智能指針不太熟悉。如果我在棧上有一個智能指針,當我做一個longjmp時,這是否意味着智能指針不會刪除一個refcount?另外,我是否安全,如果我禁用異常並編寫不會與longjmp瘋狂的代碼? – jameszhao00

-8

我只知道這些命令,並沒有看到他們在實際應用中的行動。

恕我直言,可以肯定地說使用它們並不安全:開發人員不會理解那些「不受歡迎」的API。

+3

這是一個協程實現(需要隨機跳轉) – jameszhao00

+11

有經驗的開發人員絕對會知道這些「不受歡迎」的API做什麼。幾十年來,它們一直是標準C庫的一部分。 – Novelocrat

+23

有經驗的開發人員絕對會知道這些功能的作用。他們也會知道在C中使用它們是很棘手的事情(儘管有時是必需的),而且在C++中非常危險。 –

5

這不是特定於Linux或gcc;如果您使用longjmp離開具有析構函數的自動變量的上下文,setjmp/longjmp和C++不能很好地協同工作。

析構函數不會運行,這可能會導致內存泄漏或其他不良行爲。

相關問題