Discussion:Conseils de codage en C/Recherche des erreurs
suggestion de méthode
modifierUne 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
modifierCette erreur est fréquente mais peut-être détectée à coup sûr :
Par gcc
modifierLe 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
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 !