web-dev-qa-db-fra.com

Supprimer sélectivement le message d'avertissement GCC

Ce morceau de code:

Int32 status;
printf("status : %x", status)

me donne l'avertissement suivant:

jpegthread.c:157: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'Int32'

Je sais que je peux m'en débarrasser en transtypant le type, mais est-il possible avec un indicateur de compilateur GCC de se débarrasser de ce type particulier d'avertissement et d'utiliser toujours -Wall?

35
shodanex

Si vous avez besoin de ce code pour travailler portable, vous devez convertir l'argument en entier non signé , car le type int peut avoir une taille différente de Int32 sur certaines plates-formes .

Pour répondre à votre question sur la désactivation d'avertissements spécifiques dans gcc, vous pouvez activer des avertissements spécifiques dans gcc avec - Wxxxx et les désactiver avec - Wno-xxxx .

Depuis Options d'avertissement GCC :

Vous pouvez demander de nombreux avertissements spécifiques avec des options commençant par -W, par exemple -Wimplicit pour demander des avertissements sur les déclarations implicites. Chacune de ces options d'avertissement spécifiques a également une forme négative commençant par -Wno- pour désactiver les avertissements; par exemple, -Wno-implicit. Ce manuel ne répertorie qu'un seul des deux formulaires, celui qui n'est pas celui par défaut.

Pour votre cas, l'avertissement en question est -Wformat

-Wformat
Vérifiez les appels à printf et scanf, etc., pour vous assurer que les arguments fournis ont des types appropriés à la chaîne de format spécifiée et que les conversions spécifiées dans la chaîne de format ont un sens. Cela inclut les fonctions standard et d'autres spécifiées par des attributs de format (voir Attributs de fonction), dans les familles printf, scanf, strftime et strfmon (une extension X/Open, pas dans la norme C) (ou d'autres familles spécifiques à la cible). Les fonctions qui sont vérifiées sans que les attributs de format aient été spécifiés dépendent de la version standard sélectionnée, et ces vérifications des fonctions sans l'attribut spécifié sont désactivées par -ffreestanding ou -fno-builtin.

Les formats sont vérifiés par rapport aux fonctionnalités de format prises en charge par GNU libc version 2.2. Celles-ci incluent toutes les fonctionnalités ISO C90 et C99, ainsi que les fonctionnalités de la spécification Unix unique et certains BSD et GNU. D'autres implémentations de bibliothèques peuvent ne pas prendre en charge toutes ces fonctionnalités; GCC ne prend pas en charge les avertissements concernant les fonctionnalités qui vont au-delà des limites d'une bibliothèque particulière. Cependant, si -pedantic est utilisé avec -Wformat, des avertissements seront donnés sur les fonctionnalités de format qui ne sont pas dans la version standard sélectionnée (mais pas pour les formats strfmon, car elles ne sont dans aucune version de la norme C). Voir Options contrôlant le dialecte C.

74
lothar

Il semble que le manuel GCC fournisse un moyen de le faire avec un #pragma, en fait. (contrairement à ce que dit Aiden Bell dans une autre réponse ici)

http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

par exemple. pour l'avertissement -Wuninitialized, vous pouvez faire ...

#pragma GCC diagnostic ignored "-Wuninitialized"

... pour supprimer l'avertissement, ou ...

#pragma GCC diagnostic warning "-Wuninitialized"

... pour le traiter comme un avertissement (pas une erreur) même si vous construisez avec -Werror.

29
dholbert

J'ai utilisé les CFLAGS suivants:

-Wall -Wformat=0
10
shodanex

Je suppose que vous cherchez le

#ifdef WIN32
#pragma warning (disable: #num of the warning) 
#endif

Équivalent dans GCC ....

Vous pouvez rechercher des options telles que - Wno-conversion -Wno-format-security qui font le travail ici

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

Mais en termes de directive #pragma:

Je cite la liste de diffusion GCC de Google :

GCC ne fournit pas actuellement la fonctionnalité #pragma que vous recherchez.

Ne perds pas espoir! Il existe des alternatives viables.

La première meilleure façon de corriger le code afin qu'il n'émette plus d'avertissement. Hélas, vous avez déclaré que vous ne pouviez pas faire cela. :

REMARQUE: les avertissements doivent être aussi verbeux que votre équipe peut le tolérer! [voir ci-dessous]

La deuxième meilleure façon d'ignorer l'avertissement indésirable est de post-traiter la sortie de GCC dans un script (tel qu'un script Perl) qui supprime l'avertissement spécifique précis que vous souhaitez ignorer.

La prochaine façon d'ignorer l'avertissement indésirable est de désactiver l'avertissement pour cette unité de traduction. -Wno-foozle-mcgoogle, juste pour cette unité de traduction particulière. C'est un gros marteau puissant, cependant. Et si l'avertissement se trouve dans un fichier d'en-tête, il peut être omniprésent dans l'ensemble de votre projet - vers lequel je vous dirigerais vers la solution de script de post-traitement (en supposant que vous n'êtes pas autorisé à corriger le code).

Donc actuellement non, il n'y a pas de directive #pragma pour désactiver des avertissements spécifiques. Plutôt que d'utiliser -Wall, vous pouvez activer autant d'avertissements que possible, en plus de ceux spécifiques.

--- (http://www.network-theory.co.uk/docs/gccintro/gccintro_31.html

ou corrigez le code

1
Aiden Bell