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:
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 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); }
Je tiens préciser que mon code parse bien le message msg mais c'est valgrind qui rale.
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 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
Partager