MSVC 2015优化了不稳定变量?
我在MSVS2015中以发布模式编译了以下代码:MSVC 2015优化了不稳定变量?,c,visual-studio,visual-c++,visual-studio-2015,side-effects,C,Visual Studio,Visual C++,Visual Studio 2015,Side Effects,我在MSVS2015中以发布模式编译了以下代码: #include "stdafx.h" #include "stdio.h" void f() { for (int i = 0; i < 10; i++) { volatile int var = 10; if (var) // Breakpoint can't be set { printf("Test\n"); // Breakpoint can
#include "stdafx.h"
#include "stdio.h"
void f()
{
for (int i = 0; i < 10; i++)
{
volatile int var = 10;
if (var) // Breakpoint can't be set
{
printf("Test\n"); // Breakpoint can't be set
}
}
}
int main()
{
f();
return 0; // Second breakpoint
}
拆卸(释放):
#包括“stdafx.h”
#包括“stdio.h”
void f()
{
对于(int i=0;i<10;i++)
{
挥发性int-var=10;
if(var)
{
printf(“测试”);
}
}
}
int main()
{
00FE1040推式ebp
00FE1041 mov ebp,esp
00FE1043推送ecx
00FE1044推式esi
f();
00FE1045电影esi,0Ah
00FE104A nop字ptr[eax+eax]
00FE1050 mov德沃德ptr[ebp-4],0Ah
00FE1057 cmp dword ptr[ebp-4],0
00FE105B je干管+2Ah(0FE106Ah)
00FE105D推送偏移字符串“测试\n”(0FE20F8h)
00FE1062呼叫打印F(0FE1010h)
00FE1067添加esp,4
00FE106A子esi,1
00FE106D jne干管+10h(0FE1050h)
返回0;
00FE106F异或eax,eax
00FE1071 pop esi
}
00FE1072电动潜油电泵,ebp
00FE1074 pop ebp
00FE1075 ret
问题是行if(var)
是否生成读取指令。如果没有,编译器将毫无希望地损坏,并且不符合要求。每个人都知道VS的情况。您确定在发布版本中设置断点是完全可能的吗?如果可能,请反汇编代码。根据我的经验,MS编译器不会删除像全局变量和静态变量那样的volatile
访问。因此,作为一种解决方法,只需将static
添加到var
的定义中var
是易变的,但没有外部链接,并且从不使用地址。我不知道是否符合标准,但在Windows ABI中,编译器正确地推断出值永远不会更改。
MSVS Version : 14.0.25431.01 Update 3
#include "stdafx.h"
#include "stdio.h"
void f()
{
for (int i = 0; i < 10; i++)
{
volatile int var = 10;
if (var)
{
printf("Test\n");
}
}
}
int main()
{
00FE1040 push ebp
00FE1041 mov ebp,esp
00FE1043 push ecx
00FE1044 push esi
f();
00FE1045 mov esi,0Ah
00FE104A nop word ptr [eax+eax]
00FE1050 mov dword ptr [ebp-4],0Ah
00FE1057 cmp dword ptr [ebp-4],0
00FE105B je main+2Ah (0FE106Ah)
00FE105D push offset string "Test\n" (0FE20F8h)
00FE1062 call printf (0FE1010h)
00FE1067 add esp,4
00FE106A sub esi,1
00FE106D jne main+10h (0FE1050h)
return 0;
00FE106F xor eax,eax
00FE1071 pop esi
}
00FE1072 mov esp,ebp
00FE1074 pop ebp
00FE1075 ret