Discussion:Conseils de codage en C/Recherche des erreurs

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche

suggestion de méthode[modifier le wikicode]

Une méthode, je ne sais pas ce que ça vaut. Elle permet d'éviter ce genre d'erreur :

int i;
// Modification de i
if (i = 0) { // Erreur : utilisation de = au lieu de ==
  // instructions
}

Ce problème est difficile à détecter étant donné que la compilation fonctionne et que c'est seulement à l'exécution qu'on peut voir le problème. Un conseil pour remédier à ce problème est de toujours placer le terme constant en opérande de gauche. Ainsi, on aurait écrit :

int i;
// Modification de i
if (0 = i) { // Erreur : utilisation de = au lieu de ==
  // instructions
}

Le compilateur détecte ici l'erreur contrairement à précédemment. Cette technique à un défaut, elle rend la compréhension du programme plus difficile étant donné que l'ordre de lecture est inhabituel. Pour résoudre ce problème, on peut considérer que l'idéal est de développer en inversant les opérandes, puis, une fois qu'on a vérifié que le programme fonctionne, remettre tous les opérandes dans l'ordre "naturel".

Je sais pas si cette technique mérite d'être incluse.

Sub 15 juin 2008 à 12:41 (CEST)

Détection erreur affectation / comparaison[modifier le wikicode]

Cette erreur est fréquente mais peut-être détectée à coup sûr :

Par gcc[modifier le wikicode]

Le compilateur gcc avec l'option -Wall détecte cette erreur :

gcc -c -Wall -pedantic -std=c99 essai.c
essai.c: In function 'main':
essai.c:19: warning: suggest parentheses around assignment used as truth value

Par splint[modifier le wikicode]

essai.c:19:8: Test expression for if is assignment expression: i = 0
 The condition test is an assignment expression. Probably, you mean to use ==
 instead of =. If an assignment is intended, add an extra parentheses nesting
 (e.g., if ((a = b)) ...) to suppress this message. (Use -predassign to
 inhibit warning)
essai.c:19:8: Test expression for if not boolean, type int: i = 0
 Test expression type is not boolean or int. (Use -predboolint to inhibit
 warning)

Il faut donc demander au compilateur d'être intransigeant et en plus d'utiliser un outil de vérification statique lint, prolint, splint. Il ne doit plus rester un seul Warning !

--Thierry46 15 juin 2008 à 20:48 (CEST)