Pour quelqu'un qui travaille avec du code C intégré, l'activation des avertissements du compilateur a permis de mettre en évidence de nombreuses faiblesses et des zones à étudier pour proposer des corrections. Dans gcc, l'utilisation de -Wall
y -Wextra
et même -Wshadow
sont devenus vitaux. Je ne vais pas passer en revue tous les dangers, mais je vais en citer quelques-uns qui sont apparus et qui ont permis de mettre en évidence des problèmes de code.
Variables laissées de côté
Celui-ci peut facilement indiquer un travail inachevé et des zones qui n'utilisent pas toutes les variables passées, ce qui peut être un problème. Examinons une fonction simple qui peut déclencher cela :
int foo(int a, int b)
{
int c = 0;
if (a > 0)
{
return a;
}
return 0;
}
La compilation sans -Wall ou -Wextra ne pose aucun problème. -Wall vous dira cependant que c
n'est jamais utilisé :
foo.c : Dans la fonction 'foo' :
foo.c:9:20 : avertissement : variable 'c' inutilisée [-Wunused-variable]
-Wextra vous dira également que votre paramètre b ne fait rien :
foo.c : Dans la fonction 'foo' :
foo.c:9:20 : avertissement : variable 'c' inutilisée [-Wunused-variable]
foo.c:7:20 : warning : unused parameter 'b' [-Wunused-parameter] int foo(int a, int b)
Ombrage global variable
Celui-ci a mordu fort et n'est pas apparu jusqu'à ce que -Wshadow
a été utilisé. Modifions l'exemple ci-dessus pour ne faire qu'ajouter, mais il se trouve qu'un global porte le même nom qu'un local, ce qui entraîne une grande confusion lorsqu'on essaie d'utiliser les deux.
int c = 7;
int foo(int a, int b)
{
int c = a + b;
return c;
}
Lorsque le paramètre -Wshadow a été activé, il est facile de repérer ce problème.
foo.c:11:9 : avertissement : la déclaration de 'c' fait de l'ombre à une déclaration globale [-Wshadow]
foo.c:1:5 : note : la déclaration shadowée est ici
Chaînes de format
Cela ne nécessite pas de drapeaux supplémentaires dans gcc, mais cela a quand même été la source de problèmes dans le passé. Une simple fonction essayant d'imprimer des données, mais ayant une erreur de formatage pourrait ressembler à ceci :
void foo(const char * str)
{
printf("str = %d\n", str);
}
Cela n'imprime pas la chaîne de caractères puisque le drapeau de formatage est incorrect et gcc vous dira joyeusement que ce n'est probablement pas ce que vous vouliez :
foo.c : Dans la fonction 'foo' :
foo.c:10:12 : warning : format '%d' attend un argument de type un argument de type 'int', mais l'argument 2 est de type 'const char *'. [-Wformat=]
Ce ne sont que trois des nombreuses choses que le compilateur peut vérifier pour vous. Il y en a beaucoup d'autres, comme l'utilisation d'une variable non initialisée, que d'autres ont déjà signalées.