Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

509
Visualizações
En el modo de lanzamiento, el comportamiento del código no es el esperado

El siguiente código genera diferentes resultados en el modo de depuración y el modo de lanzamiento (usando Visual Studio 2008):

 int _tmain(int argc, _TCHAR* argv[]) { for( int i = 0; i < 17; i++ ) { int result = i * 16; if( result > 255 ) { result = 255; } printf("i:%2d, result = %3d\n", i, result) ; } return 0; }

La salida del modo de depuración, que es la esperada:

 i: 0, result = 0 i: 1, result = 16 (...) i:14, result = 224 i:15, result = 240 i:16, result = 255

La salida del modo de liberación, donde el resultado i:15 no es correcto:

 i: 0, result = 0 i: 1, result = 16 (...) i:14, result = 224 i:15, result = 255 i:16, result = 255

Al elegir "Optimización -> No optimizar" en Visual Studio en el modo de lanzamiento, el resultado de salida será correcto. Sin embargo, me gustaría saber por qué el proceso de optimización podría dar lugar a resultados erróneos.


Actualizar:

Según lo sugerido por Mohit JainBy, imprime por:

 printf("i:%2d, result = %3d, i*16=%d\n", i, result, i*16) ;

La salida del modo de liberación es correcta:

 i: 0, result = 0, i*16=0 i: 1, result = 16, i*16=16 (...) i:14, result = 224, i*16=224 i:15, result = 240, i*16=240 i:16, result = 255, i*16=256
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Esto es interesante, al menos desde una perspectiva histórica. Puedo reproducir el problema con VC 2008 (15.00.30729.01) y VC 2010 (16.00.40219.01) (orientado a x86 de 32 bits o x64 de 64 bits). El problema no ocurre con ninguno de los compiladores que probé a partir de VC 2012 (17.00.61030).

El comando que usé para compilar: cl /Ox vc15-bug.cpp /FAsc

Dado que VC 2008 (y 2010) es bastante antiguo y la solución se ha implementado durante varios años, no creo que pueda esperar ninguna acción de Microsoft, excepto usar un compilador más nuevo (aunque tal vez alguien pueda sugerir una solución).

El problema es que la prueba para determinar si el valor debe forzarse a 255 se realiza en función del recuento de bucles en lugar del resultado real de la expresión i * 16 . Y el compilador simplemente se equivoca al contar cuándo debería comenzar a forzar el valor a 255 . No tengo idea de por qué sucede eso, es solo el efecto que veo:

 ; 6 : for( int i = 0; i < 17; i++ ) 00001 33 f6 xor esi, esi $LL4@main: 00003 8b c6 mov eax, esi 00005 c1 e0 04 shl eax, 4 ; 7 : { ; 8 : int result = i * 16; ; 9 : ; 10 : if( result > 255 ) // the value `esi` is compared with in the following line should be 15! 00008 83 fe 0e cmp esi, 14 ; 0000000eH 0000b 7e 05 jle SHORT $LN1@main ; 11 : { ; 12 : result = 255; 0000d b8 ff 00 00 00 mov eax, 255 ; 000000ffH $LN1@main: ; 13 : }

Actualización : todas las versiones de VC que he instalado antes de VC 2008 tienen el mismo error, excepto VC6: compilar el programa bloquea el compilador VC6:

 vc15-bug.cpp(10) : fatal error C1001: INTERNAL COMPILER ERROR

¡Así que este es un error que duró en MSVC de una forma u otra durante más de 10 años!

over 4 years ago · Santiago Trujillo Relatório

0

Suponiendo que los datos informados sean correctos, esto sería un error del compilador. Compruebe la última versión del compilador. Si el error persiste, envíe un informe de error.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda