214 votes

Comment allumer (littéralement) tous de GCC ' avertissements s ?

Je voudrais activer -- littéralement -- TOUS les avertissements que GCC. (Vous pensez que ça serait facile...)

  • Vous pensez -Wall pourrait faire l'affaire, mais non! Encore besoin d' -Wextra.

  • Vous pensez -Wextra pourrait faire l'affaire, mais non! Pas tous les avertissements énumérés ici (par exemple, -Wshadow) sont activées par cette. Et je n'ai toujours aucune idée si cette liste est exhaustive.

Comment dois-je dire à GCC pour activer (pas si, et, ou, mais!) tous les avertissements qu'il a?

139voto

Jonathan Wakely Points 45593

Vous ne pouvez pas.

Le manuel de GCC 4.4.0 est complète pour cette version, mais il fait une liste de tous les avertissements possibles pour 4.4.0. Ils ne sont pas tous sur la page que vous liez à bien, par exemple, de certaines langues d'options spécifiques sur les pages de C++ options ou Obj-C options. Pour les trouver tous, vous êtes mieux de regarder le Résumé des Options

Tournant sur tout ce qui inclurait -Wdouble-promotion qui est applicable uniquement sur les Processeurs avec un 32-bit single-precision floating-point unit) qui implémente float dans le matériel, mais émule double dans le logiciel. Faire des calculs comme double serait d'utiliser le logiciel d'émulation et d'être plus lente. C'est pour certains Processeurs embarqués, mais complètement hors de propos pour les Processeurs de bureau moderne avec du matériel de soutien pour la version 64 bits à virgule flottante.

Un avertissement qui n'est généralement pas utile, -Wtraditional, qui met en garde à propos de parfaitement bien formé code qui a un sens différent (ou ne fonctionne pas) dans la traditionnelle C, par exemple, "string " "concatenation", ou ISO C des définitions de fonction! Ne vous vous souciez vraiment de la compatibilité avec les 30 ans des compilateurs? Voulez-vous vraiment un avertissement pour la rédaction int inc(int i) { return i+1; } ?

Je pense que -Weffc++ est trop bruyant pour être utile, il est basé sur l'ancienne première édition de Effective C++ et met en garde sur les constructions qui sont parfaitement valide en C++ (et pour lesquelles les lignes directrices changé dans les éditions ultérieures de l'ouvrage.) Je ne veux pas être prévenu que je n'ai pas initialisé une std::string membre dans mon constructeur; il a un constructeur par défaut qui fait exactement ce que je veux, pourquoi devrais-je écrire m_str() ? L' -Weffc++ avertissements qui pourraient être utiles sont trop difficiles pour le compilateur de détecter avec précision (en donnant de faux négatifs), et ceux qui ne sont pas utiles, telles que l'initialisation de tous les membres explicitement, seulement de produire trop de bruit, de donner de faux positifs.

c'est à dire que vous n'avez pas vraiment envie de tous les avertissements, vous pensez juste que vous faites.

Passer par le manuel, lire à leur sujet, de décider laquelle vous souhaiterez peut-être activer, de les essayer. La lecture de votre compilateur manuel est une Bonne ChoseTM de toute façon, en prenant une coupe courte et permettant des mises en garde que vous ne comprenez pas n'est pas une très bonne idée, surtout si c'est pour éviter d'avoir à RTFM.

Quelqu'un qui tourne sur tout ce qui est sans doute le faire parce qu'ils sont désemparés car ou d'un pointu à poil patron a dit "pas de mises en garde."

Certains avertissements sont importants, et certains ne le sont pas. Vous devez être discriminatoires ou vous gâcher votre programme. Considérons, par exemple, -Wdouble-promotion. Si vous travaillez sur un système embarqué, vous voudrez; si vous travaillez sur un système de bureau vous n'avez probablement pas. Et voulez-vous -Wtraditional? J'en doute.

Edit: Voir aussi -Mur, afin de permettre à tous les avertissements qui est fermé comme WONTFIX.

