164 votes

Quels sont les drapeaux GCC utiles pour le C ?

Au-delà du cadre -Wall et en fixant -std=XXX Quels sont les autres indicateurs de compilation vraiment utiles, mais moins connus, à utiliser en C ?

Je suis particulièrement intéressé par tout avertissement supplémentaire, et/ou par la transformation des avertissements en erreurs dans certains cas, afin de minimiser absolument toute incompatibilité accidentelle de type.

11 votes

Bien -save-temps , -Wshadow y -fmudflap ont été les plus grandes découvertes que je ne connaissais pas, merci à tous.

0 votes

Contexte, d'après ce que je peux dire : courir gcc -c [flags-go-here] -o myprog.o myprog.c pour compiler (et non lier) un programme C.

145voto

Alok Singhal Points 33073

Voici la mienne:

  • -Wextra, -Wall: c'est essentiel.
  • -Wfloat-equal: utile car en général, les tests de nombres à virgule flottante pour l'égalité est mauvais.
  • -Wundef: avertir si un identificateur non initialisée est évalué dans un #if directive.
  • -Wshadow: avertir à chaque fois qu'une variable locale ombres d'une autre variable locale, d'un paramètre ou d'une variable globale ou chaque fois qu'une fonction intégrée est dans l'ombre.
  • -Wpointer-arith: avertir si quelque chose dépend de la taille d'une fonction ou d' void.
  • -Wcast-align: avertir à chaque fois qu'un pointeur est jeté tels que l'alignement de la cible est augmentée. Par exemple, avertir si un char * est jeté à l' int * sur les machines où les entiers ne peut être consulté à deux ou à quatre les limites d'octets.
  • -Wstrict-prototypes: avertir si une fonction est déclarée ou définie, sans préciser les types d'argument.
  • -Wstrict-overflow=5: alerte sur les cas où le compilateur optimise basée sur l'hypothèse que signé dépassement ne se produit pas. (La valeur 5 est peut-être trop stricte, voir la page de manuel.)
  • -Wwrite-strings: donner des constantes de chaîne du type const char[durée] , de sorte que la copie de l'adresse de l'un dans une situation de non-const char * pointeur recevrez un avertissement.
  • -Waggregate-return: avertir si des fonctions qui retournent des structures ou des syndicats sont définis ou appelé.
  • -Wcast-qual: avertir à chaque fois qu'un pointeur est jeté pour supprimer un type de qualificatif à partir du type de cible*.
  • -Wswitch-default: avertir à chaque fois qu'un switch d'instruction n'ont pas d' default des cas*.
  • -Wswitch-enum: avertir à chaque fois qu'un switch déclaration a un index de type énuméré et manque un case pour un ou plusieurs des codes de cette énumération*.
  • -Wconversion: prévenir pour les conversions implicites qui peuvent modifier une valeur*.
  • -Wunreachable-code: avertir si le compilateur détecte que le code ne sera jamais exécutée*.

Ceux marqués * parfois donner trop de fausses mises en garde, donc je les utilise en fonction des besoins.

14 votes

Liste assez complète, je veux juste en ajouter une autre ; -Wformat=2 : Vérifications de format supplémentaires sur les fonctions printf/scanf.

1 votes

Tout cela n'est-il pas sous-entendu par -Wall ?

2 votes

@chacham15, non, je ne pense pas. gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

67voto

caf Points 114951

Plusieurs des -f Les options de génération de code sont intéressantes :

  • -fverbose-asm est utile si vous compilez avec -S pour examiner la sortie de l'assemblage - cela ajoute quelques commentaires informatifs.

  • -finstrument-functions ajoute du code pour appeler les fonctions de profilage fournies par l'utilisateur à chaque point d'entrée et de sortie des fonctions.

  • --coverage instrumente les branches et les appels du programme et crée un fichier de notes de couverture, de sorte que, lors de l'exécution du programme, des données de couverture soient produites et puissent être formatées par le logiciel gcov pour faciliter l'analyse de la couverture des tests.

  • -fsanitize={address,thread,undefined} active respectivement les désinfectants de code AddressSanitizer, ThreadSanitizer et UndefinedBehaviorSanitizer. Ceux-ci permettent au programme de vérifier la présence de diverses sortes d'erreurs au moment de l'exécution.

