VC 2008 一个 可能的BUG ,或者本人的无知,请有大侠解读一下

来源:互联网 发布:股票量化分析软件 编辑:程序博客网 时间:2024/05/14 09:32
/*源码*/
#include <stdio.h>


void ttt(size_t bsize)
{
size_t _size = bsize > 1 ? bsize : 9;
printf("real set id : %d \n",_size);
}
inline void set(size_t  id ,bool val)
{
size_t ns =   id * 2 ;
ttt(ns);
}


int main()
{
for (int i = 2 ;i < 5 ;i++){
printf("set i: %d \n",i);
set(i,true);
getchar();
}
   getchar();
return 0;
}


 VS2008  ,Debug 版本正常  编译Release 异常 ,下面是Release版的汇编代码,有明显错误


/*错误的优化代码*/


_main:
  00401000: 53                 push        ebx
  00401001: 8B 1D A0 20 40 00  mov         ebx,dword ptr [__imp__getchar]
  00401007: 56                 push        esi
  00401008: 57                 push        edi
  00401009: 8B 3D A4 20 40 00  mov         edi,dword ptr [__imp__printf]
  0040100F: BE 02 00 00 00     mov         esi,2
  00401014: 56                 push        esi
  00401015: 68 18 21 40 00     push        offset ??_C@_0M@DAPCNNFP@set?5i?3?5?$CFd?5?6?$AA@
  0040101A: FF D7              call        edi
  0040101C: 83 C4 08           add         esp,8
  0040101F: 8D 04 36           lea         eax,[esi+esi]
  00401022: 83 FE FF           cmp         esi,0FFFFFFFFh    /* 比较的是 1 此处为何成整数最大值 ,而且 esi 也还是没有乘以 2 之前的变量i的值 */
  00401025: 77 05              ja          0040102C
  00401027: B8 09 00 00 00     mov         eax,9
  0040102C: 50                 push        eax
  0040102D: 68 04 21 40 00     push        offset ??_C@_0BD@ENCIACNH@real?5set?5id?5?3?5?$CFd?5?6?$AA@
  00401032: FF D7              call        edi
  00401034: 83 C4 08           add         esp,8
  00401037: FF D3              call        ebx
  00401039: 46                 inc         esi
  0040103A: 83 FE 05           cmp         esi,5
  0040103D: 7C D5              jl          00401014
  0040103F: FF D3              call        ebx
  00401041: 5F                 pop         edi
  00401042: 5E                 pop         esi
  00401043: 33 C0              xor         eax,eax
  00401045: 5B                 pop         ebx

  00401046: C3                 ret


将源码稍加修改 --- 删除main函数中printf函数,就对了,

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*源码*/
#include <stdio.h>


void ttt(size_t bsize)
{
size_t _size = bsize > 1 ? bsize : 9;
printf("real set id : %d \n",_size);
}
inline void set(size_t  id ,bool val)
{
size_t ns =   id * 2 ;
ttt(ns);
}


int main()
{
for (int i = 2 ;i < 5 ;i++){
//printf("set i: %d \n",i);
set(i,true);
getchar();
}
   getchar();
return 0;
}






/*正确的优化代码*/
_main:
  00401000: 53                 push        ebx
  00401001: 8B 1D A4 20 40 00  mov         ebx,dword ptr [__imp__printf]
  00401007: 56                 push        esi
  00401008: 57                 push        edi
  00401009: 8B 3D A0 20 40 00  mov         edi,dword ptr [__imp__getchar]
  0040100F: BE 04 00 00 00     mov         esi,4
  00401014: 8B C6              mov         eax,esi
  00401016: 83 FE 01           cmp         esi,1                              /*此处正确*/
  00401019: 77 05              ja          00401020
  0040101B: B8 09 00 00 00     mov         eax,9
  00401020: 50                 push        eax
  00401021: 68 04 21 40 00     push        offset ??_C@_0BD@ENCIACNH@real?5set?5id?5?3?5?$CFd?5?6?$AA@
  00401026: FF D3              call        ebx
  00401028: 83 C4 08           add         esp,8
  0040102B: FF D7              call        edi
  0040102D: 83 C6 02           add         esi,2
  00401030: 83 FE 0A           cmp         esi,0Ah
  00401033: 7C DF              jl          00401014
  00401035: FF D7              call        edi
  00401037: 5F                 pop         edi
  00401038: 5E                 pop         esi
  00401039: 33 C0              xor         eax,eax
  0040103B: 5B                 pop         ebx
  0040103C: C3                 ret





百思不得其解,请大侠指教