2010-11-18 9 views
5

Supponiamo di avere il seguente codice:Forzare GCC 4.x per trattare -Wreturn-type come errore senza abilitazione -Werror?

#if !defined(__cplusplus) 
# error This file should be compiled as C++ 
#endif 

#include <stdio.h> 
#include <string> 

//#define USE_CXX_CLASS 
#ifdef USE_CXX_CLASS 
class SomeClass 
{ 
public: 
    SomeClass() {} 
    ~SomeClass() {} 
    std::string GetSomeString() 
    { 
     // case #1 
    } 
}; 
#endif // USE_CXX_CLASS 

int foo() 
{ 
    // case #2 
} 

int 
main (int argc, char *argv[]) 
{ 
    (void)argc; 
    (void)argv; 
#ifdef USE_CXX_CLASS 
    SomeClass someInstance; 
    someInstance.GetSomeString(); 
#endif // USE_CXX_CLASS 
    foo(); 
    return 0; 
} 

E supponiamo che dovesse essere compilato il compilatore C++ (e non il compilatore C) dal GCC versione 4.2.1 con le opzioni -Wreturn-type -Werror=return-type. Se il codice di cui sopra è compilato come è senza prima commentando la linea di //#define USE_CXX_CLASS sopra, poi si vedrà un avviso ma nessun errore:

.../gcc-4.2.1/bin/g++ -g -fPIC -Wreturn-type -Werror=return-type test.cpp -c -o test.o 
test.cpp: In function 'int foo()': 
test.cpp:26: warning: control reaches end of non-void function 

Ma se la linea //#define USE_CXX_CLASS sia commentata, quindi l'avviso è animali trattati come un errore:

.../gcc-4.2.1/bin/g++ -g -fPIC -Wreturn-type -Werror=return-type test.cpp -c -o test.o 
test.cpp: In member function 'std::string SomeClass::GetSomeString()': 
test.cpp:18: error: no return statement in function returning non-void [-Wreturn-type] 
gmake: *** [test.o] Error 1 

Sì, uno è una funzione non-membro (caso # 2), e l'altro è una funzione C++ (caso # 1). IMO, quello non dovrebbe importare. Voglio entrambe le condizioni trattate come un errore, e non voglio aggiungere -Werror o -Wall a questo punto nel tempo (probabilmente lo farò più tardi, ma è fuori dallo scopo di questa domanda).

miei sotto-domande sono:

  1. C'è qualche interruttore GCC che mi manca che dovrebbe funzionare? (No, non voglio usare #pragma.)
  2. Si tratta di un bug che è stato risolto in una versione più recente di GCC?

Per avere un riferimento, ho già versato attraverso altre domande simili già, tra cui le seguenti:

+0

Domanda molto scritta. – GManNickG

+0

hai trovato una soluzione a questo @bgoodr –

+0

Non ancora. Potrebbe essere il caso che questo è in realtà un bug corretto nelle versioni più recenti del compilatore, ma poiché non ho un'opzione per aggiornare il compilatore a questo punto nel tempo, ho intenzione di aspettare fino a che non lo facciamo. – bgoodr

risposta

0

Mi sembra che ciò che hai bisogno di un wrapper di shell shell su gcc.

  • Nome qualcosa come gcc-wrapper e g++-wrapper.
  • Nel Makefile, impostare CC e CXX sui wrapper.
  • Fare in modo che il wrapper invochi GCC e trasmetta l'output a un altro programma che cercherà le stringhe di avvertimento desiderate.
  • Avviare il programma di ricerca con un errore quando viene rilevato l'avviso.
+0

Grazie Zan. In realtà quello che cercavo principalmente è una risposta alla domanda secondaria n. 1.Non voglio entrare nel business del portare in giro wrapper per incidere ciò che ritengo debba sostenere GCC stesso. Sto iniziando a concludere che si tratta di un bug (o caratteristica mancante) nello stesso GCC. – bgoodr

1

Vedo un errore anche senza il flag USE_CXX_CLASS. vale a dire g ++ è coerente con l'errore per entrambe le funzioni membro della classe e le funzioni non membro. g ++ (GCC) 4.4.3 20100127 (Red Hat 4.4.3-4)

Problemi correlati