IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Question sur le retour au contexte précédent après un "longjmp".


Sujet :

C

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Question sur le retour au contexte précédent après un "longjmp".
    Salut!

    Ce programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdio.h>
    #include <stdlib.h>
    #include <setjmp.h>
     
    int main(int argc, char *argv[])
    {
    int n=0,m=0;
    jmp_buf buf;
    if(!setjmp(buf)){
                     n+=1;
                     m=1;
                     printf("Avant \"longjmp\" : n = %d  m = %d\n",n,m);
                     longjmp(buf,1);
                     }
    else{
         printf("Apres \"longjmp\" : n = %d  m = %d\n",n,m);
         }  
     
      system("PAUSE");	
      return 0;
    }
    montre que après le retour du "setjmp", "m" vaut bien sa valeur initiale : 0 ce qui n'est pas le cas de "n" et ceci à cause de la différence d'affectation de la valeur 1 : avec l'opérateur "=" ou avec l'opérateur "+=".
    Le résultat est le même avec l'opérateur "++" à la place de l'opérateur "+=".
    Pourquoi "n" ne reprend t'il pas sa valeur initiale : 0 après le saut?

    Merci.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Après un longjmp, l'état est le même que celui avant l'appel sauf pour les variables automatiques à l'endroit où se trouve le setjmp. Celles-ci ont une valeur indéterminée sauf si elles sont volatiles (auquel cas, leur valeur est la dernière valeur écrite).

    Comme ni m ni n ne sont volatiles dans ton exemple, leur valeur est indéterminée et peut être n'importe quoi.

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Salut,

    avec des options de compilation correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    main.c:7: warning: variable 'n' might be clobbered by `longjmp' or `vfork'
    Il semblerai que le warning provienne des optimisations (O2)

    A l'exécution (avec O2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Avant "longjmp" : n = 1  m = 1
    Apres "longjmp" : n = 1  m = 0
    A l'exécution (sans O2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Avant "longjmp" : n = 1  m = 1
    Apres "longjmp" : n = 1  m = 1
    Comme setjmp sauvegarde le contexte de pile, si les variables n et m sont dans des registres, elles ne seront pas restaurées, mais même sans optimisation et/ou en utilisant le mot clés volatile ça ne change rien

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par gege2061
    Comme setjmp sauvegarde le contexte de pile, si les variables n et m sont dans des registres, elles ne seront pas restaurées, mais même sans optimisation et/ou en utilisant le mot clés volatile ça ne change rien
    Sans volatile tu as des valeurs indéterminées, avec volatile tu as les dernières valeurs écrites (donc les valeurs avant le longjmp). Si tu as un comportement qui varie avec le niveau d'optimisation pour des variables volatiles, ça mérite un rapport du bug à ton fournisseur.

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    En effet c'est compilé avec l'option "-02".
    En mettant "volatile" les valeurs sont 1 et 1.
    Mais pourquoi pas 0 et 0, les valeurs avant la sauvegarde du contexte?

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par seriousme
    En effet c'est compilé avec l'option "-02".
    En mettant "volatile" les valeurs sont 1 et 1.
    Mais pourquoi pas 0 et 0, les valeurs avant la sauvegarde du contexte?
    Avec volatile, parce que la règle est comme cela (et cela semble bien correspondre à la nature de volatile...)

    Sans volatile... Si on voulait sauvegarder toutes les variables locales, ça en ferait potentiellement des choses... on pourrait éventuellement demander que le comportement avec volatile soit toujours présent, mais alors on se bloque des possibilités d'optimisation.

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Sans volatile tu as des valeurs indéterminées, avec volatile tu as les dernières valeurs écrites (donc les valeurs avant le longjmp). Si tu as un comportement qui varie avec le niveau d'optimisation pour des variables volatiles, ça mérite un rapport du bug à ton fournisseur.
    ça ne change rien dans le sens où je n'obtenai pas le résultat attendu (enfin que je pensai obtenir), j'ai la flème de relancer C::B pour voir si j'obtient bien 1 et 1 avec des variables volatiles. Je testerai avec une version à jour de gcc sinon ça n'a aucun interet.

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Parce que setjmp ne sauvegarde que la pile, donc l'adresse des variables locales (et non leur contenue).
    Alors comment faire en sorte que les valeurs soient "réinitialisées"?

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par seriousme
    Alors comment faire en sorte que les valeurs soient "réinitialisées"?
    Tu mets tes réinitialisations dans la branche else du setjmp.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/02/2008, 13h22
  2. Question sur le retour arrière du navigateur
    Par progamer54 dans le forum JSF
    Réponses: 3
    Dernier message: 30/05/2007, 18h35
  3. Réponses: 1
    Dernier message: 26/12/2006, 15h58
  4. question sur les valeurs de retour
    Par arasium dans le forum Langage
    Réponses: 10
    Dernier message: 24/07/2006, 16h47
  5. [Configuration] Pb sur le retour à la page précédente...
    Par Sophy75 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 13/04/2006, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo