una - variables locales c#
¿Hay un indicador de gcc para inicializar el almacenamiento de variables locales? (3)
El compilador IBM AIX xlc
ofrece un indicador que genera código 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 de MSVC hace algo similar para las construcciones de depuración, pero mi memoria puede estar borrosa en este punto.
¿Hay una opción equivalente para GCC?
C99: Si un objeto que tiene una duración de almacenamiento automático no se inicializa explícitamente, su valor es indeterminado.
Ha habido un tema sobre esta pregunta. ¿Qué le sucede a una variable declarada, sin inicializar en C? ¿Tiene un valor? .
No puedo encontrar ninguna referencia definitiva, pero parece que ciertas copias de GCC (en particular el compilador Fortran de GCC) tienen una -finit-local-zero
para establecer automáticamente cualquier variable o matriz local no explícitamente inicializada en cero.
En lo que respecta a GCC estándar, la única característica sobre este tema que pude encontrar es -Wuninitialized
para lanzar advertencias sobre cualquier variable no inicializada (aunque sé que esto no es lo que está buscando).
¿Qué tanto necesita usted esto? Si tiene una buena razón, supongo que no puede ser tan difícil copiar el -finit-local-zero
en su versión de GCC ...
OK, la mejor respuesta que puedo ofrecer.
http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html dice "no", por omisión. No hay documentación de nada para inyectar código de borrado de pila en la salida.
Por lo que pude suponer, la única forma en que podría funcionar es inyectar un código similar a un memset
(tal vez tan simple como algunas operaciones de mov
, pero no obstante) al comienzo de cada marco léxico incrustado en el que se crea una variable automática. . Tan cerca de lo que puedo decir, y estoy lejos de ser un experto en los aspectos internos de GCC, pero, no parece haber nada documentado que lo haga.
Además de esto, el PDF gccint.pdf de GCC Internals ( http://gcc.gnu.org/onlinedocs/gccint.pdf ) en la página 361 define que el nombre GCC para el paso de ajuste de puntero de marco al ingresar a una función es prologue
(Sin embargo, realmente no sé / comprendo 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 Máquina (md), cualquier opción pareciera tener que estar definida para una arquitectura de CPU . Busqué en su ViewCVS en línea en http://gcc.gnu.org/viewcvs/trunk/gcc/config/i386/ y encontré (al menos una) copia del prologue
alrededor de la línea 11,893 de i386.md, que después de jugar la búsqueda Para la expansión de la función unos cuantos saltos, no parece tener nada para emitir un código condicional como ese.
Pero esta cosa bajo el capó de GCC es un poco limpia ...