昨天在CSDN上面看到这样一贴,居然爆料VC6/VS2003有一个严重的bug,于是自己也仔细研究一番:
1、原贴地址:
http://topic.csdn.net/u/20091126/10/81713034-7301-4183-93c0-654d75645582.html
2、出错代码:
#include <stdio.h>
int main()
{
static const int T[1] = {0};
int n = 0;
for(int i = 536000000; i < 536000004; ++i)
{
if(i < 0) { printf("impossible!!!/n"); break; }
if(i >= 0 && i < 1) n += T[i];
}
printf("end/n");
getchar();
return n;
}
3、原因分析
当我在使用IDE环境选择Release生成后,确实发现有上述问题
于是我修改他的代码,狼兄弟建议我先看看此时i的十进制数值与十六进制数值:
int main()
{
static const int T[1] = {0};
int n = 0;
for(int i = 536000000; i < 536000004; ++i)
{
if(i < 0)
{
printf("impossible is %d/t%x/n",i,i);
break;
}
if(i >= 0 && i < 1)
n += T[i];
}
printf("end/n");
return n;
}
在命令行编译参数中添加/Fa即可得到汇编代码(当前目录中Hello.asm):
查看Release生成后在汇编代码:
可以惊奇的发现i <0会被优化成0x800B5514 <0x00407D14,于是乎让我想起前面编译器优化参数的三个选项,打开IDE的编译选项:
3、解决办法:
这是由于编译器参数优化造成的,具体影响结果的参数是/O2(代码速度最快),如果使用/Od(不使用优化)则不会出现上述结果,测试如下图:
在此,十分感谢寂寞的狼、iceboy等友友的耐心的指导与无私的帮助!
4、相关文章: