2012-05-10 4 views
17

IBM AIX xlc compilatore offre una bandiera che genera codice per inizializzare stoccaggio variabile locale:C'è un flag gcc per inizializzare l'archiviazione delle variabili locali?

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

penso che il compilatore MSVC fa qualcosa di simile per il build di debug, ma la mia memoria può essere confusa su questo punto.

Esiste un'opzione equivalente per GCC?

+0

'-Wextra' è grande per le nuove basi di codice che non dispongono già di 3 milioni di linee di codice. :) –

+0

Non posso credere che l'inizializzazione sia scritta "initialialize" nei documenti del compilatore. –

+0

@AndrewMarshall: Ha! Non me ne sono nemmeno accorto. È scritto in quel modo, anche se xlc è piuttosto vecchio. L'attuale [guida in linea] (http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Fcompiler%2Fref%2Fruoptini.htm) non ha quell'errore –

risposta

10

OK, La migliore risposta che posso offrire.

http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html dice "no", per omissione. Non c'è documentazione di nulla per iniettare il codice di cancellazione dello stack nell'output.

Da quanto ho potuto intuire, l'unico modo questo potrebbe funzionare, è quello di iniettare codice memset like (forse semplice come pochi mov operazioni, ma comunque) nell'inizio di ogni frame lessicale incorporato in cui un la variabile automatica viene creata. Il più vicino che posso dire - e io sono lontano da da un esperto sulla parte interna di GCC, ma - non sembra esserci nulla documentato che lo farebbe.

In seguito ulteriormente questo, il gccint.pdf PDF di GCC Internals (http://gcc.gnu.org/onlinedocs/gccint.pdf) a pagina 361 definisce che il nome GCC per la fase di chiamata regolazione puntatore riquadro all'ingresso di una funzione è prologue. (Non so davvero/capire se questo si applica ad altri ambiti lessicali all'interno di una funzione, comunque.) Poiché ciò dovrebbe accadere in un file Machine Definition (md), qualsiasi opzione di questo tipo sarebbe sembrare da definire per un Architettura della CPU. Ho analizzato il ViewCVS online al numero http://gcc.gnu.org/viewcvs/trunk/gcc/config/i386/ e ho trovato (almeno una) copia di prologue attorno alla riga 11.893 di i386.md, che dopo aver eseguito l'espansione della ricerca per la funzione qualche luppolo, non sembra avere nulla da emettere un codice condizionale come quello

Ma questa roba sotto-GCC's-cappuccio è un pò ordinata ...

+0

Grazie, sembra il più vicino alla (correntemente) risposta corretta. Ci sono indubbiamente molti dettagli possibili coinvolti in un'implementazione reale, come gli array di lunghezza variabile C99, il riutilizzo dello spazio variabile locale e cose come 'alloca()'. –

0

C99: se un oggetto con durata di memorizzazione automatica non è inizializzato in modo esplicito, il suo valore è indeterminato.

C'è stato un argomento su questa domanda. What happens to a declared, uninitialized variable in C? Does it have a value?.

+5

Capisco che le specifiche del linguaggio non richiedano l'inizializzazione delle variabili con durata di archiviazione automatica. Tuttavia, almeno un compilatore ha un'opzione * * per farlo se lo chiedi. La mia domanda è se GCC ha un'opzione simile. –

3

Non riesco a trovare alcun riferimento definitivo, ma sembra che certe copie di GCC (in particolare il compilatore GCC Fortran) dispongano di un'opzione -finit-local-zero per impostare automaticamente a zero le variabili o gli array locali non esplicitamente inizializzati.

Per quanto riguarda standard di GCC va, l'unica caratteristica su questo argomento che ho potuto trovare è -Wuninitialized di gettare le avvertenze su eventuali variabili non inizializzate (anche se so che questo non è quello che stai cercando).

Quanto male ti serve? Se hai una buona ragione, suppongo che non possa essere così difficile copiare il codice -finit-local-zero nella tua versione di GCC ...

+0

È piuttosto localizzato sul front-end FORTRAN, tuttavia: http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html ... bella scoperta, ma temo che non lo farebbe aiuto con il codice C – BRFennPocock

+2

Questo non è un grande bisogno al momento. L'idea era che se avessimo attivato tale opzione per xlc (con questo oltre 3 milioni di code code base), e successivamente migrato su gcc, il codice potrebbe basarsi su un'inizializzazione definita che non si verificherebbe senza un'opzione corrispondente in gcc . Idealmente, la soluzione a lungo termine è usare '-Wuninitalized' con' -Werror' (xlc ha opzioni equivalenti anche per questo). –