Discussion:Conseils de codage en C/Recherche des erreurs

Dernier commentaire : il y a 16 ans par Thierry46 dans le sujet suggestion de méthode

suggestion de méthode

modifier

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)Répondre

Détection erreur affectation / comparaison

modifier

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

Par gcc

modifier

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

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)Répondre

Revenir à la page « Conseils de codage en C/Recherche des erreurs ».