是否允许编译器进行此类优化
Is the compiler allowed to do such an optimization?
编译器:VC 2013模式:版本
故事:我了解了IAT钩。我决定练习ExitProcess()。替换功能返回后,我立即崩溃。为什么?因为以某种方式编译器决定认为,exitProcess()下面的内容将永远不会被执行,以免生成代码。例如,当我将ExitProcess()放入IF语句中时,一切都很好。那么这是如何有效的优化呢?exitProcess()在DLL内部,因此编译器在愿意的情况下甚至无法进行任何链接时间优化。它只是神奇地假设ExitProcess()永远不会返回。
我认为编译器不应该这样做。
exitProcess由文档定义为永不返回。如果您编写了确实返回的替换功能,那么您会违反文档所做的承诺,因此任何破损都是您的问题。
c 11标准化了此类功能的概念,并为其具有符号。我相信VS还没有实施此功能,但是没有什么可以阻止它们为特定功能实施。
为什么编译器不应该假设ExitProcess()不返回?它清楚地定义了退出过程。
相关标头中 ExistProcess
的声明大概是用__declspec(Noreturn)注释的。由于这是一种语言扩展,而不是标准语言结构,因此是否允许使用此类优化。
相关文章:
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++编译器是否优化了顺序静态变量读取?
- VS2017调试器:没有地址,可能是由于编译器优化
- 何时允许编译器优化复制构造函数
- 编译器(Visual C++)如何优化按索引访问矢量元素?
- static_assert有助于优化编译器吗?
- 哪个优化编译器开关使调试非常困难
- 优化编译器可以添加std::move吗
- VisualStudio 优化编译器版本 19.00.23506.0 中存在明显的编译错误
- C++是否允许优化编译器忽略对 for 条件的副作用
- 优化编译器能否从 std::unique_ptr 中消除所有运行时成本
- Microsoft c++优化编译器不断崩溃
- 优化编译器如何决定何时展开循环以及展开多少循环
- 有一个很好的测试c++优化编译器
- Mac上的g++链接时间优化-编译器/链接器错误
- visual_itoa_s一直在杀死c++优化编译器,为什么?
- Microsoft C/C++ 优化编译器编译到什么
- 优化编译器消除bug