2012-01-18 6 views
6

Follow-up to question: g++ does not show a 'unused' warning.Ricerca di oggetti non utilizzati (valori non primitivi)

Capisco perfettamente perché g ++ non avvisa di queste variabili, ma mi piacerebbe in qualche modo trovarle comunque. Il codice su cui sto lavorando non ha nessuno di questi casi speciali, quindi un singolo FloatArray x; è quasi definitivamente lasciato.

Anche se è necessario contrassegnare singole classi (come avviso per oggetti FloatArray non utilizzati), sarebbe molto utile. Cosa posso fare?

+0

È davvero un problema? È difficile immaginarlo, dato che la maggior parte dei compilatori probabilmente inserirà gli oggetti nel nulla e quindi non li userà, giusto? –

+0

Ma i compilatori avvisano su questo quando determinano che la variabile non viene utilizzata "prima dell'ottimizzazione", non dopo. Sarebbe un incubo! – rodrigo

risposta

1

Bene, in pratica si desidera creare una sorta di semplice strumento di analisi statica collegato a GCC? In tal caso, è possibile iniziare a utilizzare MELT per implementare rapidamente una stampante variabile inutilizzata.

http://gcc.gnu.org/wiki/MELT%20tutorial

+0

Grazie, ma non sono sicuro di "rapidamente". Non soddisfo i prerequisiti elencati (nemmeno vicino, si potrebbe dire). Cercherò di vedere se riesco a trovare qualcuno che abbia già fatto questo in MELT. –

-1

Non sono sicuro se mi manca qualcosa nella questione, ma gcc/g ++ dispone di opzioni che consentono di specificare quali avvisi che si desidera e quali no. Così semplicemente abilitato la variabile -Wunused.

Vedi qui per maggiori dettagli: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

Inoltre, -Wall si trasformerà questo e molti avvertimento più utili su.

+2

L'avvertimento non utilizzato variabile funziona solo per le primitive, non classi C++, poiché il costruttore/distruttore potrebbe avere un effetto desiderato. – greg

+1

Ci scusiamo, ma -1 poiché in realtà mi collego alla domanda che spiega esattamente perché questo non funzionerà. –

+0

abbastanza giusto. Un giorno imparerò a leggere. – Liam

3

Bene, con GCC il seguente codice non avvertire come si desidera:

struct Foo 
{ 
}; 
struct Bar 
{ 
    Foo f; 
}; 
int main() 
{ 
    Bar b; //warning: unused variable 'b' 
} 

Ma se si aggiunge un costruttore/distruttore alla Foo o bar struct, anche uno banale, non avvertirà.

struct Foo 
{ 
    Foo() {} 
}; 
struct Bar 
{ 
    Foo f; 
}; 
int main() 
{ 
    Bar b; //no warning! It calls Foo::Foo() into b.f 
} 

Quindi il modo più semplice per riconquistare l'avvertimento è quello di compilare tutti i costruttori e distruttori rilevanti condizionalmente:

struct Foo 
{ 
#ifndef TEST_UNUSED 
    Foo() {} 
#endif 
}; 
struct Bar 
{ 
    Foo f; 
}; 
int main() 
{ 
    Bar b; //warning! 
} 

Ora compilare con g++ -DTEST_UNUSED per verificare la presenza di variabili aggiuntive non utilizzate.

Non è la mia idea più brillante, ma funziona.

+2

Questo potrebbe funzionare per gli oggetti creati dagli utenti, ma non di quelli forniti dal linguaggio (stringa, contenitori STL, ecc). – greg

+0

Probabilmente questo mi permetterà di trovare una quantità significativa di oggetti inutilizzati nel progetto, quindi ti permetterò di avere il bounty. –

Problemi correlati