是否允许编译器进行此类优化

Is the compiler allowed to do such an optimization?

本文关键字:优化 编译器 是否      更新时间:2023-10-16

编译器:VC 2013模式:版本

故事:我了解了IAT钩。我决定练习ExitProcess()。替换功能返回后,我立即崩溃。为什么?因为以某种方式编译器决定认为,exitProcess()下面的内容将永远不会被执行,以免生成代码。例如,当我将ExitProcess()放入IF语句中时,一切都很好。那么这是如何有效的优化呢?exitProcess()在DLL内部,因此编译器在愿意的情况下甚至无法进行任何链接时间优化。它只是神奇地假设ExitProcess()永远不会返回。

我认为编译器不应该这样做。

exitProcess由文档定义为永不返回。如果您编写了确实返回的替换功能,那么您会违反文档所做的承诺,因此任何破损都是您的问题。

c 11标准化了此类功能的概念,并为其具有符号。我相信VS还没有实施此功能,但是没有什么可以阻止它们为特定功能实施。

为什么编译器不应该假设ExitProcess()不返回?它清楚地定义了退出过程

相关标头中 ExistProcess的声明大概是用__declspec(Noreturn)注释的。由于这是一种语言扩展,而不是标准语言结构,因此是否允许使用此类优化。