Prépa C : TP outils du C

De Ensiwiki
Aller à : navigation, rechercher

Laptop.png  Première Année  CDROM.png  Informatique 

Introduction

Les objectifs de cette séance sont de vous fournir les bons réflexes pour déverminer des programmes en C et de les appliquer à l'écriture de programmes simples manipulant des pointeurs.

La mise au point de programmes écrits en C est beaucoup plus complexe que celle de programmes Ada. En Ada, le mécanisme des exceptions permet en général de trouver rapidement la ligne où le programme a échoué, et d'avoir une idée de l'erreur (e.g. raised CONSTRAINT_ERROR : prog.adb:4 range check failed nous dit bien que le programme prog a échoué à la ligne 4 lors d'un accès en dehors des bornes d'un tableau). En C, l'absence de mécanismes de gestion des erreurs et un langage moins typé nous amèneront à des messages d'erreur nettement moins explicites ou des erreurs cachées. Il s'agit donc de s'armer correctement pour affronter entre autre le très sibyllin message d'erreur segmentation fault!

savoir utiliser les outils adaptés (options de compilation, débogueur, vérificateur de mémoire...) pour trouver des erreurs dans un programme.

Pour mettre au point un programme C, un bon programmeur utilise au moins :

  • son cerveau. On commence toujours par faire attention à ce qu'on écrit et utiliser un style de codage bien défini aide énormément en ce sens.
  • un éditeur de texte avancé permettant l'indentation automatique, la coloration syntaxique, la complétion, la navigation sémantique ...
  • les options d’avertissement du compilateur. Un programme qui compile n'est pas forcément fonctionnel. De nombreuses erreurs peuvent être détectées par le compilateur à condition de lui demander explicitement de le faire. Les options -Wall, -Wextra et -Werror de gcc vous éviteront bien des déboires. Même si ca peut paraître évident pour beaucoup, un warning ou un message d'erreur ne doit pas être pris à la légère.
  • un débogueur ou dévermineur comme gdb.
  • un vérificateur de mémoire comme valgrind.

D'autres outils ou techniques existent. Pour rappel, nous avons déjà vu 2 techniques basiques pour la mise au point des programmes :

  • l'ajout des traces un peu partout, à coup de printf et sa version améliorée vue hier avec des niveaux de trace. Principal inconvénient de la technique, il faut modifier et recompiler le programme à chaque ajout. Une approche pas toujours efficace, surtout si on pense qu'à la fin il faudra faire le nettoyage de ces lignes de code inutiles.
  • la programmation défensive via l'utilisation des assertions ou carrément d'un mécanisme de gestion d'erreurs.

Les ressources à utiliser durant cette séance sont à récupérer dans l'archive TGZ.

Utilisation de gdb pour mettre au point des programmes

Le dévermineur gdb (GNU DeBugger) est outil qui vous fait souvent peur. Pourtant, c'est une arme extrêmement efficace pour soigner vos programmes C. Pour vous familiariser avec les commandes de base de gdb, ouvrez avec votre éditeur de texte le fichier gdb-tutorial.c contenu dans l'archive que vous avez récupérée pour suivre pas à pas les manipulations à effectuer.

gdb fournit bien d'autres fonctionnalités avancées non décrites dans ce tutorial dont une partie est résumée dans le mémo suivant.

Sachez qu'il existe une version graphique de gdb, nommée ddd, qui reprend exactement les mêmes fonctionnalités. Cet outil peut s'avérer plus pratique pour visualiser des structures complexes comme des arbres.

Utilisation d'un vérificateur de mémoire : Valgrind

Pour détecter les fuites mémoires et les accès mémoires interdits ou incongrus, l'utilitaire Valgrind est recommandé. Pour voir son fonctionnement, jetez un oeil à la page Valgrind.

Exercices de déverminage

Les fichiers ex*.c, fournis dans l'archive, sont des programmes très courts contenant des erreurs simples à trouver.

  • Commencez par lire le code de chaque programme pour comprendre ce qu’il est censé faire et essayer de trouver l’erreur par vous même.
  • Pour chaque exemple, utiliser les outils présentés (avertissement du compilateur, dévermineur et vérificateur mémoire) pour retrouver l'erreur.

Exercices de verminage

Il s'agit ici d'écrire de petits programmes où le risque de se tromper est fort, et éventuellement de les corriger avec les outils adéquats.

  • Ajoutez au fichier listes.c, fourni durant la séance de TD, une fonction inverser_liste(struct cellule_t **l); qui inverse les éléments de la liste passée en argument.
  • Ajoutez un type liste doublement chainée et re-écrivez toutes les différentes fonctions de listes.c pour ce type.