2009-02-04 27 views
5

Mi compilador (VC++ 6.0 sp6) aparentemente se ha vuelto loco. En ciertos fragmentos de código veo que 'bool mybool = true;' evalúa y asigna falso y viceversa para verdadero. Cambiar las palabras clave verdadero/falso a 1/0 lo hace funcionar bien. El mismo código se compila en cualquier otro lugar sin cambiar las palabras clave verdadero/falso.C++ palabras clave 'verdadero' y 'falso' de repente no es verdadero o falso en Visual C++ 6.0

¿Qué podría causar esto? Lo primero que pensé fue en la corrupción de la RAM o el disco, pero todo salió bien. No estoy lejos de reformatear mi disco y volver a instalar todo, pero estoy aterrado de que todavía vea la misma mala conducta.

¿Es técnicamente posible que una macro o una biblioteca enlazada en algún lugar arruine el significado de 'true' y 'false'?

ACTUALIZACIÓN: Misterio resuelto. Un marcador de variable de entorno en mi máquina se configuró en 'falso' y la forma en que esto fue interpolado por algún código de preprocesador redefinió la palabra clave.

+0

¿Solo ve el problema al pasar por el depurador o realmente cambia el flujo de control? – tsellon

+0

¿Está viendo esto debajo del depurador en una compilación de lanzamiento? Las optimizaciones pueden hacer que los contenidos de las variables sean notoriamente poco confiables. –

+0

Solo hacemos compilaciones de depuración. Veo la misma mala conducta tanto en el depurador como en el funcionamiento normal. – kingkongrevenge

Respuesta

13

Un macro de preprocesador sin duda podría hacerlo, aunque sería bastante sorprendente. Una forma de comprobar si ese es el caso, sería

#ifdef true 
# error "true is defined as a macro" 
#endif 
#ifdef false 
# error "false is defined as a macro" 
#endif 

Respuesta a los comentarios:

encontrar un archivo no cabecera donde se ve este comportamiento, de preferencia uno con pocos #includes.

En el medio de la lista de inclusiones, coloque las directivas #ifdef #error.

si el error se produce, usted sabe que está en la primera mitad de los incluidos, si no es en la segunda mitad. Divide la mitad por la mitad y repite. Cuando lo reduce a un encabezado, abra ese encabezado. Si ese encabezado incluye cualquier encabezado, repita el proceso para la lista de encabezados que incluye. Eventualmente deberías poder encontrar las #defines. Tedioso, estoy de acuerdo.

+0

TRUE y FALSE se definen como macros, pero están definidos correctamente. ¿Es ifdef sensible a mayúsculas y minúsculas ¿Cómo puedo obtener el preprocesador para decirme DONDE está definida la macro? – kingkongrevenge

+1

#undef true #undef falso LO RESUELTA. Pero no tengo idea de dónde están las # definiciones defectuosas. He intentado con la expresión regular buscando todos los archivos de encabezado que puedo encontrar, pero he salido en blanco. – kingkongrevenge

+0

He editado mi respuesta para ayudar con estas preguntas. –

3

Lo más probable es que un archivo de encabezado esté volteando los valores a través de macro, aunque no pude aventurar una adivinanza. ¿Hay alguna posibilidad de que el archivo se compile como C y otros como C++ y haya algún código de definición # ifdef/# en algún lugar que intente "corregir" los valores verdadero/falso, pero los haya equivocado?

1

Es técnicamente posible redefinir bool, pero no puedo ver por qué su entorno particular sería el único en el que este número superficies.

Quizás alguien se está divirtiendo un poco con usted?

5

Los desbordamientos del búfer y la escritura en la memoria no inicializada también pueden dar cuenta de dicho comportamiento. Por ejemplo, si tiene una matriz y un bool asignados en ubicaciones de memoria adyacentes y escribe accidentalmente más allá de los límites de la matriz.

0

Incluso en Visual Studio 2003 también a veces me sucede a mí. Pero no sé la causa exacta de esto. Esto ocurre mientras se verifica el valor de retorno de una función. Aunque estoy devolviendo el valor verdadero de una función, al tiempo que asigno el valor de retorno en la función de llamada, true se convierte en falso y falso en verdadero.

En ese caso, verifico algún otro parámetro de salida.

+0

en serio? Esto te pasa a ti? ¿Cómo logras escribir código con algún grado de predictibilidad si esto sucede y no sabes por qué? –

+0

Cuando estoy cambiando algún código heredado solo una vez que sucedió. Ese código heredado no es bueno, tiene todos los defectos que un programa puede tener :) – Vinay

+0

Ok. Parecía que tuviste este problema regularmente. :) –

5

Si está viendo este problema al verificar los valores de las variables en el depurador y está ejecutando una compilación de lanzamiento, podría ser simplemente un artefacto del sistema de depuración. La forma más sencilla de comprobar esto sería añadir algo de código a lo largo de las líneas de:

if (mybool) 
    printf("mybool is true\n"); 
else 
    printf("mybool is false\n"); 

Usted será capaz de identificar rápidamente si el depurador es correcta o no.

4

En primer lugar, VC6 es antiguo y con errores. Hay casos en los que solo genera código incorrecto, que podría ser la respuesta a su problema. No use VC6 si tiene una opción.

En segundo lugar, lo que está viendo es probablemente el resultado de optimizaciones. ¿Su código se comporta correctamente? Si es así, es solo que el depurador se confunde porque el código que se ejecuta es diferente (debido a las optimizaciones) que el código fuente.

3

Recuerdo vagamente que con VC6 puede ejecutar el preprocesador solo y ver su salida. Puede ser un cambio de compilador.

En cualquier caso, es casi seguro que es el resultado de #defines que se salieron mal. Si fue una sobreescritura de memoria, como se ha sugerido, es probable que veas otros comportamientos igualmente extraños.

1

Problemas como estos dan miedo, porque realmente no tiene dónde empezar.

La primera prueba que haría es buscar todo el código fuente de su proyecto para cosas que coincidan con "#define" y "true", o "#define" y "false". Si tienes a alguien alrededor que conoce a Perl, ese debería ser un guión rápido.

¿Depende de la vinculación con algunas bibliotecas externas que pueden haber cambiado? Si sospecha alguna rareza con algo con lo que se está enlazando, puede intentar los siguientes pasos:

  • Haga un programa que verifique el valor de verdadero/falso.
  • Compile este programa, asegurándose de vincular este programa con todas las bibliotecas que tiene su código fuente.
  • Ejecute su programa y vea si su programa mínimo muestra el error verdadero/falso que está afectando su problema.

Si ese programa mínimo tiene el error, ha aislado el problema a algo que está haciendo con la vinculación. La próxima prueba obvia después de eso es vincular el programa con nada más que las librerías estándar de C++ para probar si su compilador tiene alguna falla.

Finalmente, antes de formatear su máquina, haga que otra persona compile su código. Eso es realmente fácil, y si el guión de Perl no apareciera nada, definitivamente le pediría ayuda a un compañero de trabajo.

Cuestiones relacionadas