+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    décembre 2007
    Messages
    629
    Détails du profil
    Informations personnelles :
    Âge : 28

    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 :
    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 :
    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 349
    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 349
    Points : 34 758
    Points
    34 758

    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 484
    Points
    2 484

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •