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 :

Valgrind sort une erreur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut Valgrind sort une erreur
    Bonjour,

    J'ai un petit problème avec Valgrind qui me signale un "Conditional jump or move depends on uninitialised value(s)" lors de l'affichage d'une liste chaînée.

    Les structures :
    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
     
    typedef void Objet;
     
    /* le type Element (élément de la liste) */
    struct s_Element {
      Objet* reference; /* référence un objet */
      struct s_Element* suivant; /* élément suivant de la liste */
      struct s_Element* precedent; /* élément suivant de la liste */
    };
    typedef struct s_Element Element;
     
    /* le type Liste */
    struct s_Liste {
      Element* premier; /* premier élément de la liste */
      Element* dernier; /* dernier élément de la liste */
      int nbElt; /* nombre d'élements dans la liste */
      int type; /* type de liste */
      char* (*toString) (Objet*);
      int (*comparer) (Objet*, Objet*);
    };
    typedef struct s_Liste Liste;
    La portion de code incriminée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void afficherListe(Liste* l) {
      Element* e = l->premier;
     
      printf("%d elements : ", nbEltListe(l));
     
      while(e != NULL) {
        printf("%s ", l->toString(e->reference));
        e = e->suivant;
      }
    }
    Le programme compile bien en -Wall -ansi et affiche ce qui est attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    5 elements : pladamousse kikoo test lol pasteque
    Or Valgrind indique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ==10534== Conditional jump or move depends on uninitialised value(s)
    ==10534==    at 0x8048B16: afficherListe (Liste.c:146)
    ==10534==    by 0x8048C51: main (main.c:38)
    C'est-à-dire que mon pointeur sur Element e ne serait pas initialisé, or l->premier l'est à l'initialisation de la liste (=NULL), et plus encore il l'est car il m'affiche ma liste correctement...
    Je me demande donc si ce n'est pas simplement Valgrind qui me sort une fausse erreur. Et comment faire pour avoir un memcheck "propre" !

    Merci à vous !

  2. #2
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    L'erreur de valgrind n'est pas forcement là où tu le penses,
    La pile d'appel est importante et doit être prise en compte ...

    Peut on voir l'appel du main ?

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    euh.. Je crois que c'est pourtant indiqué clairement :

    Conditional jump or move depends on uninitialised value(s
    à la ligne 534..

    Tu as donc à la ligne 534 quelque chose que tu utilises dans un test ou quelque chose de similaire alors qu'il peut ne pas être initialisé ..

    Ce quelque chose il faut voir la ligne 534 por savoir laquelle c'est..

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    Le problème est corrigé, même si je ne l'ai pas bien compris.
    Comme je voulais juste tester rapidement mon tda liste, j'insérais directement un pointeur vers une chaîne de caractères. En faisant un test plus réaliste (chaîner des objets de type structure), mon problème a disparu.
    Je n'ai pas changé du tout le code de ma liste.

    Merci en tout cas !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Par défaut
    En fait, ça n'avait rien à voir avec le type de données que je référençais dans ma liste. J'avais juste un oubli dans une des procédures d'insertion dans la liste ce qui fait qu'effectivement une variable n'était pas initialisée, même si ça ne gênait pas du tout le fonctionnement.
    Valgrind rocks !

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

Discussions similaires

  1. [CMake] NMake sort une erreur de liaison
    Par khazna dans le forum Systèmes de compilation
    Réponses: 1
    Dernier message: 02/05/2010, 14h47
  2. [DOM] Internet Explorer me sort une 'Erreur : Objet Requis' :/
    Par VilainMelkor dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/11/2008, 12h42
  3. [VB6] Source D'une erreur
    Par krest dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 16/07/2003, 17h33
  4. [procédure PG] Une erreur mystérieuse...ou pas
    Par doohan dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/07/2003, 17h16
  5. Ne pas formater une erreur
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 18/03/2003, 14h13

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