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

Bibliothèque standard C Discussion :

strtok_r: Conditional jump or move depends on uninitialised value


Sujet :

Bibliothèque standard C

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Points : 234
    Points
    234
    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 éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    As-tu essayé avec char *next_token=NULL;?

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    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