Je voudrais activer - littéralement - TOUS les avertissements que GCC a. (On pourrait penser que ce serait facile ...)
On pourrait penser
-Wall
que ça pourrait faire l'affaire, mais non! Encore besoin-Wextra
.On pourrait penser
-Wextra
que ça pourrait faire l'affaire, mais non! Tous les avertissements répertoriés ici (par exemple,-Wshadow
) ne sont pas activés par cela. Et je n'ai toujours aucune idée si cette liste est complète.
Comment puis-je dire à GCC d'activer (pas de si, et de, ou mais!) Tous les avertissements qu'il a?
c++
gcc
warnings
compiler-warnings
gcc-warning
user541686
la source
la source
-Weverything
.Réponses:
Tu ne peux pas.
Le manuel de GCC 4.4.0 n'est complet que pour cette version, mais il répertorie tous les avertissements possibles pour 4.4.0. Cependant, ils ne sont pas tous sur la page vers laquelle vous liez, par exemple, certaines options spécifiques au langage sont sur les pages pour les options C ++ ou les options Obj-C. Pour les trouver tous, il vaut mieux regarder le résumé des options
Activer tout inclurait
-Wdouble-promotion
ce qui n'est pertinent que sur les processeurs avec une unité à virgule flottante simple précision 32 bits qui implémentefloat
dans le matériel, mais émuledouble
dans le logiciel. Faire des calculs commedouble
utiliserait l'émulation logicielle et serait plus lent. Cela est pertinent pour certains processeurs intégrés, mais complètement non pertinent pour les processeurs de bureau modernes avec prise en charge matérielle pour les virgules flottantes 64 bits.Un autre avertissement qui n'est généralement pas utile est celui
-Wtraditional
qui met en garde contre un code parfaitement bien formé qui a une signification différente (ou qui ne fonctionne pas) dans les"string " "concatenation"
définitions de fonctions C traditionnelles, par exemple , ou ISO C! Vous souciez-vous vraiment de la compatibilité avec les compilateurs de 30 ans? Voulez-vous vraiment un avertissement pour écrireint inc(int i) { return i+1; }
?Je pense que
-Weffc++
c'est trop bruyant pour être utile, il est basé sur la première édition obsolète d' Efficace C ++ et met en garde contre les constructions qui sont parfaitement valides C ++ (et pour lesquelles les directives ont changé dans les éditions ultérieures du livre.) Je ne veux pas être a averti que je n'ai pas initialisé destd::string
membre dans mon constructeur; il a un constructeur par défaut qui fait exactement ce que je veux, pourquoi devrais-je écrirem_str()
pour l'appeler? Les-Weffc++
avertissements qui seraient utiles sont trop difficiles à détecter avec précision par le compilateur (donnant de faux négatifs), et ceux qui ne sont pas utiles, tels que l'initialisation explicite de tous les membres, produisent simplement trop de bruit, donnant des faux positifs.Luc Danton a fourni un excellent exemple d'avertissements inutiles
-Waggregate-return
qui n'ont presque certainement aucun sens pour le code C ++.c'est-à-dire que vous ne voulez pas vraiment tous les avertissements, vous pensez juste que vous le voulez.
Parcourez le manuel, lisez-les, décidez ce que vous voudrez peut-être activer, essayez-les. Lire le manuel de votre compilateur est une bonne chose TM de toute façon, en prenant une coupe courte et permettant des avertissements que vous ne comprenez pas est pas une très bonne idée, surtout si elle est d'éviter d' avoir à RTFM.
Quiconque allume tout est probablement en train de le faire parce qu'il n'a aucune idée parce que ou un patron aux cheveux pointus n'a dit "aucun avertissement".
Certains avertissements sont importants, d'autres non. Vous devez être discriminant ou vous gâcher votre programme. Prenons, par exemple,
-Wdouble-promotion
. Si vous travaillez sur un système embarqué, vous voudrez peut-être cela; si vous travaillez sur un système de bureau, vous ne le faites probablement pas. Et tu veux-Wtraditional
? J'en doute.Modifier: Voir aussi -Wall-all pour activer tous les avertissements qui est fermé comme WONTFIX.
Edit 2: en réponse à la plainte de DevSolar sur les makefiles devant utiliser différents avertissements selon la version du compilateur, si cela
-Wall -Wextra
ne convient pas, il n'est pas difficile d'utiliser les CFLAGS spécifiques au compilateur et à la version:la source
-Weverything
est la meilleure solution, je pense, que la stratégie gcc de ne pas donner une telle option. J'utilise ce drapeau avec clang parce que ma philosophie est que je veux que tous les avertissements soient activés par défaut (parce que quelqu'un a pensé qu'il était assez utile pour les ajouter au compilateur), et si je ne l'aime pas, je désactive cet avertissement spécifiquement. Le fait est que vous ne connaissez pas les avertissements qui ne se déclenchent pas, mais vous connaissez les avertissements que vous ne voulez pas que cela se déclenche, et ils sont facilement désactivés.-Weverything
option de Clang , mais est impossible à faire avec GCC.Je suis d'accord avec les réponses précédentes selon lesquelles il n'est probablement pas avantageux d'activer littéralement tous les avertissements, mais GCC fournit un moyen raisonnablement pratique d'y parvenir. La commande
fournit une liste de toutes les options d'avertissement prises en charge avec des informations indiquant si elles sont actives. Cela peut d'ailleurs être utilisé pour savoir quelles options sont (non) activées par exemple
-Wall
et-Wextra
Pour activer tous les avertissements, vous pouvez utiliser des expressions rationnelles pour extraire les paramètres de ligne de commande
Pour mon CCG actuel, cela donne:
Cela peut maintenant être utilisé pour appeler le GCC, c'est-à-dire
Notez cependant que cela entraîne des avertissements car certaines options d'avertissement ne sont disponibles que pour certaines langues (par exemple
C++
). Ceux-ci pourraient être évités en utilisant une expression plus régulière pour n'inclure que les options autorisées pour la langue actuelle ou en ajoutant une option appropriée-Wno-whatever
à la fin de l'appel.la source
-isystem
plutôt que-I
pour les répertoires appropriés.Il est tout simplement impossible de programmer avec tous les avertissements activés (sauf si vous allez les ignorer, mais alors, pourquoi s'embêter?). Par exemple, supposons que vous utilisez suivant ensemble de drapeaux:
-Wstrict-prototypes -Wtraditional
.Même avec deux avertissements activés, le programme suivant se plaindrait.
Vous pensez peut-être "alors je vais utiliser des prototypes à l'ancienne". Non, cela ne fonctionnera pas.
Et non, ne pas spécifier de prototype est également faux, car le compilateur se plaindra également.
Si vous définissez des fonctions dans votre programme, vous ne pouvez pas utiliser tous les indicateurs, car le compilateur se plaindra de toute définition de fonction imaginable.
Pour C ++, c'est possible (l'
-Wtraditional
indicateur n'existe pas), et des programmes très simples peuvent être compilés. Pour activer tous les avertissements, utilisez la liste suivante des avertissements (probablement certains avertissements sont dupliqués, car je n'ai pas pris la peine de filtrer les avertissements activés par-Wall
).la source
int main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
Quelqu'un a créé un ensemble d'outils pour déterminer l' ensemble complet des avertissements pour une version GCC ou Clang donnée.
Pour GCC, la copie de la liste complète des avertissements fournis par cet outil pour la version de votre compilateur semble être le seul moyen de garantir que tous les avertissements sont activés, car (contrairement à Clang) GCC ne fournit pas
-Weverything
.L'outil semble analyser le
c.opt
fichier réel dans le code source de GCC, donc ses résultats devraient être définitifs.Le référentiel contient également des fichiers texte avec les listes d'avertissement générées pour la plupart des versions de GCC et Clang (actuellement Clang 3.2 à 3.7 et GCC 3.4 à 5.3).
https://github.com/barro/compiler-warnings
la source
Gcc 4.3+ a maintenant -Q --help = warnings, vous pouvez même spécifier --help = warnings, C pour simplement imprimer les avertissements liés à C.
Je viens d'écrire un module m4 pour en profiter (prend également en charge -Weverything), voir wget_manywarnings.m4
Comment l'utiliser est assez simple, fondamentalement, le module active chaque indicateur d'avertissement. Et vous supprimez les avertissements si nécessaire - certains sont vraiment très verbeux. Exemple: configure.ac
Si vous n'utilisez pas les outils automatiques, vous trouverez le code pour activer tous les avertissements désactivés dans le module m4, qui est essentiellement l'appel gcc acheminé via awk:
flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'
la source
De cette page :
Je suppose que la question est laquelle ? Vous pouvez peut-être grep cette page pour toutes les lignes commençant par -W, et obtenir une liste complète des drapeaux d'avertissement. Comparez ensuite ceux-ci avec les listes sous
-Wall
et-Wextra
. Il y en a aussi-Wpedantic
, bien que vous souhaitiez évidemment être encore plus pédant =)la source
C'est probablement le cas, mais la seule liste complète à 100% est la source réelle du compilateur. Cependant, GCC est grand ! Et je ne sais pas si tous les paramètres de ligne de commande sont collectés en un seul endroit ou répartis sur plusieurs fichiers source. Notez également que certains avertissements sont destinés au préprocesseur, certains au compilateur réel et d'autres au lieur (qui est un programme complètement séparé, et se trouvant dans le paquet binutils), donc ils sont très probablement répartis.
la source