Bug Check List

Transcription

Bug Check List
C Bug Check List
Symptômes
AVANT TOUT
Règles de
base :
Préprocesseur
Compilation
Le bug est toujours là
Beaucoup d’erreurs
signalées par le
compilateur
Aucune erreur signalée
mais
exécution incorrecte
Je ne trouve pas l’erreur
dans la ligne signalée
Pas d’erreur dans la ligne
signalée
Erreur avant « token ‘=’ »
Edition de
liens
Comment l’éviter
Mes modifications ne
changent rien
Se concentrer sur la
PREMIERE erreur, puis
recompiler
J’édite le mauvais fichier
source
Une seule vraie erreur peut
induire une cascade
d’erreurs secondaires
Ouvrir une seule fois le
fichier dans l’éditeur
Ajouter l’option de
compilation -Wall
Un warning est une erreur
qui s’ignore
Ne pas ignorer les warning
Lire la ligne caractère
par caractère
Chercher dans lignes
précédentes, y compris
dans les fichiers inclus
Chercher dans les .h
Faute de frappe
Options de l’éditeur :
Couleur, taille, etc..
Oubli de ; ou de parenthèse,
ou d’accolade,...
#define avec ‘=’
INDENTATION
automatique
Syntaxe des directives
Erreur sur type bool
Compilation fichier C++
Fichiers en-tête C vs C++
Vérifier le module associé à
chaque fichier .h
Undefined symbol
Edition de liens
Le fichier .h d’un module C
(resp. C++) doit (resp. ne doit
pas) être dans extern “ C “
Faute de frappe d’un
nom:variable,fonction
Oubli, inversion ou
corruption de .o ? lib ?
Si on inclut le .c au lieu du .h
Pour toutes les causes
Organiser son travail
Faire une « check list »
Pour toutes les causes
Ne pas oublier le \n dans les
printf( ) de test
Mauvais code printf
Oubli d’un fichier .h
copier-coller
Mauvaise expression
Pb Mémoire, div. par 0
Mauvais accès mémoire :
pointeur ou débordement de
tableau
Allocation dynamique
Cascade d’appels
Analyse incomplète
Expressions logiques?
= au lieu de = =
= ! au lieu de !=
Mauvaise projection
[min, max] en x, y ?
Noir sur fond noir ?
Swapbuffer ?
Gestion fenêtre active
Tableau[sizeof(GLUI_String)]
pour edittext
Vérifier les printf ( )
Vérifier les #include
Empêcher les div par 0
Connaitre le langage C
Cf ci-dessous
Initialiser et tester les
pointeurs avant usage
Tester les bornes des
indices de tableaux
Faire un dessin...
Phase d’analyse
Eviter les expressions
logiques complexes
Faire des if imbriqués
Undefined reference
Je ne sais pas où est le
bug
le bug continue à se
manifester
Le résultat affiché
est il correct ?
Exécution
Cause(s)
Incohérence entre fichiers
en-têtes, déclarations,
définitions, appels
pas un type de base
redefinition
Règles de
base :
Détection de la
cause
Vérifier les fichiers entêtes, déclarations,
définitions, appels
Juste après un type
défini par l’utilisateur
Compilateur C99
Erreur sur appel de
fonction
Erreur avant *
C99 vs C++
mise à jour : 26 mai 2009, Ronan Boulic
Edition de liens
Utiliser ddd (trace)
Commenter le code
jusqu’à disparition du
bug + Jeu de tests
Faire une seule
modification du code à la
fois : recompiler et
refaire les même tests
(Redirection des entrées
et des sorties) sur jeu de
tests, comparer les
sorties avec l’éditeur
Segmentation fault
Core dumped
Jeux de tests
ddd :trace, breakpoint..
Commenter le code pour
localiser le bug
Fonctionnement incorrect
Jeu de tests couvrant
toutes les familles de
cas possibles
Dessin incorrect ou
invisible
Jeu de test
Interface GLUI
Tester les callbacks avec
des printf ( )
pas un type de base
Le prototype des fonctions
doit être décidé au début
puis doit rester stable
Oubli du typedef du type
utilisateur
#include <stdbool.h>
Code lisible
Fichier Makefile complet
Vérifier l’ordre des fichiers
.o et libs
Code lisible
Cf thème OPEN-GL
Cf manuel GLUI
main_window correct ?
Verbaliser : décrire oralement les symptômes du problème à quelqu’un d’autre, même si cette personne ne connaît
pas le problème ou le langage utilisé. Formuler des hypothèses avec des phrases du genre : « c’est comme si... ».
Aussi très
utile
Faire un dessin : pour tous les cas de segmentation fault impliquant des pointeurs
Y réfléchir à deux fois : après tout peut être que l’exécution observée correspond à ce qui était demandé ; il est
important de bien connaitre ses scénarios de tests
Un regard neuf : demander à quelqu’un d’autre de regarder le code ; après 10 minutes sur un morceau de code, on
devient facilement aveugle à ses propres fautes de frappes.
Noter les cas de bugs difficiles dans un carnet (symptômes, cause) : et les relire de temps en temps
Faire une pause : manger, dormir, prendre une douche, faire un tour, etc...