Namespaces
Variants

longjmp

De fr.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é au site d'appel de la macro setjmp qui a configuré env. Ce setjmp retourne alors la valeur passée comme status.

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

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

(depuis C11)

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

En remontant la pile, longjmp ne désalloue aucun VLA, des fuites de mémoire peuvent survenir si leurs durées de vie sont ainsi terminées :

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)

Paramètres

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

Notes

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

Exemple

#include <setjmp.h>
#include <stdio.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 C23 (ISO/IEC 9899:2024) :
  • 7.13.2.1 La macro longjmp (p. 283-284)
  • Norme C17 (ISO/IEC 9899:2018) :
  • 7.13.2.1 La macro longjmp (p. 191-192)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.13.2.1 La macro longjmp (p. 263-264)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 7.13.2.1 La macro longjmp (p. 244-245)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.6.2.1 La fonction longjmp

Voir aussi

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