SETJMP |
Fixe le saut |
---|---|
Langage C++ | csetjmp (setjmp.h) |
Syntaxe
int setjmp(jmp_buf env); |
Paramètres
Nom | Description |
---|---|
env | Ce paramètre permet d'indiquer l'environnement contenant l'expression à traiter |
Description
Cette fonction effectue la sauvegarde de la pile.
Remarques
- La fonction setjmp() enregistre le contenu de la pile système dans le tampon env pour une utilisation ultérieure par la fonction longjmp(). Il utilise l'entête «csetjmp».
- La fonction setjmp() renvoie zéro lors de l'appel. Cependant, longjmp() transmet un paramètre à setjmp() lors de son exécution, et c'est cette valeur (toujours différente de zéro) semblant être la valeur de la fonction setjmp() après un appel à la fonction longjmp().
- Définition et utilité : La fonction setjmp fait partie de la bibliothèque <csetjmp> (ou <setjmp.h> en C) et est utilisée pour effectuer des sauts non locaux dans un programme. Elle permet de sauvegarder l'état du programme à un point donné afin de pouvoir y revenir ultérieurement à l'aide de la fonction longjmp. Cela est principalement utilisé pour la gestion des erreurs et des interruptions.
- Principe de fonctionnement : setjmp enregistre l'environnement du programme (y compris l'état des registres, la pile d'exécution et le pointeur d'instruction) dans un objet jmp_buf. Lorsque longjmp est appelé avec le même jmp_buf, l'exécution reprend à l'endroit où setjmp a été initialement appelé, comme si setjmp venait de retourner une deuxième fois. Exemple d'utilisation :
- Valeur de retour de setjmp : Lorsque setjmp est appelé pour la première fois, il retourne 0. Lorsque l'exécution revient via longjmp, setjmp retourne la valeur passée à longjmp. CDela permet de distinguer le premier appel de setjmp d'un retour via longjmp, ce qui est utile pour la gestion d'erreurs.
- Utilisation pour la gestion d'erreurs : setjmp est souvent utilisé comme alternative aux exceptions pour gérer les erreurs dans un programme. Par exemple, lorsqu'une erreur critique est détectée, longjmp permet de revenir à un point sûr au lieu de laisser le programme planter. C'est particulièrement utile dans des environnements embarqués ou pour éviter des structures de contrôle trop complexes.
- Limites et précautions d'utilisation : setjmp et longjmp ne prennent pas en charge la destruction automatique des objets locaux en C++, ce qui signifie que les destructeurs des objets en pile ne sont pas appelés lors d'un saut. Cela peut entraîner des fuites de mémoire si des objets alloués dynamiquement ne sont pas correctement libérés. Pour cette raison, setjmp est rarement utilisé en C++ moderne, où l'on privilégie les exceptions (try/catch).
- Perte de lisibilité et de maintenabilité : L'utilisation de setjmp et longjmp peut rendre le code difficile à comprendre et à maintenir, car elle brise le flux d'exécution normal. Un programme avec de nombreux sauts peut rapidement devenir compliqué à déboguer. Dans la plupart des cas, il est préférable d'utiliser des exceptions en C++ plutôt que ces sauts non locaux.
- Alternative avec les exceptions en C++ : En C++, les exceptions (throw et catch) sont généralement préférées à setjmp/longjmp, car elles permettent une gestion des erreurs plus propre et automatique. Contrairement à longjmp, elles appellent correctement les destructeurs des objets locaux, évitant ainsi les fuites mémoire. Exemple avec try/catch :
- Utilisation spécifique en bas niveau : setjmp est principalement utilisé dans des contextes spécifiques où l'utilisation d'exceptions n'est pas possible, comme : les systèmes embarqués où le support des exceptions peut être limité, les gestionnaires de signaux où un saut rapide à un état stable est nécessaire après un signal (exemple : division par zéro), les langages interprétés ou machines virtuelles où des mécanismes de récupération d'erreurs doivent être implémentés manuellement.
Exemple
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é
Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - longjmp
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 - setjmp
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 734.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 231.
Dernière mise à jour : Lundi, le 3 août 2015