Namespaces
Variants

longjmp

From cppreference.net
Défini dans l'en-tête <setjmp.h>
void longjmp ( jmp_buf env, int status ) ;
(jusqu'à C11)
_Noreturn void longjmp ( jmp_buf env, int status ) ;
(depuis C11)
(jusqu'à C23)
[ [ noreturn ] ] void longjmp ( jmp_buf env, int status ) ;
(depuis C23)

Charge le contexte d'exécution env sauvegardé par un appel précédent à setjmp . Cette fonction ne retourne pas. Le contrôle est transféré vers le site d'appel de la macro setjmp qui a configuré env . Ce setjmp retourne ensuite la valeur, passée en tant que status .

Si la fonction qui a appelé setjmp a terminé son exécution (que ce soit par retour ou par un autre longjmp plus haut dans la pile), le comportement est indéfini. En d'autres termes, seuls les sauts vers le haut de la pile d'appels sont autorisés.

Sauter entre les threads (si la fonction qui a appelé setjmp a été exécutée par un autre thread) est également un comportement indéfini.

(since C11)

Si, lors de l'appel de setjmp , une variable de VLA ou un autre type à modification variable était dans la portée et que le contrôle a quitté cette portée, longjmp vers ce setjmp invoque un comportement indéfini même si le contrôle est resté dans la fonction.

En remontant la pile, longjmp ne désalloue aucun VLA, des fuites de mémoire peuvent se produire si leurs durées de vie se terminent de cette manière :

void g(int n)
{
    int a[n]; // a may remain allocated
    h(n); // does not return
}
void h(int n)
{
    int b[n]; // b may remain allocated
    longjmp(buf, 2); // might cause a memory leak for h's b and g's a
}
(depuis C99)

Table des matières

Paramètres

env - variable faisant référence à l'état d'exécution du programme sauvegardé par setjmp
status - la valeur à retourner depuis setjmp . Si elle est égale à 0 , 1 est utilisé à la place

Valeur de retour

(aucun)

Notes

longjmp est destiné à gérer des conditions d'erreur inattendues où la fonction ne peut pas retourner de manière significative. Ceci est similaire à la gestion d'exceptions dans d'autres langages de programmation.

Exemple

#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>
jmp_buf my_jump_buffer;
noreturn void foo(int status) 
{
    printf("foo(%d) called\n", status);
    longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp
}
int main(void)
{
    volatile int count = 0; // modified local vars in setjmp scope must be volatile
    if (setjmp(my_jump_buffer) != 5) // compare against constant in an if
        foo(++count);
}

Sortie :

foo(1) called
foo(2) called
foo(3) called
foo(4) called

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.13.2.1 La macro longjmp (p: 191-192)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.13.2.1 La macro longjmp (p: 263-264)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.13.2.1 La macro longjmp (p : 244-245)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.6.2.1 Fonction longjmp

Voir aussi

sauvegarde le contexte
(macro de fonction)
Documentation C++ pour longjmp