Par James M. Rogers jrogers@u.washington.edu
Le dernier article concernait <stdlib.h>, les fonctions utilitaires. Celui-ci traîte de <assert.h>, les fonctions de diagnostic pour les programmeurs.
Je suppose que le lecteur connaît la programmation en C. Je n'apporte aucune garantie sur l'exactitude des informations apportées ni sur leur utilité pour quoi que ce soit.
Si vous les utilisez convenablement, les assertions [NdT: c'est-à-dire des points d'arrêt dans le code] vous permettront de documenter beaucoup plus facilement votre code et de le déboguer sans aucune incidence sur le temps d'exécution. Il ne faut pas utiliser les assertions pour le code final car elles provoquent l'arrêt de l'exécution du programme avec un code de retour correspondant à une erreur. Puisque les assertions ne sont jamais utilisées pour le code final, elles ne peuvent pas servir à trouver des erreurs à l'exécution comme par exemple l'échec d'une allocation de mémoire. Vous devez continuer à manipuler les conditions de retour de toutes les fonctions, en cas d'erreur, comme d'habitude.
Au contraire, les assertions vous permettent de documenter les hypothèses que vous faites lorsque vous développez. Elles vous permettent aussi de de déboguer les erreurs évidentes de logique que vous faites. Lorsque vous programmez, vous pouvez modifier vos assertions autour des erreurs que vous recherchez sans rester bloqué..
Considérons l'exemple de programme suivant :
#include <stdio.h> #include <assert.h> /* This program is written to demonstrate the <stdlib.h> library. This program will demonstrate the assert function Written by James M. Rogers 12 April 1999 Released to the Public Domain on this date. Compile this with the -DNDEBUG flag in order to _NOT_ compile the assert statement. So all production boxes should compile with the -DNDEBUG flag. */ main (){ int i=1; int j=0; assert(j!=0); printf("%s\n", i/j); }
J'y montre l'utilisation d'assertion dans un cas simple qui nécessite deux nombres et divise le premier par le deuxième. Compilez le programme de la manière suivante :
gcc -DNDEBUG assert_example.c -o assert
Exécutez ./assert
et essayez de diviser par la valeur
zero. Le drapeau NDEBUG
oblige votre assertion à ne pas
produire de code d'exécution. Ce drapeau pourra être utilisé dans tous
les environnements de développement.
Votre programme se terminera avec la création d'un fichier
core
et quasiment aucune indication du problème dans
le message d'erreur. Maintenant recompilez le programme de la manière
suivante :
gcc assert_example.c -o assert
Maintenant, lancez à nouveau l'exécution du programme et essayez de diviser par zéro. Cette fois-ci, il devrait être très facile d'identifier le problème et de localiser la ligne exacte où celui-ci se déclare.
Comme toujours, si vous voyez une erreur dans mes documents, s'il vous plaît, faites-le moi savoir pour que je puisse la corriger dans un document ultérieur. Consultez les corrections à la fin de ce document, s'il y a lieu, pour trouver les corrections concernant mes précédents articles.
#include <assert.h>
void assert(int expression);
The ANSI C Programming Language, Second Edition, Brian W. Kernighan, Dennis M. Ritchie, Printice Hall Software Series, 1988
The Standard C Library, P. J. Plauger, Printice Hall P T R, 1992
The Standard C Library, Parts 1, 2, and 3, Chuck Allison, C/C++ Users Journal, January, February, March 1995
STDIO(3), BSD MANPAGE, Manuel du programmeur Linux, 29 Novembre 1993
Articles précédents sur la "Bibliothèque standard C pour Linux" :
La bibliothèque standard C pour Linux, première partie, James M. Rogers,
Janvier 1998
La bibliothèque standard C pour Linux, deuxième partieo, James M. Rogers,
Juillet 1998
La bibliothèque standard C pour Linux, troisième partie, James M. Rogers,
Août 1998
La bibliothèque standard C pour Linux, quatrième partie, James M. Rogers,
Mars 1998
La bibliothèque standard C pour Linux, cinquième partie, James M. Rogers,
Avril 1998
Copyright © 1999, James M. Rogers - Publié dans le n°41 de la Linux Gazette, mai 1999.
Adaptation française de Thierry Hamon
thierry.hamon@lipn.univ-paris13.fr
.