2012-05-10 12 views
17

El IBM AIX xlc compilador ofrece una bandera que genera código para inicializar el almacenamiento variable local:¿Hay un indicador de gcc para inicializar el almacenamiento de variables locales?

 initauto=<hh> 
        Initialialize automatic storage to <hh>. <hh> is a 
        hexadecimal value. This generates extra code and 
        should only be used for error determination. 

creo que el compilador MSVC hace algo similar para versiones de depuración, pero mi memoria puede ser confusa en este punto.

¿Existe una opción equivalente para GCC?

+0

'-Wextra' es grande para las nuevas bases de código que todavía no disponen de 3 millones de líneas de código. :) –

+0

No puedo creer que initialize se deletree "initialialize" en los documentos del compilador. –

+0

@AndrewMarshall: ¡Ja! Ni siquiera me di cuenta de eso. Realmente está escrito de esa manera, aunque ese xlc es bastante viejo. La [ayuda en línea] actual (http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Fcompiler%2Fref%2Fruoptini.htm) no tiene ese error. –

Respuesta

10

OK, la mejor respuesta que puedo ofrecer.

http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html dice "no," por omission. No hay documentación de nada para inyectar código de limpieza de pila en la salida.

Como lo que pude adivinar, la única manera de que esto podría funcionar, es inyectar algo memset -como código (tal vez tan simple como unos pocos mov operaciones, pero no obstante) en el comienzo de cada cuadro léxica incrustado en la que una se crea la variable automática. Tan cerca como puedo decir - y estoy ahora de un experto en las partes internas de GCC, pero - parece que no hay nada documentado que lo haga.

En más después de esto, el gccint.pdf PDF del CCG Internos (http://gcc.gnu.org/onlinedocs/gccint.pdf) en la página 361 define que el nombre del CCG para el puntero de marco etapa de comunicación de ajuste en la entrada a una función es prologue. (Realmente no sé/entiendo si esto se aplica a otros ámbitos léxicos dentro de una función). Dado que eso debería ocurrir en un archivo de definición de la máquina (md), cualquier opción de este tipo parece que debe definirse para un Arquitectura de la CPU Busqué en su ViewCVS en línea en http://gcc.gnu.org/viewcvs/trunk/gcc/config/i386/ y encontré (al menos una) copia de prologue alrededor de la línea 11,893 de i386.md, que después de reproducir search-for-the-function-expansion unos pocos saltos, no parece tener nada que ver con emitir un código condicional como ese.

Pero esto bajo-GCC's-campana es un poco ordenado ...

+0

Gracias, esta parece ser la más cercana a la respuesta correcta (actualmente). Sin duda, hay muchos detalles posibles involucrados en una implementación real, como las matrices de longitud variable C99, la reutilización del espacio variable local y cosas como 'alloca()'. –

0

C99: Si un objeto que tiene una duración de almacenamiento automática no se inicializa explícitamente, su valor es indeterminado.

Ha habido un tema sobre esta pregunta. What happens to a declared, uninitialized variable in C? Does it have a value?.

+5

Entiendo que la especificación del idioma no requiere inicialización de variables con duración de almacenamiento automática. Sin embargo, al menos un compilador tiene una * opción * para hacerlo si se lo solicita. Mi pregunta es si GCC tiene una opción similar. –

3

No puedo encontrar ninguna referencia definitiva, pero parece que ciertas copias de GCC (particularmente el compilador Gran Fortran) tienen una opción -finit-local-zero para establecer automáticamente cualquier matriz o variable local no explícitamente inicializada a cero.

Como va GCC estándar, la única característica en este tema que pude encontrar es -Wuninitialized para arrojar advertencias sobre cualquier variable no inicializada (aunque sé que esto no es lo que está buscando).

¿Cuánto necesita esto? Si tiene una muy buena razón, supongo que no puede ser tan difícil copiar el código -finit-local-zero en su versión de GCC ...

+0

Sin embargo, está un poco localizado en el front-end de FORTRAN: http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html ... buen descubrimiento, pero me temo que no lo haría ayuda con el código basado en C – BRFennPocock

+2

Esto no es una gran necesidad en este momento. La idea era que si activamos dicha opción para xlc (con esta base de código de 3+ millones de líneas), y luego migramos a gcc más tarde, el código podría depender de una inicialización definitiva, lo que no ocurriría sin una opción correspondiente en gcc . Idealmente, la solución a largo plazo es usar '-Win -italized' con' -Werror' (xlc también tiene opciones equivalentes). –

Cuestiones relacionadas