2013-10-17 12 views
12

Come posso garantire che ciascun campo delle mie strutture sia inizializzato in GCC quando si utilizzano gli inizializzatori designati? (Sono particolarmente interessato a puntatori a funzione.) (Sto usando C non C++.)Come assicurarsi che le strutture siano completamente inizializzate (per nome) in GCC?

Ecco un esempio:

typedef struct { 
    int a; 
    int b; 
} foo_t; 

typedef struct { 
    void (*Start)(void); 
    void (*Stop)(void); 
} bar_t; 

foo_t fooo = { 
     5 
    }; 

foo_t food = { 
     .b=4 
    }; 

bar_t baro = { 
     NULL 
    }; 

bar_t bard = { 
     .Start = NULL 
    }; 

-Wmissing-field-inizializzatori non aiuta affatto. Funziona solo su GCC (mingw 4.7.3, 4.8.1), e clang funziona solo marginalmente meglio (nessun avviso per cibo e bardo).

Sono sicuro che c'è un motivo per non produrre avvisi per l'inizializzatore designato (anche quando li chiedo esplicitamente) ma li voglio/ne ho bisogno. Non voglio inizializzare le strutture in base all'ordine/posizione perché è più incline agli errori (ad esempio, lo scambio tra Start e Stop non darà nemmeno alcun avvertimento). E né gcc né clang daranno alcun avvertimento sul fatto che non sono riuscito a inizializzare esplicitamente un campo (durante l'inizializzazione per nome). Inoltre non voglio sporcare il mio codice con if (x.y == NULL) linee per molteplici ragioni, una delle quali è che voglio avvisi in fase di compilazione e non errori di runtime.

Almeno stecca mi darà avvertimenti su tutti e 4 i casi, ma purtroppo non è possibile utilizzare stecca tutto il tempo (si soffoca sulla parte del codice (non riesce ad analizzare alcuni C99, estensioni GCC)).

Nota: se sto utilizzando una funzione reale anziché NULL, GCC mostrerà anche un avviso per baro (ma non bardo).

Ho cercato google e stack overflow ma ho trovato solo domande correlate e non ho trovato risposta per questo problema specifico. La migliore corrispondenza che ho trovato è 'Assicurati che tutti gli elementi di una struttura siano inizializzati' Ensure that all elements in a structure are initialized Che chiede più o meno la stessa domanda, ma non ha una risposta soddisfacente.

C'è un modo migliore per affrontare questo che non ho menzionato? (Forse altro strumento di analisi del codice? Preferibilmente qualcosa (gratuito) che può essere integrato in Eclipse o Visual Studio ...)

+0

C'è una risposta alla domanda che hai collegato che suggerisce la stecca. – orlp

risposta

1

I quattro modi in cui è stato mostrato tutti inizializzano il resto della struttura. È inizializzato a 0 (o al tipo equivalente).

5

Se non mi sbaglio, gli standard C specificare che gli altri campi sono inizializzato automaticamente con 0.

Allora, cosa si sta chiedendo - un errore di compilazione quando i campi non vengono inizializzati - sarebbe fuori linea con la (moderno?) Specifiche C.

C99 standard, pagina 127 in: http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

Se ci sono meno inizializzatori in una lista tra graffe racchiuso che ci sono elementi o membri di un aggregato o meno caratteri in una stringa letterale utilizzati per inizializzare una serie di dimensioni note di rispetto agli elementi dell'array, il resto dell'aggregato deve essere inizializzato implicitamente come oggetti con durata di archiviazione statica.

gcc s -Wmissing-field-initializers è documentato ad non avvertono con inizializzatori designati. C'è una richiesta di miglioramento -Wmissing-field-initializers=2 che avviserà anche: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39589

Quindi ti suggerisco di aggiungere il tuo desiderio a quel bug report, o magari anche di fornire una patch. Dalla mia esperienza con il software open source, l'aggiunta di una patch è la migliore.

+0

Grazie, sei assolutamente corretto ma ho intenzionalmente usato la frase "inizializzare esplicitamente". Ho anche detto che non voglio controllare i puntatori di funzione NULL in fase di esecuzione, perché so che i campi mancanti sono inizializzati a 0. (La stessa spiegazione è stata data anche nella ricerca referenziata.) Il fatto che sia legale C99 non significa che non può dare avvertimenti che sto richiedendo. –

+0

Ci deve essere una ragione per cui non è esplicitamente inclusa in '-Wissing-field-initializers', a giudicare dalla documentazione di gcc. –

+0

+1 per il collegamento Bugzilla GCC, è esattamente ciò che desidero ... –

Problemi correlati