编译器:VC++2013 模式:发布
故事:我了解了 IAT Hook 。我决定练习 ExitProcess()。替换功能一返回,我就崩溃了。为什么?因为不知何故,编译器决定认为永远不会执行 ExitProcess() 之后的内容,因此不会生成代码。例如,当我将 ExitProcess() 放在 if 语句中时,一切正常。那么这如何是一个有效的优化呢? ExitProcess() 位于 DLL 中,因此编译器甚至无法根据需要进行任何链接时优化。它只是神奇地假设 ExitProcess() 永远不会返回。
我认为编译器不应该做这样的事情。
最佳答案
ExitProcess 由文档定义为永不返回。如果您编写了一个确实返回的替换函数,那么您就违反了文档所做的 promise ,因此造成的任何破坏都是您的问题。
C++11 标准化了此类函数的概念,并为它们提供了符号。我相信 VS 还没有实现这一点,但没有什么能阻止他们为特定功能实现它。
为什么编译器不应该假定 ExitProcess() 不返回?它非常明确地定义为退出进程。
关于c++ - 编译器是否允许进行这样的优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21283417/