Edit 2: en réponse à DevSolar de la plainte sur les makefiles avoir besoin d'utiliser différents avertissements selon version de compilateur, si -Wall -Wextra n'est pas approprié, il n'est pas difficile à utiliser compilateur spécifique et spécifique à la version CFLAGS:

compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))

16voto

xfix Points 2890

Il est tout simplement impossible de programme avec tous les avertissements activé (sauf si vous allez à les ignorer, mais alors, pourquoi s'embêter?). Par exemple, supposons que vous utilisez la suite ensemble d'indicateurs: -Wstrict-prototypes -Wtraditional.

Même avec deux avertissements activée, le programme suivant puisse se plaindre.

/tmp $ cat main.c 
int main(int argc, char **argv) {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c: In function ‘main':
main.c:1:5: warning: traditional C rejects ISO C style function definitions [-Wtraditional]
 int main(int argc, char **argv) {
     ^

Vous pouvez penser "eh bien, je vais utiliser l'ancien style de prototypes ensuite". Non, cela ne fonctionne pas.

/tmp $ cat main.c 
int main(argc, argv)
    int argc;
    char **argv;
{
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isn't a prototype [-Wstrict-prototypes]
 int main(argc, argv)
     ^

Et non, pas la spécification d'un prototype, est également faux, que le compilateur va également se plaindre.

/tmp $ cat main.c 
int main() {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isn't a prototype [-Wstrict-prototypes]
 int main() {
     ^

Si vous définissez toutes les fonctions à l'intérieur de votre programme, vous ne pouvez pas utiliser tous les drapeaux, parce que le compilateur va se plaindre de tout imaginables définition de la fonction.

Pour C++, cela est possible (la -Wtraditional drapeau n'existe pas), et des programmes très simples peuvent être compilés. Pour permettre à tous les avertissements, à la suite de la liste de mises en garde (probablement quelques mises en garde sont dupliqués, parce que je n'ai pas pris la peine de les avertissements du filtre activé par -Wall).

-Wabi -Wctor-dtor-privacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wstrict-null-sentinel -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wsign-promo -Wextra -Wall -Waddress -Waggregate-return -Warray-bounds -Wno-attributes -Wno-builtin-macro-redefined -Wc++0x-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wconversion -Wcoverage-mismatch -Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wignored-qualifiers -Winit-self -Winline -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wlong-long -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wno-mudflap -Wno-multichar -Wnonnull -Wno-overflow -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wsign-conversion -Wstack-protector -Wstrict-aliasing=1 -Wstrict-overflow=5 -Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand -Wsystem-headers -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wno-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvla -Wvolatile-register-var -Wwrite-strings

3voto

paddy Points 26183

À partir de cette page:

Notez que certains de drapeau d'avertissement ne sont pas implicites par l' -Wall. Certains d'entre eux avertir à propos des constructions que généralement, les utilisateurs ne considèrent pas discutable, mais qui, parfois, vous pourriez vouloir vérifier; d'autres avertir à propos des constructions qui sont nécessaires ou difficiles à éviter dans certains cas, et il n'y a pas de moyen simple de modifier le code pour supprimer l'avertissement. Certains d'entre eux sont activés par -Wextra mais beaucoup d'entre eux doivent être activés individuellement.

Je suppose que la question est de qui? Vous pourriez peut-être grep cette page pour toutes les lignes commençant par W, et d'obtenir une liste complète de drapeaux d'avertissement. Puis comparer avec les listes en vertu de l' -Wall et -Wextra. Il est également -Wpedantic, si vous êtes cherchant de toute évidence à être encore plus pédant encore =)

3voto

Joachim Pileborg Points 121221

Et je n'ai toujours aucune idée si cette liste est exhaustive.

C'est probablement le cas, mais la seule liste qui est 100% complet est la source réelle pour le compilateur. Cependant, GCC est grand! Et je ne sais pas si tous les paramètres de ligne de commande sont rassemblées dans un seul endroit ou l'étaler sur plusieurs fichiers source. Notez également que certaines mises en garde sont pour le pré-processeur, certains pour le compilateur et d'autres pour l'éditeur de liens (qui est un tout autre programme, et a trouvé dans le paquet binutils) donc, très vraisemblablement, ils sont répartis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X