是否允许编译器进行这样的优化?

NFR*_*RCR 2 c++ visual-c++

编译器:VC++ 2013模式:发布

故事:我了解到IAT挂钩.我决定在ExitProcess()上练习.一旦替换函数返回,我就崩溃了.为什么?因为不知何故,编译器决定认为ExitProcess()之后的内容永远不会执行,因此不会生成代码.例如,当我将ExitProcess()放在if语句中时,一切都很顺利.那么这是一个有效的优化呢?ExitProcess()在DLL中,因此如果需要,编译器甚至无法进行任何链接时优化.它只是神奇地假设ExitProcess()永远不会返回.

我认为编译器不应该做这样的事情.

Pup*_*ppy 5

ExitProcess由文档定义为永不返回.如果你写了一个确实返回的替换函数,那就是你违背了文档所做的承诺,结果是任何破坏都是你的问题.

C++ 11标准化了这些函数的概念并对它们有一个符号.我相信VS并没有实现这一点,但没有什么能阻止他们为特定功能实现它.

为什么编译器不应该假设ExitProcess()不返回?退出流程的定义非常明确.