Précédemment, cette réponse mentionnait également -ftrapv mais cette fonctionnalité a été remplacée par -fsanitize=signed-integer-overflow qui est l'un des assainisseurs activés par -fsanitize=undefined .

0 votes

Pouvez-vous vérifier le commentaire ci-dessus ?

1 votes

-ftrapv a été essentiellement remplacé par -fsanitize=signed-integer-overflow.

54voto

Gilles Points 37537

Utilisez toujours -O ou plus ( -O1 , -O2 , -Os etc.). Au niveau d'optimisation par défaut, gcc privilégie la vitesse de compilation et ne fait pas assez d'analyse pour avertir sur des choses comme les variables unitialisées.

Envisagez de faire -Werror car les avertissements qui n'arrêtent pas la compilation ont tendance à être ignorés.

-Wall permet d'activer les avertissements qui sont très probablement des erreurs.

Avertissements inclus dans -Wextra ont tendance à signaler un code commun et légitime. Ils peuvent être utiles pour les revues de code (bien que les programmes de type lint trouvent beaucoup plus de pièges et soient plus flexibles), mais je ne les activerais pas pour un développement normal.

-Wfloat-equal est une bonne idée si les développeurs du projet ne sont pas familiers avec la virgule flottante, et une mauvaise idée s'ils le sont.

-Winit-self est utile ; je me demande pourquoi elle n'est pas incluse dans le programme -Wuninitialized .

-Wpointer-arith est utile si vous avez du code principalement portable qui ne fonctionne pas avec -pedantic .

40voto

catphive Points 1645
-save-temps

Cela laisse les résultats du préprocesseur et de l'assemblage.

Le source prétraité est utile pour le débogage des macros.

L'assemblage est utile pour déterminer quelles optimisations ont été mises en œuvre. Par exemple, vous pouvez vérifier que GCC optimise les appels de queue sur certaines fonctions récursives, car sans cela vous pouvez potentiellement déborder la pile.

0 votes

Je me suis demandé comment tu as fait pour qu'il fasse ça... J'ai toujours demandé à gcc de vider l'assemblage si j'en avais besoin.

35voto

Nordic Mainframe Points 13717

-fmudflap -- ajoute des vérifications d'exécution à toutes les opérations risquées sur les pointeurs pour attraper l'UB. Ceci immunise efficacement votre programme contre les débordements de tampon et aide à attraper toutes sortes de pointeurs qui pendent.

Voici une démo :

$ cat mf.c 
int main()
{
 int a[10];
 a[10]=1; // <-- o noes, line 4
}

$ gcc -fmudflap mf.c -lmudflap
$ ./a.out 
*******
mudflap violation 1 (check/write): time=1280862302.170759 ptr=0x7fff96eb3d00 size=44
pc=0x7f3a575503c1 location=`mf.c:4:2 (main)'
      /usr/lib/libmudflap.so.0(__mf_check+0x41) [0x7f3a575503c1]
      ./a.out(main+0x90) [0x400a54]
      /lib/libc.so.6(__libc_start_main+0xfd) [0x7f3a571e2c4d]
Nearby object 1: checked region begins 0B into and ends 4B after
mudflap object 0xf9c560: name=`mf.c:3:6 (main) a'
bounds=[0x7fff96eb3d00,0x7fff96eb3d27] size=40 area=stack check=0r/3w liveness=3
alloc time=1280862302.170749 pc=0x7f3a57550cb1
number of nearby objects: 1

0 votes

Hmmm, la bavette semble assez méchante :P

9 votes

-fmudflap n'est plus supporté depuis GCC 4.9, vous obtenez warning: switch '-fmudflap' is no longer supported . Il a été remplacé par AddressSanitizer.

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