LONGJMP |
Long saut |
---|---|
Langage C++ | csetjmp (setjmp.h) |
Syntaxe
void longjmp(jmp_buf env,int val) |
Paramètres
Nom | Description |
---|---|
env | Ce paramètre permet d'indiquer l'environnement |
val | Ce paramètre permet d'indiquer la valeur |
Description
Cette fonction permet d'effectuer la restauration de la pile dans un saut non local.
Remarques
- La fonction longjmp() fait reprendre l'exécution du programme au point du dernier appel à setjmp(). Ces deux fonctions permettent de passer d'une fonction à l'autre. Notez que l'entête «csetjmp» est requis.
- La fonction longjmp() fonctionne en réinitialisant la pile à l'état tel que décrit dans le paramètre env, devant avoir été défini par un appel préalable à setjmp(). Cette situation provoque la reprise de l'exécution du programme à l'instruction suivant l'appel de la fonction setjmp(). Autrement dit, l'ordinateur est «trompé» en pensant qu'il n'a jamais quitté la fonction ayant appelé setjmp(). Comme explication quelque peu graphique, la fonction longjmp() «déforme» le temps et l'espace (mémoire) vers un point précédent de votre programme sans avoir à effectuer le processus de retour de fonction normal.
- Le tampon env est de type jmp_buf, étant défini dans l'entête «csetjmp». Le tampon doit avoir été défini via un appel à setjmp() avant d'appeler longjmp(). La valeur de val devient la valeur de retour de setjmp() et peut être interrogée pour déterminer d'où vient le saut en longueur. La seule valeur non autorisée est zéro.
- De loin, l'utilisation la plus courante de longjmp() consiste à revenir d'un ensemble de routines profondément imbriquées lorsqu'une erreur se produit.
- Définition et rôle : La fonction longjmp fait partie de la bibliothèque <csetjmp> en C++ (ou <setjmp.h> en C), et elle permet de quitter prématurément une fonction et de revenir à un point précis dans l'exécution du programme. Cette fonction est généralement utilisée en combinaison avec setjmp pour effectuer un contrôle de flux non conventionnel, permettant de sauter à un autre endroit du programme sans suivre la séquence normale des appels de fonction.
- Utilisation avec setjmp : La fonction longjmp est généralement utilisée en complément de setjmp pour gérer les retours de fonction dans des contextes complexes, comme dans des situations d'exceptions ou de gestion d'erreurs. Le processus typique est :
- Appeler setjmp, enregistrant l'état du programme dans un jmp_buf.
- Si une erreur se produit ou si un événement particulier survient, appeler longjmp pour revenir à l'endroit où setjmp avait été exécuté.
- La valeur renvoyée par longjmp peut être capturée par le retour de setjmp.
- Applications dans la gestion des erreurs : Une des utilisations classiques de longjmp est dans la gestion des erreurs, particulièrement dans des systèmes où les exceptions (comme celles offertes par try-catch) ne sont pas disponibles ou ne sont pas adaptées. Par exemple, dans un programme où une condition d'erreur pourrait survenir à plusieurs niveaux d'appel de fonction, setjmp et longjmp permettent de sauter immédiatement aux gestionnaires d'erreur définis, évitant ainsi la propagation d'erreurs manuelle à travers plusieurs niveaux de la pile d'appels.
- Problèmes de portabilité et de lisibilité : Bien que puissantes, les fonctions setjmp et longjmp rendent le code difficile à lire et à maintenir. Elles peuvent perturber le flux de contrôle normal, rendant le programme difficile à suivre et à déboguer. De plus, elles peuvent entraîner des problèmes de portabilité, car elles dépendent du compilateur et de la plate-forme pour gérer correctement l'environnement d'exécution, ce qui pourrait rendre le code incompatible avec certaines configurations ou optimisations du compilateur.
- Effets sur les variables locales : Lorsqu'un appel à longjmp renvoie à un point où setjmp a été invoqué, il ne réinitialise pas les variables locales modifiées après l'appel à setjmp. Cela signifie que l'état de certaines variables peut ne pas correspondre à leur état avant l'appel de setjmp, ce qui peut entraîner des comportements inattendus si elles sont utilisées après un appel à longjmp. En conséquence, setjmp et longjmp ne doivent être utilisés qu'avec une compréhension claire des effets secondaires potentiels.
- Alternative moderne : les exceptions : Bien que longjmp soit un outil puissant, il est souvent préféré d'utiliser les exceptions C++ (via try, catch, et throw) pour gérer les erreurs de manière plus lisible et robuste. Les exceptions offrent une meilleure gestion du flux de contrôle, avec une sémantique plus claire pour le programmeur et une prise en charge améliorée des ressources locales, telles que les variables locales et les verrous (via des mécanismes comme RAII). Ainsi, longjmp est généralement utilisé dans des situations où les exceptions ne sont pas une option (par exemple, dans les bibliothèques C ou dans des environnements contraints).
Ici, setjmp sauvegarde l'état de l'exécution et longjmp permet de revenir à cet état avec la valeur 1. Cela affiche "Avant longjmp" et "Reprenant après longjmp" après avoir sauté le reste de la fonction.
Exemples
Voici un exemple permettant de sauvegarder l'environnement de façon à ce qu'il passe deux fois sur le même code :

on obtiendra le résultat suivant :
Appeler setjmpLongjmp est appelé
Voici un exemple simple pour illustrer l'utilisation de setjmp et longjmp :
Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - setjmp
Langage de programmation - C++ - Référence de procédures et fonctions - signal
Langage de programmation - C - Référence de procédures et fonctions - longjmp
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 733.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 164.