6

環境:SP1 Preminum(10.0.40219.1 SP1Rel)、WindowsXPSP3を搭載したMicrosoftVisualStudio 2010

VC10コンパイラはautoキーワードをサポートしていますが、推定されたタイプ関連の情報は、列挙に対して常に正しいとは限りません。

例:

#include <type_traits>

enum fruit_t
{
    apple = 100,
    banana = 200,
};

int main()
{
    const auto pa = new auto(banana);
    const auto pb = new fruit_t(banana);
    static_assert(std::is_same<decltype(pa), decltype(pb)>::value, "not same!");
    delete pb;
    delete pa;
}

上記のコードには、コンパイラ時エラーや実行時エラーはありません。しかし、私を驚かせたのは、エラーや警告なしで正常にコンパイルされますが、正しく実行されないことです。デバッガーは、終了後にmain関数に次のように通知します。

検出されたヒープ破損:0x00034878での%hsブロック(#55)の後。CRTは、ヒープバッファの終了後にアプリケーションがメモリに書き込んだことを検出しました。

したがって、コンパイラには「自動」型の推定にバグがある可能性があると思います。以下のアセンブラウィンドウは、最初の「operator new」呼び出しで要求されたメモリサイズが1バイトであり、2番目の「operatornew」呼び出しで要求されたメモリサイズが4バイトであることを示しています。これは、コンパイラが推定型のサイズに大きな間違いを犯したことを示唆しています。

これはコンパイラのバグだと思いましたか?また、Microsoftからのバグ修正はありますか?

int main()
{
004113C0  push        ebp  
004113C1  mov         ebp,esp  
004113C3  sub         esp,10Ch  
004113C9  push        ebx  
004113CA  push        esi  
004113CB  push        edi  
004113CC  lea         edi,[ebp-10Ch]  
004113D2  mov         ecx,43h  
004113D7  mov         eax,0CCCCCCCCh  
004113DC  rep stos    dword ptr es:[edi]  
    const auto pa = new auto(banana);
004113DE  push        1  
004113E0  call        operator new (411181h)  
004113E5  add         esp,4  
004113E8  mov         dword ptr [ebp-104h],eax  
004113EE  cmp         dword ptr [ebp-104h],0  
004113F5  je          main+51h (411411h)  
004113F7  mov         eax,dword ptr [ebp-104h]  
004113FD  mov         dword ptr [eax],0C8h  
00411403  mov         ecx,dword ptr [ebp-104h]  
00411409  mov         dword ptr [ebp-10Ch],ecx  
0041140F  jmp         main+5Bh (41141Bh)  
00411411  mov         dword ptr [ebp-10Ch],0  
0041141B  mov         edx,dword ptr [ebp-10Ch]  
00411421  mov         dword ptr [pa],edx  
    const auto pb = new fruit_t(banana);
00411424  push        4  
00411426  call        operator new (411181h)  
0041142B  add         esp,4  
0041142E  mov         dword ptr [ebp-0F8h],eax  
00411434  cmp         dword ptr [ebp-0F8h],0  
0041143B  je          main+97h (411457h)  
0041143D  mov         eax,dword ptr [ebp-0F8h]  
00411443  mov         dword ptr [eax],0C8h  
00411449  mov         ecx,dword ptr [ebp-0F8h]  
0041144F  mov         dword ptr [ebp-10Ch],ecx  
00411455  jmp         main+0A1h (411461h)  
00411457  mov         dword ptr [ebp-10Ch],0  
00411461  mov         edx,dword ptr [ebp-10Ch]  
00411467  mov         dword ptr [pb],edx  
    static_assert(std::is_same<decltype(pa), decltype(pb)>::value, "not same!");
    delete pb;
0041146A  mov         eax,dword ptr [pb]  
0041146D  mov         dword ptr [ebp-0ECh],eax  
00411473  mov         ecx,dword ptr [ebp-0ECh]  
00411479  push        ecx  
0041147A  call        operator delete (411087h)  
0041147F  add         esp,4  
    delete pa;
00411482  mov         eax,dword ptr [pa]  
00411485  mov         dword ptr [ebp-0E0h],eax  
0041148B  mov         ecx,dword ptr [ebp-0E0h]  
00411491  push        ecx  
00411492  call        operator delete (411087h)  
00411497  add         esp,4  
}
4

1 に答える 1

1

はい、VS2010のバグだと思います。XP SP3(32ビット)およびVS2010 SP1で同じように(または少なくとも非常によく似た方法で)実行すると、まったく同じエラーが発生します。クラスで試してみると、すべてが正しく機能していることがわかったため、列挙型に固有のように見えます。また、列挙型に別のフルーツアイテムを追加してみました。値は100000で、すべての値が255未満の列挙型のようなばかげたものではないことを確認しました。同じ結果です。

Microsoft Connectで簡単に検索しましたが、バグレポートが表示されないので、入力することをお勧めします。これは、Microsoftがそれを認識し、場合によっては修正できるようにするための最良の方法です。

于 2012-06-29T14:17:02.107 に答える