2010-11-18 39 views
5

Supposons que nous ayons le code suivant:Forcer GCC 4.x à traiter le type -Wreturn comme une erreur sans activer -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; 
} 

Et supposons qu'il devait être compilé le compilateur C++ (et non le compilateur C) de la version GCC 4.2.1 avec les options -Wreturn-type -Werror=return-type. Si le code ci-dessus est compilé comme est sans décommentant la ligne //#define USE_CXX_CLASS ci-dessus, vous verrez un avertissement mais aucune erreur:

.../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 

Mais si la ligne //#define USE_CXX_CLASS est décommentée, l'avertissement est TRAITÉS comme une erreur:

.../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 

Oui, l'un est une fonction non-membre (cas n ° 2), et l'autre est une fonction C++ (cas n ° 1). OMI, cela ne devrait pas importer. Je veux les deux conditions traitées comme une erreur, et je ne veux pas ajouter -Werror ou -Wall à ce moment (probablement le fera plus tard, mais c'est hors de portée de cette question).

Mes sous-questions sont les suivantes:

  1. Est-il un commutateur de GCC que je manque qui devrait fonctionner? (Non, je ne veux pas utiliser #pragma.)
  2. Est-ce un bug qui a été corrigé dans une version plus récente de GCC?

Pour référence, j'ai déjà versé par d'autres questions similaires déjà, notamment les suivantes:

+0

Question très écrite. – GManNickG

+0

avez-vous trouvé une solution à ce @bgoodr –

+0

Pas encore. Il se peut que ce soit un bogue corrigé dans les versions plus récentes du compilateur, mais comme je n'ai pas l'option de mettre à jour le compilateur à ce moment-là, je vais juste attendre jusqu'à ce que nous le fassions. – bgoodr

Répondre

0

Il me semble que ce vous avez besoin d'un script shell autour de gcc.

  • Nommez-le comme gcc-wrapper et g++-wrapper.
  • Dans votre Makefile, définissez CC et CXX sur les wrappers.
  • Demandez à l'encapsuleur d'appeler GCC et de diriger sa sortie vers un autre programme qui recherchera les chaînes d'avertissement souhaitées.
  • Quittez le programme de recherche avec une erreur lorsqu'il détecte l'avertissement.
+0

Merci Zan. En fait, ce que je cherchais surtout, c'est une réponse à la sous-question 1.Je ne veux pas me lancer dans le travail de contourner les emballages pour contourner ce que je crois que le CCG lui-même devrait soutenir. Je commence à conclure qu'il s'agit d'un bug (ou d'une fonctionnalité manquante) dans GCC lui-même. – bgoodr

1

Je vois une erreur même sans l'indicateur USE_CXX_CLASS. c'est-à-dire g ++ est cohérent avec l'erreur pour les fonctions membres de classe et les fonctions non membres. g ++ (GCC) 4.4.3 20100127 (Red Hat 4.4.3-4)