2014-01-22 93 views
2

編譯器:VC++ 2013 模式:發行編譯器是否允許進行這樣的優化?

故事:我瞭解了IAT掛鉤。我決定在ExitProcess()上練習。只要替換函數返回,我就會崩潰。爲什麼?因爲不知何故,編譯器決定認爲ExitProcess()後面的內容永遠不會執行,因此代碼不會生成。例如,當我把ExitProcess()放在if語句中時,一切都很順利。那麼這是如何有效的優化? ExitProcess()在DLL中,所以編譯器甚至無法進行任何鏈接時優化(如果需要的話)。它只是奇蹟般地假定ExitProcess()永遠不會返回。

我認爲編譯器不應該做這樣的事情。

回答

5

ExitProcess由文檔定義爲永不返回。如果你編寫了一個可以返回的替換函數,那麼你違背了文檔所做的承諾,並且任何破壞都是你的問題。

C++ 11對這些函數的概念進行了標準化,並對它們進行了標記。 VS並沒有實現這一點,但我相信,但沒有什麼阻止他們實現它的具體功能。

爲什麼編譯器不應該假定ExitProcess()不返回?它很清楚地定義爲退出進程

+0

好的,這是有道理的。 VC++是否使用某些平臺特定的符號來表示這些函數? – NFRCR

+0

我真的不知道。它們同樣可能只是在編譯器本身內部特別包含它。你必須看看我想的標題。 – Puppy

3

相關標題中的ExistProcess聲明大概註明了__declspec(noreturn)。由於這是一種語言擴展,而不是標準的語言結構,因此是否允許這樣的優化是由編譯器編寫者(而不是標準委員會)自行決定的。

相關問題