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

标签 c++ visual-c++

编译器: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/

相关文章:

c++ - 如何在 Xcode 4 (C++) 中相对引用文件?

c++ - 单独的编译和模板显式实例化

c++ - 无法在 Visual C++ 2010 中使用 default_random_engine 字段创建类

c - VC++获取头文件路径

c++ - 使用 __m64 引用将 C++ 项目转换为 x64

c++ - 如何在 Qt Creator 中静态构建非 Qt 项目

c++ - 在异常情况下将临时对象绑定(bind)到非常量引用

c++ - 为什么 pre_c_init 会访问定义的程序段之外的内存?

c++ - 创建新对象会破坏 C++ 中具有不同名称的旧对象

c++ - MSVC 编译器实例化函数模板的默认定义,即使存在专门化