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...