LONGJMP |
Long saut |
---|---|
Langage C | 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.
Algorithme
MODULE LONGJMP(env, val) * Vérifie si l'environnement sauvegardé est valide SI env est NULL ALORS raise Error("Environnement invalide") FIN SI * Ajuste la valeur de retour si nécessaire SI val = 0 ALORS val ← 1 FIN SI * Restaurer l'environnement d'exécution restore_execution_state(env) * Simule le retour de setjmp avec la valeur val exit_function_with_return_value(val) |
Remarques
- Utilité principale : gestion des sauts non locaux : La fonction longjmp permet d'effectuer un saut non local en restaurant l'état d'exécution sauvegardé précédemment avec setjmp. Elle est principalement utilisée pour gérer des erreurs ou des sorties précoces dans des programmes complexes, par exemple pour sortir de plusieurs niveaux d'appels imbriqués sans utiliser de retours classiques.
- Couplée à setjmp pour définir un contexte : L'appel à setjmp enregistre l'environnement d'exécution dans une variable de type jmp_buf. Ensuite, longjmp utilise cette variable pour restaurer cet environnement et sauter à l'endroit où setjmp a été initialement appelé. Cette association est indispensable pour le bon fonctionnement.
- Restauration de la pile d'exécution : Lorsqu'un longjmp est exécuté, il rétablit non seulement le pointeur d'instruction (où exécuter le code ensuite), mais également la pile et les registres d'exécution, comme s'il reprenait là où setjmp avait été appelé. Cela peut perturber la logique normale du programme si mal utilisé.
- Transmission d'un code de retour : Un paramètre entier, val, est passé à longjmp pour indiquer une valeur de retour à setjmp. Cependant, si val vaut 0, il est automatiquement converti en 1 pour éviter la confusion avec le premier appel de setjmp.
- Problèmes de portabilité et de lisibilité : L'usage de longjmp et setjmp peut rendre le code difficile à lire et à maintenir, car il brise la séquence normale d'exécution et peut entraîner des effets de bord imprévus. Bien que standard en C, leur utilisation est souvent déconseillée dans les projets modernes pour des raisons de clarté.
- Pas adapté pour la gestion des ressources : longjmp ne gère pas les objets alloués dynamiquement ni les ressources comme les descripteurs de fichiers ou les verrous. Si un longjmp saute par-dessus des fonctions libérant ces ressources, cela peut provoquer des fuites mémoire ou des blocages.
- Limitations liées à l'environnement : L'environnement enregistré par setjmp ne doit pas être modifié avant l'appel à longjmp. Par exemple, l'exécution de longjmp après une fonction récursive ou un changement dans la structure de la pile peut entraîner un comportement indéfini.
- Exemples d'utilisation spécifique : longjmp est souvent utilisé dans les bibliothèques ou outils nécessitant une gestion d'erreur bas niveau, comme les analyseurs ou les systèmes embarqués. Cependant, dans les environnements modernes, il est remplacé par des mécanismes plus robustes comme les exceptions en C++ ou des approches basées sur des goto contrôlés.
Exemple
Voici un exemple permettant de sauvegarder l'environnement de façon à ce qu'il passe deux fois sur le même code :
Essayer maintenant !
on obtiendra le résultat suivant :
Appeler setjmpLongjmp est appelé
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.
Dernière mise à jour : Mardi, le 28 juillet 2015