具體而言,我想知道GCC會如何確保在與使用-fno-exceptions
編譯的代碼鏈接時如何引發異常行爲。當拋出異常的代碼與使用-fno-exceptions編譯的庫鏈接時會發生什麼?
GNU libstdc++
說明書以下here。
之前詳述
-fno-exceptions
庫的支持,首先在當使用該標誌失去的東西通過的紙幣:它會破壞異常試圖通過與-fno-exceptions
編譯代碼,代碼是否有任何try
或catch
結構體。如果您可能會拋出一些代碼,則不應使用-fno-exceptions
。如果您有一些使用try
或catch
的代碼,則不應使用-fno-exceptions
。
這聽起來像是一句話:「你不應該......」也就是說。未定義的行爲。
在另一方面,我從this SO question的印象是,一切都是猶太只要用-fno-exceptions
編譯的代碼不throw
,try
,或catch
(顯然是一個編譯時錯誤)和異常從未通過函數傳播從這個圖書館。這是有道理的:爲什麼圖書館編譯-fno-exceptions
只要不與其功能交互就拋出異常?
我做了一些修補,發現如果我使用GCC 7.1.1編譯一個簡單的程序,其中一個源文件編譯爲-fno-exceptions
,另一個引發並捕獲異常,則所有編譯,鏈接和運行都正常。但這並不意味着這種行爲是有保證的;它仍然可能是未定義的。
我的動機是,我有一種情況,我將自己的應用程序代碼與使用-fno-exceptions
構建的庫鏈接起來,並根據對所述庫調用的函數調用,在我的即使該異常不通過庫的函數傳播,自己的代碼也會立即導致段錯誤。它聽起來像是圖書館裏的一個bug,但我認爲在編譯過程中通過-fno-exceptions
時可以這樣做。
GCC的actual reference on code-generation flags提到-fexceptions
相對簡短,並不回答我的問題。任何人都知道另一個參考/有相關經驗?
更新:我從源重建庫,這次打開異常支持。段錯誤依然存在!時間爲錯誤報告。
我想說你認爲沒有明確聲明'-fno-exceptions'和'-fexceptions'是兼容的,但它是隱含的。然而(這裏有一個瘋狂的觀點),你確定你在拋出異常時沒有通過任何庫代碼。可能發生的顯而易見的'隱藏'方式是在堆棧展開中調用(或未調用或未命中)的'-fno-exceptions'析構函數。只是一個想法。 – Persixty
我不認爲這就是我的情況,因爲即使我把'throw'直接放在'main'的'try' /'catch'中作爲測試,segfault仍然會出現。它永遠不允許傳播足夠多的觸發任何析構函數。當我讀到你的建議時,我只是做了一個雙倍的工作。我當然沒有想到這種可能性! –
不客氣。只是拋出你的想法。我對gcc並不熟悉,當然也不是更奇特的配置。這些文檔肯定是這樣寫的:「這裏有一大堆的事情是爲了解決異常的問題。 – Persixty