p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    décembre 2007
    Messages
    629
    Détails du profil
    Informations personnelles :
    Âge : 29

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2007
    Messages : 629
    Points : 204
    Points
    204

    Par défaut strtok_r: Conditional jump or move depends on uninitialised value

    Bonjour,

    j'utilise strtok_r pour parser un message (char *msg) obtenu en sortie d'une couche de récupération de paquets venant de ma carte réseau. (msg ici correspond en fait à la couche 7 dans OSI). Quand j'utilise valgrind pour vérifier les erreurs mémoires, j'obtiens un message d'erreur: Conditional jump or move depends on uninitialised value
    at 0x5977762: strtok_r (strtok.S:117)
    . Valgrind trouve apparemment un pointeur (?) non initialisé entré en paramètre de strtok_r ... Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char *header_fields;
    char delims[2] = { 0x0D, 0x0A }
    char *next_token;
     
    header_fields = strtok_r((char *) msg, delims, &next_token);
    while (header_fields) {
       ...
       header_fields = strtok_r(NULL, delims, &next_token);
    }
    et pourtant le code de l'exemple du man strtok_r ne produit ce genre d'erreur en le lançant avec valgrind:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
        #include <stdio.h>
           #include <stdlib.h>
           #include <string.h>
     
           int
           main(int argc, char *argv[])
           {
               char *str1, *str2, *token, *subtoken;
               char *saveptr1, *saveptr2;
               int j;
     
               if (argc != 4) {
                   fprintf(stderr, "Usage: %s string delim subdelim\n",
                           argv[0]);
                   exit(EXIT_FAILURE);
               }
     
               for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
                   token = strtok_r(str1, argv[2], &saveptr1);
                   if (token == NULL)
                       break;
                   printf("%d: %s\n", j, token);
     
                   for (str2 = token; ; str2 = NULL) {
                       subtoken = strtok_r(str2, argv[3], &saveptr2);
                       if (subtoken == NULL)
                           break;
                       printf(" --> %s\n", subtoken);
                   }
               }
     
               exit(EXIT_SUCCESS);
           } /* main */
    Je tiens préciser que mon code parse bien le message msg mais c'est valgrind qui rale.
    Je me demande quand même d'ou vient le problème ... pourquoi valgrind rale.
    Est ce que quelqu'un aurait une idée ...

    Merci d'avance

  2. #2
    Expert Confirmé Sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 807
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 807
    Points : 35 958
    Points
    35 958

    Par défaut

    As-tu essayé avec char *next_token=NULL;?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 515
    Points : 2 486
    Points
    2 486

    Par défaut

    D'où vient msg ?

    Et puis ça n'a probablement rien à voir avec ton problème, mais delims doit être fini par un 0. Là strtok_r() va partir jardiner après la fin de delims.

Discussions similaires

  1. Valgrind Conditional jump obscure
    Par Waether dans le forum C
    Réponses: 4
    Dernier message: 07/03/2015, 21h03
  2. Réponses: 8
    Dernier message: 17/05/2010, 11h34
  3. "Use of uninitialised value"
    Par |PaRa-BoL dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 12/02/2009, 22h13
  4. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48
  5. Forcer jump short ou far
    Par Blustuff dans le forum Assembleur
    Réponses: 6
    Dernier message: 02/03/2003, 02h03

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