编译器:VC++ 2013
模式:释放
故事:我了解了IAT挂钩。我决定在ExitProcess()上练习。替换功能返回后,我立即崩溃了。为什么?因为以某种方式,编译器决定认为ExitProcess()之后的内容将永远不会执行,因此不会生成代码。例如,当我将ExitProcess()放入if语句中时,一切都很好。那么这如何是有效的优化呢? ExitProcess()位于DLL内,因此如果愿意,编译器甚至无法进行任何链接时优化。它只是神奇地假设ExitProcess()将永远不会返回。
我认为编译器不应该这样做。
最佳答案
文档将ExitProcess定义为永不返回。如果您编写了一个返回的替换函数,那么您将违反文档所做的 promise ,因此,任何损坏都是您的问题。
C++ 11对此类功能的概念进行了标准化,并对它们进行了说明。我相信VS尚未实现此功能,但是并没有阻止他们针对特定功能实现它的功能。
为什么编译器不应该假定ExitProcess()不返回?已经明确定义了退出流程。