2012-06-29 10 views
6

Ambiente: Microsoft Visual Studio 2010 con SP1 Preminum (10.0.40219.1 SP1Rel), Windows XP SP3questo è un Microsoft VC++ 2010 compilatore bug di "auto nuova (enum_type)"

VC10 compilatore supporto automatico di parole chiave, ma la le informazioni relative al tipo dedotte sembrano non sempre corrette per l'enumerazione.

esempio:

#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; 
} 

Il codice di cui sopra dovrebbe avere alcun errore del compilatore-time o errore di runtime. Ma quello che mi sorprende è che, compila bene senza alcun errore o avvertimento ma, non funziona correttamente. Il debugger indica dopo l'uscita la funzione principale:

RILEVAMENTO CORPO DI HEAP: dopo il blocco% hs (# 55) a 0x00034878. CRT ha rilevato che l'applicazione ha scritto nella memoria dopo la fine del buffer heap.

quindi suppongo che il compilatore possa avere bug nella deduzione di tipo "auto". La finestra di assembler qui sotto mostra che la dimensione del meme richiesto nella prima chiamata "operator new" è 1 byte, mentre il secondo "operator new" 4 byte. Suggerisce che il compilatore ha fatto un grosso errore sulla dimensione del tipo dedotto.

Pensavate che questo fosse un bug del compilatore? E ci sono correzioni di bug da 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

Nel debugger qual è il tipo di 'pa'? – RedX

+0

il debugger mostra: banana 0x000000c8 int; pa 0x000329d8 fruit_t * const; pb 0x00032a18 fruit_t * const. Male, mostra che 'banana' è di tipo 'int' (non 'fruit_t'). Il debugger di VC10 ha molti bug per quanto ne so, quindi le informazioni sul tipo visualizzate sopra sono sospette. – jgx

+0

Eventhough mio debugger VS2010 mostra i tipi corretti (frutta *) si blocca su quelli assegnati con auto. – RedX

risposta

1

Sì, penso che sia un bug VS2010. Funzionando come te (o almeno molto simile) con XP SP3 (32-bit) e VS2010 SP1, ottengo lo stesso identico errore. Sembra essere specifico per le enumerazioni, dato che provarlo con le classi ha mostrato che tutto funziona correttamente. Ho anche provato ad aggiungere un altro oggetto di frutta all'enum, con un valore di 100000 solo per assicurarsi che non fosse qualcosa di sciocco come il tuo enum con tutti i valori inferiori a 255. Lo stesso risultato.

Ho fatto una ricerca rapida a Microsoft Connect e non vedo un bug report per questo, quindi vi consiglio di inserirne uno. Questo è il modo migliore per assicurarsi che Microsoft conosca e possibilmente correggerlo.

+1

Questo errore è stato risolto in VS2012, nessun punto nel presentare un rapporto di feedback. –

+5

Direi che un rapporto di feedback dovrebbe ancora essere archiviato. Innanzitutto, VS2012 non è ancora stato rilasciato. Ancora più importante, anche se (quando) è chiuso come "Will not Fix", almeno lo sarà per altre persone. –

Problemi correlati