2010-04-16 3 views
9

Sé que Visual Studio en las opciones de depuración llenará la memoria con un valor conocido. ¿Tiene g ++ (cualquier versión, pero gcc 4.1.2 es más interesante) tiene alguna opción que llene una estructura POD local no inicializada con valores reconocibles?¿Puede g ++ completar variables de POD no inicializadas con valores conocidos?

struct something{ int a; int b; }; 
void foo() { 
    something uninitialized; 
    bar(uninitialized.b); 
} 

espero uninitialized.b ser aleatoriedad imprevisible; claramente un error y se encontró fácilmente si la optimización y las advertencias están activadas. Pero compilado con -g solamente, sin advertencia . Un colega tenía un caso donde el código similar funcionaba porque tenía un valor válido; cuando el compilador se actualizó, comenzó a fallar. Pensó que era porque el nuevo compilador estaba insertando valores conocidos en la estructura (del mismo modo que VS rellena 0xCC). En mi propia experiencia, solo fueron diferentes los valores aleatorios que no resultaron ser válidos.

Pero ahora tengo curiosidad - ¿hay alguna configuración de g ++ que haría que se llene la memoria que la norma de lo contrario dice debe desinicializar?

Respuesta

3

No creo que tal opción/característica exista en gcc/g ++.

Por ejemplo, todas las variables globales (y estáticas) residen en la sección .bss, que siempre se inicializa a ceros. Sin embargo, los no inicializados se incluyen en una sección especial dentro del .bss, para mayor compatibilidad.

Si quiere que también se pongan a cero, puede pasar el argumento -fno-common al compilador. O, si lo necesita por variable, use __attribute__ ((nocommon)).

Para el montón, es posible escribir su propio asignador para lograr lo que describió. Pero para stack, no creo que haya una solución fácil.

+0

No creía que la característica existiera tampoco, pero el manual de gcc es largo y profundo, y me he sorprendido por lo que está escondido allí antes. –

1

No creo que g ++ detectará todos los casos como este, pero Valgrind ciertamente lo hará.

+0

Sí, otras herramientas de análisis parecen ser la solución. Parecía algo que el compilador podría arreglar, pero no demasiado sorprendente si no es así. –

4

Cualquiera C++ comiler puede inicializar cualquier tipo POD a su valor "cero" utilizando la sintaxis:

int i = int(); 
float f = float(); 
MyStruct mys = MyStruct(); 
// and generally: 
T t = T(); 

Si quieres hablar de depuración que es otra cosa ...

(Por cierto Creo que VS tenía memoria no inicializada inicializada en 0xCC cuando estaba en "modo de depuración, de modo que no importa dónde saltas (p. Ej. Llamar a un puntero de función incorrecto) eso no sucede que el código de programa actual/datos int3 se genera.)

+4

O, para aquellos que anhelan que C++ se vea como Lisp, 'T t ((T()))' :-) –

+1

@James: Tiene toda la razón, pero esta sintaxis me pone en un dilema. No sé qué duele más mirarlo: mis ojos o mi corazón. :) – conio

+0

Sí, * puede * inicializarse, pero no fue así, así que supongo que estoy realmente inclinado hacia la eliminación de errores. Sin embargo, suena como que la solución se encuentra fuera de g ++ (valgrind et.al). –

Cuestiones relacionadas