2012-03-29 24 views
5

Duplicar posible:
Why do I see strange values when I print uninitialized variables?
Fun with uninitialized variables and compiler (GCC)variable booleana sin inicializar

Quiero saber acerca de un misterioso problema que me enfrentaba, mientras que la solución de un problema de código.

El código que está presente en producción tiene una variable booleana no inicializada y una biblioteca está comprobando el valor de este booleano. En el sitio EN VIVO, esta variable se comporta como VERDADERO siempre El mismo código en el entorno de desarrollo se comporta siempre como FALSO.

Lo sé, debido a la diferencia de entorno entre EN VIVO & DEV, una variable de bool no inicializada puede tener un valor indefinido.

Pero aquí está mi problema.

Si pongo una sentencia de registro en el código, compila y pone el binario en el entorno de desarrollo, la variable bool está teniendo TRUE siempre, mientras que FALSE con el código en LIVE.

¿Cómo afecta una declaración de registro el valor de una variable bool no inicializada? Me gustaría saber las posibilidades.

+2

posible duplicado de http://stackoverflow.com/questions/4879045/fun-with-uninitialized-variables-and-compiler-gcc http://stackoverflow.com/questions/2154132/printing-an-uninitialized -bool-using-cout-c – Kasma

Respuesta

14

Una variable no inicializada es solo una pieza de memoria en bruto y mostrará el valor de lo que sea que haya pasado. Tu idea de que "En el sistema en vivo siempre sucede que es verdad" es totalmente incorrecta. Todo lo que puede decir es que cada vez que lo observó en el sistema en vivo, parecía ser cierto. Puede ser el próximo martes, en cambio, será falso porque es bien sabido que los bools no inicializados odian los martes.

Tenga en cuenta que incluso es completamente posible que un booleano no inicializado parezca verdadero para una función y falso para otra (normalmente se asigna un byte completo para bool, pero solo se necesita un bit para representar el valor: es posible que una versión no inicializada bool contendrá un valor mágico borroso bool que es cierto para alguien y falso para otra persona).

En cuanto a lo que la norma dice accediendo a una variable no inicializada para la lectura puede ser de hecho un comportamiento indefinido, sin límite de lo que puede suceder que incluye los accidentes (y, por ejemplo, es fácil tener un programa de "parar" al leer una variable no inicializada , solo compila con una herramienta específica para rastrear este tipo de problema). Tener un bloqueo de programa siempre al acceder a una variable no inicializada sería maravilloso, pero lamentablemente es bastante costoso en las CPU actuales y no va a suceder a menos que se utilicen herramientas específicas.

Por supuesto, la adición de solo una llamada printf puede cambiar el comportamiento aparente del código al manejar variables no inicializadas. Este tipo de error a menudo se denomina "heisenbug" y en realidad el comportamiento aleatorio o heisenbug a menudo es una indicación de una variable no inicializada o de un problema de sincronización de subprocesos.

+1

upvoted solo por "es bien sabido que los bools no inicializados odian los martes" – dberm22

2

Usted ha declarado:

una variable sin inicializar bool puede tener un valor indefinido.

En realidad, debería ser: "sin inicializar una variable bool siempre tiene un valor indefinido."

El hecho de que su valor esté cambiando no cambia el hecho de que no está definido. La única garantía en el comportamiento es lo que define las especificaciones. Mientras no esté definido con una definición de almacenamiento estático, el comportamiento es exactamente eso: indefinido. El compilador puede hacer lo que quiera con esta variable, puede inicializarlo, puede que no, puede optimizarlo completamente si no se registra (es decir, se usa), etc.

Básicamente, necesita inicialice su bool correctamente, y no puede preocuparse por eso.

+0

Sé que siempre es indefinido. Pero me gustaría saber por qué un cambio menor puede afectar su valor. Siempre es falso en el entorno de desarrollo, hasta que hago un cambio menor y vuelvo a compilar. – cppcoder

+0

Es * undefined *. * Cualquier cosa * que haga puede hacer que el compilador genere un programa con diferentes resultados y no necesariamente una razón obvia. –

Cuestiones relacionadas