2014-01-22 255 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)。由于这是一种语言扩展,而不是标准的语言结构,因此是否允许这样的优化是由编译器编写者(而不是标准委员会)自行决定的。

相关问题