2012-06-29 3 views
6

的環境のこのマイクロソフトVC++ 2010コンパイラのバグです:マイクロソフトのVisual Studio 2010 SP1 Preminum(10.0.40219.1 SP1Rel)、Windows XPのSP3は "新しい自動(enum_type)"

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は、アプリケーションがヒープバッファの終了後にメモリに書き込んだことを検出しました。

だから、コンパイラは "auto"型の控除にバグがあるかもしれないと思います。以下のアセンブラウィンドウでは、最初の "operator new"呼び出しで要求されたmemeoryサイズは1バイトであり、2番目の "operator new"は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 
} 
+1

デバッガでは 'pa'の種類は何ですか? – RedX

+0

デバッガは以下を示します。banana 0x000000c8 int; pa 0x000329d8 fruit_t * const; pb 0x00032a18 fruit_t * const。ひどく、バナナはタイプ 'int'(fruit_tではない)であることを示しています。 VC10のデバッガには、私が知る限り、多くのバグがあります。上に表示されたタイプ情報は疑わしいものです。 – jgx

+0

私のデバッガVS2010が正しいタイプ(フルーツ*)を表示していても、autoで割り当てられたものでクラッシュします。 – RedX

答えて

1

はい、VS2010バグだと思います。 XP SP3(32ビット)とVS2010 SP1と同じように(または少なくとも非常に似ている)実行すると、まったく同じエラーが発生します。列挙型に固有のように見えます。クラスを試してみると、すべてが正しく動作していることがわかります。私はまた、列挙型に別の果物アイテムを追加しようとしました.100000という値は、255未満の値を持つ列挙型のようなものではないことを確認しています。

Microsoft Connectですばやく検索しましたが、バグレポートが表示されないので、入力することをおすすめします。これは、マイクロソフトが知っているかどうかを確認し、おそらくそれを修正するための最良の方法です。

+1

このバグはVS2012で修正されました。フィードバックレポートを提出する時点はありません。 –

+5

私は、フィードバックレポートを提出する必要があると主張します。まず、VS2012はまだリリースされていません。さらに重要なのは、たとえ(時)に「修正されない」として閉じられても、少なくとも他の人が見つけることができることです。 –