2012-06-29 19 views
6

Ambiente: Microsoft Visual Studio 2010 con SP1 Preminum (10.0.40219.1 SP1Rel), Windows XP SP3¿Es esto un Microsoft VC++ 2010 error del compilador de "auto nuevo (enum_type)"

VC10 compilador palabra clave auto de la ayuda, pero el la información relacionada con el tipo deducido parece no ser siempre correcta para la enumeración.

ejemplo:

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

El código anterior no debe tener ningún error en tiempo de compilador o error de ejecución. Pero lo que me sorprende es que compila bien sin ningún error o advertencia, pero no se ejecuta correctamente. El depurador dice después de salir de la función principal:

CORRUPCIÓN DE ALMOHADA DETECTADA: después del bloque% hs (# 55) en 0x00034878. CRT detectó que la aplicación escribió en la memoria después del final del almacenamiento intermedio de almacenamiento dinámico.

así que supongo que el compilador puede tener errores en la deducción "automática". La ventana de ensamblador a continuación muestra que, el tamaño de memeory solicitado en la primera llamada de "operador nuevo" es de 1 byte, mientras que el segundo "operador nuevo" de 4 bytes. Sugiere que el compilador cometió un gran error en el tamaño del tipo deducido.

¿Crees que esto es un error del compilador? ¿Y hay correcciones de errores de 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

En el depurador, ¿cuál es el tipo de 'pa'? – RedX

+0

el depurador muestra: banana 0x000000c8 int; pa 0x000329d8 fruit_t * const; pb 0x00032a18 fruit_t * const. Mal, muestra que 'banana' es de tipo 'int' (no 'fruit_t'). El depurador de VC10 tiene muchos errores por lo que yo sé, por lo que la información de tipo que se muestra arriba es sospechosa. – jgx

+0

Aunque mi depurador VS2010 muestra los tipos correctos (fruta *) se bloquea en los asignados con automático. – RedX

Respuesta

1

Sí, creo que es un error VS2010. Ejecutando lo mismo que usted (o al menos muy similar) con XP SP3 (32 bits) y VS2010 SP1, obtengo exactamente el mismo error. Parece ser específico para las enumeraciones, ya que al probarlo con las clases se mostró que todo funcionaba correctamente. También intenté agregar otro artículo de fruta a la enumeración, con un valor de 100000 solo para asegurarme de que no era algo tonto como que tu enumeración tuviera todos los valores por debajo de 255. El mismo resultado.

Hice una búsqueda rápida en Microsoft Connect, y no veo un informe de error para esto, así que le recomiendo que ingrese uno. Esa es la mejor manera de asegurarse de que Microsoft sepa y posiblemente lo solucione.

+1

Este error se corrigió en VS2012, no tiene sentido presentar un informe de comentarios. –

+5

Yo diría que aún se debe presentar un informe de retroalimentación. Primero, VS2012 aún no se ha lanzado. Más importante aún, incluso si (cuando) se cierra como "No se Corrige", al menos estará allí para que otras personas lo encuentren. –

Cuestiones relacionadas