2014-04-11 28 views
3

這有點類似於「Disabling C++ exceptions, how can I make any std:: throw() immediately terminate?」。我希望我的程序在STL拋出異常時終止。-fno-某些圖書館的例外情況?

問題如下:我正在編寫一個庫,然後將其作爲共享對象加載並由我無法控制的程序執行。不幸的是,這個程序在一個大的嘗試塊中運行了所有的東西,這樣如果發生錯誤,我不會得到堆棧跟蹤/內核轉儲,導致函數的超範圍錯誤類無效。

這聽起來像是-fno-exceptions的理想用例,但我不能只使用-fno-exceptions,因爲boost_log和調用我的程序都在它們的頭文件中定義了異常處理,給我帶來了編譯錯誤-fno-例外。

有沒有一種方法來啓用-fno-exceptions僅用於stl異常?

+0

在libstdC++中,如果'at'檢測到一個超出範圍的參數,它會調用void void std :: __ throw_out_of_range(char const *)'。如果你定義了自己的函數名稱並安排在鏈接時選擇它(LD_PRELOAD對於實驗來說可能是最簡單的),那麼你應該能夠將行爲更改爲任何你喜歡的。 –

+0

@MarcGlisse謝謝,會試試看。 – niklasfi

+0

作爲一個單獨的圖書館的「STL」幾乎在1998年停止存在;在今天的C++中確實沒有「STL異常」這樣的東西。目前的大部分庫可以追溯到Boost而不是STL。 (當然,不少編譯器供應商已經重新實現了這些類) – MSalters

回答

1

用C++ 11,做最簡單的方法是添加noexcept到頂級功能的簽名是從您的共享庫稱爲:

void called_func() noexcept; 

這將導致任何未處理的異常堆棧幀(或者如果它們未被處理,則在下面)來終止程序的執行。