Drapeaux pour activer les Avertissements complets et verbeux g++

souvent en C sous gcc , je vais commencer par l'ensemble suivant de drapeaux d'avertissement (douloureusement assemblé à partir de plusieurs sources):

-Wall -Wextra -Wformat-nonliteral -Wcast-align -Wpointer-arith -Wbad-function-cast 
-Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Winline -Wundef 
-Wnested-externs -Wcast-qual -Wshadow -Wwrite-strings -Wno-unused-parameter 
-Wfloat-equal -pedantic -ansi

je construirai (au moins mes versions de débogage) avec cet ensemble d'avertissements et je corrigerai tout ce que je peux éventuellement (généralement tout), et ensuite je ne supprimerai les drapeaux que s'ils ne sont pas pertinents ou non réparables (presque jamais le cas). Parfois, j'ajouterai aussi -Werror si je dois m'écarter pendant la compilation.

je suis en C++ (oui, j'ai 15 ans de retard), et j'aimerais commencer du bon pied.

ma question Est la suivante: quelqu'un a-t-il un ensemble précompilé similaire de drapeaux d'avertissement complets pour C++ sous g++ ? (Je sais que beaucoup d'entre eux sera le même.)

94
demandé sur THelper 2011-02-23 11:20:06

4 réponses

je suis allé à travers et j'ai trouvé l'ensemble minimal d'inclusions qui devrait obtenir le niveau maximum d'avertissement. J'ai ensuite retiré de cette liste l'ensemble des avertissements qui, selon moi, n'indiquent pas réellement que quelque chose de mal se passe, ou bien ont trop de faux positifs pour être utilisés dans une construction réelle. J'ai expliqué pourquoi ceux que j'ai exclus étaient exclus. Voici ma dernière série d'Avertissements suggérés:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror -Wno-unused

Avertissements douteux qui sont présents:

  • je comprend -Wno-unused parce que j'ai souvent des variables que je sais que je utiliserez plus tard, mais n'ont pas encore la fonctionnalité écrite. Supprimer les Avertissements à ce sujet me permet d'écrire dans mon style préféré de reporter occasionnellement la mise en œuvre des choses. Il est utile pour éteindre ça de temps en temps pour s'assurer que rien n'a glissé à travers les fissures.

  • -Wdisabled-optimization semble comme une forte préférence de l'utilisateur paramètre. Je viens d'ajouter celui-ci à ma construction (seulement pour les constructions optimisées pour des raisons évidentes) et il n'a rien trouvé vers le haut, semblent être particulièrement bavard avertissement, au moins pour la façon dont je code. Je l'inclus (même si le code qui déclenche cet avertissement n'est pas nécessairement faux) parce que je crois à travailler avec mes outils à la place des contre eux. Si gcc me dit qu'il ne peut pas optimiser code pour la façon dont je l'ai écrit, alors je devrais regarder la réécrire. Je soupçonne ce code qui déclenche cet avertissement pourrait bénéficier de plus modulaire, peu importe, donc bien que le code n'est pas techniquement erroné (probablement), stylistiquement il est probable.

  • -Wfloat-equal avertit pour des comparaisons d'égalité sûres (en particulier, comparaison avec une valeur non calculée de -1). Un exemple dans mon code où j'utilise c'est que j'ai un vecteur de flotter. Je vais par le biais de ce vectoriel, et il y a certains éléments que je ne peux pas encore évaluer ce qu'ils devrait être, donc je les ai mis à -1.0 f (depuis mon problème ne utilise les nombres positifs, -1 est hors du domaine). Plus tard, je passe et mise à jour de -1.0 f valeurs. Il n'est pas facile de se prêter à un autre méthode de fonctionnement. Je soupçonne que la plupart des gens n'ont pas cette problème, et la comparaison exacte du nombre en virgule flottante est probablement une erreur, donc je l'inclus dans la liste par défaut.

  • -Wold-style-cast a beaucoup de faux positifs dans le code de la bibliothèque que j'utilise. En particulier, la famille de fonctions htonl utilisées dans la mise en réseau, ainsi que L'implémentation de cryptage Rijndael (AES) que j'utilise ont des casts anciens dont il me met en garde. J'ai l'intention de les remplacer tous les deux, mais je ne suis pas sûr qu'il y ait quoi que ce soit d'autre dans mon code dont il se plaindra. La plupart des utilisateurs devraient avoir ceci par défaut, cependant.

  • -Wsign-conversion était un dur (et n'a presque pas fait le liste.) L'allumer dans mon code a généré une énorme quantité d'Avertissements (+De 100). Presque tous d'entre eux étaient innocents. Cependant, j'ai été attention à utiliser des entiers signés partout où je n'étais pas sûr, bien que pour mon domaine de problème particulier, je serais habituellement obtenir une légère efficacité augmenter en utilisant des valeurs non signées en raison de la grande quantité d'entier la division I, si. J'ai sacrifié cette efficacité parce que j'étais inquiet accidentellement la promotion d'un entier signé un unsigned puis division (ce qui n'est pas sûr, contrairement à l'addition, la soustraction, et multiplication.) Allumer cet avertissement m'a permis de changer en toute sécurité la plupart de mes variables aux types non signés et ajouter quelques casts dans certains d'autres lieux. Il est actuellement un peu difficile à utiliser parce que l'avertissement n'est-ce pas intelligent. Par exemple , si vous faites unsigned short + (integral constant expression) , ce résultat est implicitement promu à int. Il puis avertit d'un problème de signe potentiel si vous assignez cette valeur à unsigned ou unsigned short , même si c'est sans danger. C'est certainement la meilleure option avertissement pour presque tous les utilisateurs.

  • -Wsign-promo : voir -Wsign-conversion .

  • -Wswitch-default semble inutile (vous ne voulez pas toujours un défaut cas si vous avez énuméré toutes les possibilités explicitement). Cependant, allumer cet avertissement peut renforcer quelque chose qui est probablement un bon idée. Pour les cas où vous explicitement vouloir ignorer tout sauf les possibilités énumérées (mais d'autres nombres sont possibles), puis mettre dans default: break; pour le rendre explicite. Si vous énumérez explicitement toutes les possibilités, puis allumer cet avertissement aidera à assurer que vous mettez quelque chose comme assert (false) pour s'assurer que vous avez effectivement couvert toutes les options possibles. Il vous permet d'être explicite dans Quel est le domaine de votre problème et le renforce de façon programmatique. Toutefois, vous devrez être prudent en seulement coller assert (false) partout. C'est mieux que de ne rien faire avec le cas par défaut, mais comme d'habitude avec assert, il ne fonctionnera pas dans les constructions de version. Dans d'autres mots, vous ne pouvez pas compter sur elle pour valider les numéros que vous obtenez à partir de, dire, d'une connexion réseau ou une base de données que vous n'avez pas absolue le contrôle. Les Exceptions ou le retour précoce sont la meilleure façon de gérer cela (mais exigent toujours que vous avez un cas par défaut!).

  • -Werror est un important pour moi. Lors de la compilation de grandes quantités de code dans une construction multi-threaded avec plusieurs cibles, il est facile pour un avertissement à glisser. Tournant les avertissements en erreurs assure que je de l'avis.

il y a une série d'avertissements qui ne sont pas inclus dans la liste ci-dessus parce que je ne les ai pas trouvés utiles. Ce sont les avertissements et mes commentaires sur la raison pour laquelle je ne les Inclus pas dans la liste par défaut:

Avertissements absents:

  • -Wabi n'est pas nécessaire parce que je ne suis pas combinant des binaires de différents compilateurs. J'ai essayé de compiler avec de toute façon, et ça n'a pas déclenché, donc ça n'a pas l'air inutilement verbeux.

  • -Waggregate-return n'est pas quelque chose que je considère comme une erreur. Pour exemple, il se déclenche lors de l'utilisation d'une boucle de portée basée sur un vecteur de classes. Valeur de retour d'optimisation doit prendre soin de tout les effets négatifs de cette.

  • -Wconversion déclencheurs sur ce code: short n = 0; n += 2; le conversion implicite en int provoque un avertissement quand il est alors converti de retour à son type de cible.

  • -Weffc++ comprend un avertissement si tous les membres de données ne sont pas initialisées dans la liste d'initialiseur. Je ne le fais pas intentionnellement dans beaucoup cas, de sorte que l'ensemble de les avertissements sont trop encombrés pour être utiles. C'est utile pour allumer de temps en temps et rechercher d'autres avertissements, bien que (tels que les destructeurs Non-virtuels des classes de base). Ce serait être plus utile comme un ensemble d'avertissements (comme -Wall ) au lieu de un seul avertissement sur ses propres.

  • -Winline est absent parce que je n'utilise pas le mot-clé inline pour buts d'optimisation, juste pour définir les fonctions en ligne dans les en-têtes. Je ne se soucient pas si l'optimiseur l'accélère. Cet avertissement également se plaint si elle ne peut pas inline une fonction déclarée dans un corps de classe (comme un destructeur virtuel vide).

  • -Winvalid-pch est manquant parce que je n'utilise pas de headers précompilés.

  • -Wmissing-format-attribute n'est pas utilisé parce que je n'utilise pas gnu extension. Idem pour -Wsuggest-attribute et plusieurs autres

  • Potentiellement notable pour son absence est -Wno-long-long , que j'ai aucun besoin de. Je compilerai avec -std=c++0x ( -std=c++11 dans GCC 4.7), qui inclut les types entiers long long . Ceux qui sont bloqués sur C++98 / C++03 peut envisager d'ajouter cette exclusion de la liste d'avertissement.

  • -Wnormalized=nfc est déjà l'option par défaut, et semble être le meilleur.

  • -Wpadded est activé parfois pour optimiser la mise en page de classes, mais il n'est pas en reste, car pas toutes les classes ont assez les éléments à supprimer rembourrage à la fin. En théorie, je pourrais obtenir variables supplémentaires pour "gratuit", mais il n'est pas la peine de l'effort supplémentaire de maintenir cela (si la taille de ma classe change, ce n'est pas facile à enlever ces variables auparavant libres).

  • -Wstack-protector n'est pas utilisé parce que je n'utilise pas -fstack-protector

  • -Wstrict-aliasing=3 est activé par -Wall et est le plus exact, mais il semble que les niveaux 1 et 2 donnent plus d'Avertissements. Dans la théorie un niveau plus bas est un avertissement "plus fort", mais c'est au prix de plus de faux positifs. Mon propre code de test compilé proprement sous les 3 niveau.

  • -Wswitch-enum n'est pas un comportement que je veux. Je ne veux pas gérer chaque instruction de changement explicitement. Il serait utile que la langue avoir un mécanisme pour activer ceci sur les déclarations de commutateur spécifiées (pour s'assurer que les changements futurs à l'enum sont traités partout qu'ils doivent être), mais c'est exagéré pour un "tout ou rien"" paramètre.

  • -Wunsafe-loop-optimizations provoque trop de fausses alertes. Il peut être utile d'appliquer celui-ci périodiquement et de vérifier manuellement résultat. Par exemple, il a généré cet avertissement dans mon code quand je en boucle sur tous les éléments dans un vecteur d'appliquer une ensemble de fonctions pour ils (en utilisant la gamme basée sur la boucle). Il est également en garde pour la constructeur de const tableau de const std::string (où ce n'est pas boucle dans le code de l'utilisateur).

  • -Wzero-as-null-pointer-constant et -Wuseless-cast sont GCC-4.7-seulement les avertissements, que j'ajouterai quand je passerai à GCC 4.7.

j'ai déposé quelques rapports de bogue / demandes d'amélioration chez gcc à la suite de certaines de ces recherches, donc j'espère pouvoir éventuellement ajouter d'autres avertissements de la liste "ne pas inclure" à la liste "inclure". Cette liste inclut tous les Avertissements mentionnés dans ce thread (plus je pense que quelques extra). Bon nombre des avertissements qui ne sont pas mentionnés explicitement dans ce billet sont inclus dans un autre avertissement que je mentionne. Si quelqu'un remarque des avertissements qui sont entièrement exclus de ce message, faites-le moi savoir.

edit: il semble que j'avais manqué plusieurs (j'ai maintenant ajouté dans). Il y a en fait une deuxième page à http://gcc.gnu.org c'est assez bien caché. avertissement Général "options de 15191540920" et C++ options (faites défiler vers le bas pour les avertissements)

108
répondu David Stone 2012-11-25 18:50:02

D'oh, toutes mes recherches originales ont trouvé 99% des messages sur la façon de supprimer Avertissements (assez scarily), mais je viens de courir à travers ce commentaire , qui a ce bel ensemble de drapeaux (certains moins pertinents):

contre-vérifié avec:

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

-g -O -Wall -Weffc++ -pedantic  \
-pedantic-errors -Wextra -Waggregate-return -Wcast-align \
-Wcast-qual -Wconversion \
-Wdisabled-optimization \
-Werror -Wfloat-equal -Wformat=2 \
-Wformat-nonliteral -Wformat-security  \
-Wformat-y2k \
-Wimplicit  -Wimport  -Winit-self  -Winline \
-Winvalid-pch   \
-Wlong-long \
-Wmissing-field-initializers -Wmissing-format-attribute   \
-Wmissing-include-dirs -Wmissing-noreturn \
-Wpacked  -Wpadded -Wpointer-arith \
-Wredundant-decls \
-Wshadow -Wstack-protector \
-Wstrict-aliasing=2 -Wswitch-default \
-Wswitch-enum \
-Wunreachable-code -Wunused \
-Wunused-parameter \
-Wvariadic-macros \
-Wwrite-strings

donc, je pense que c'est un bon début point. Je n'avais pas réalisé que c'était un dupe, mais au moins c'était profondément enfoui. :- )

33
répondu Sdaz MacSkibbons 2017-05-23 11:54:59

certains d'entre eux sont déjà inclus dans -Wall ou -Wextra .

une bonne configuration de base pour C est:

-std=c99 -pedantic -Wall -Wextra -Wwrite-strings -Werror

et pour C++

-ansi -pedantic -Wall -Wextra -Weffc++

(sauter -Werror pour C++ car -Weffc++ a quelques inconvénients)

10
répondu Let_Me_Be 2011-02-23 08:52:30

Essayer

export CFLAGS="`gcc --help=warnings | grep '\-W' | awk '{print  \" \"}' |
sort | uniq` -pedantic -fdiagnostics-show-option -Werror"

c'est un démarrage rapide et sale qui aura certainement besoin de quelques réglages; pour une chose, même si vous appelez le compilateur par le nom approprié pour votre langue (par exemple g++ pour C++), vous obtiendrez des avertissements qui ne s'appliquent pas à cette langue (et le compilateur vomira ses mains et refusera de continuer jusqu'à ce que vous supprimiez l'avertissement).

une autre chose est que j'ai ajouté dans -Werror , parce que si vous n'êtes pas fixant les avertissements, pourquoi vous préoccupez-vous de les allumer? Vous pouvez également prendre des avertissements de la liste. (Par exemple, je n'utilise presque jamais -Waggregate-return avec C++.)

certains avertissements ne feront rien sans d'autres options liées aux performances ( -Wstack-protector ). -fdiagnostics-show-option et le manuel GCC sont vos amis.

par ailleurs, certains avertissements sont mutuellement exclusifs; en particulier, l'utilisation de -Wtraditional et -Wold-style-definition avec -Werror , ne sera pas compiler.

2
répondu Nathan Paul Simons 2018-09-15 22:09:15