Bonjour,
je développe en C un programme permettant de gérer des lieux possédant un lieu au nord, un au sud, un à l'ouest et un à l'est.
Pour cela, je créé une structure Place et deux fonctions (une pour créer et l'autre pour libérer l'espace mémoire alloué).
Le problème est que dans certains cas, valgrind détecte des "Invalid read of size" dans la fonction de libération.
Pouvez-vous me dire quelle(s) erreur(s) il y a dans ma fonction de libération?
Merci.
Voici le code :
Voici les erreurs détectées par 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 #include <stdlib.h> /* for malloc */ #include <stdio.h> /* for fprintf */ typedef struct place { int freeing; struct place* n; struct place* s; struct place* w; struct place* e; } Place; Place* Place_New() { Place* place; place = malloc(sizeof(Place)); if(place == NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); return(NULL); } else { place->freeing = 0; place->n = NULL; place->s = NULL; place->w = NULL; place->e = NULL; } return(place); } int Place_Free(Place* place) { if(place==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); return(-1); } printf("Free\n"); place->freeing = 1; if(place->n != NULL && place->n->freeing == 0) { Place_Free(place->n); place->n = NULL; } if(place->s != NULL && place->s->freeing == 0) { Place_Free(place->s); place->s = NULL; } if(place->w != NULL && place->w->freeing == 0) { Place_Free(place->w); place->w = NULL; } if(place->e != NULL && place->e->freeing == 0) { Place_Free(place->e); place->e = NULL; } free(place); place = NULL; return(0); } int main(int argc, char *argv[]) { /* Create the Place objects */ Place* place = Place_New(); if(place==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } Place* place_n = Place_New(); if(place_n==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } Place* place_s = Place_New(); if(place_s==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } Place* place_w = Place_New(); if(place_w==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } Place* place_e = Place_New(); if(place_e==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } Place* place_n_w = Place_New(); if(place_n_w==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } Place* place_n_e = Place_New(); if(place_n_e==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } Place* place_s_w = Place_New(); if(place_s_w==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } Place* place_s_e = Place_New(); if(place_s_e==NULL) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } place->n = place_n; place->s = place_s; place->w = place_w; place->e = place_e; place->n->n = NULL; place->n->s = place; place->n->w = place_n_w; place->n->e = place_n_e; place->s->n = place; place->s->s = NULL; place->s->w = place_s_w; place->s->e = place_s_e; place->w->n = place_n_w; place->w->s = place_s_w; place->w->w = NULL; place->w->e = place; place->e->n = place_n_e; place->e->s = place_s_e; place->e->w = place; place->e->e = NULL; /* Free the Place objects */ if(Place_Free(place)==-1) { fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); return(0); }
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 $ valgrind ./main.out ==9729== Memcheck, a memory error detector. ==9729== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al. ==9729== Using LibVEX rev 1804, a library for dynamic binary translation. ==9729== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP. ==9729== Using valgrind-3.3.0, a dynamic binary instrumentation framework. ==9729== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al. ==9729== For more details, rerun with: -v ==9729== Free Free Free Free Free Free Free Free ==9729== Invalid read of size 4 ==9729== at 0x80485FA: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x8048672: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80489E0: main (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== Address 0x4431190 is 0 bytes inside a block of size 20 free'd ==9729== at 0x4023359: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==9729== by 0x80486BC: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x8048672: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x804860E: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80489E0: main (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== ==9729== Invalid read of size 4 ==9729== at 0x804862C: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x8048672: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80489E0: main (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== Address 0x4431220 is 0 bytes inside a block of size 20 free'd ==9729== at 0x4023359: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==9729== by 0x80486BC: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x8048672: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x8048640: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80489E0: main (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) Free ==9729== ==9729== Invalid read of size 4 ==9729== at 0x80485FA: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80486A4: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80489E0: main (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== Address 0x44311d8 is 0 bytes inside a block of size 20 free'd ==9729== at 0x4023359: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==9729== by 0x80486BC: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80486A4: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x804860E: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80489E0: main (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== ==9729== Invalid read of size 4 ==9729== at 0x804862C: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80486A4: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80489E0: main (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== Address 0x4431268 is 0 bytes inside a block of size 20 free'd ==9729== at 0x4023359: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) ==9729== by 0x80486BC: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80486A4: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x8048640: Place_Free (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== by 0x80489E0: main (in /home/yugiohjcj/Documents/Programmes/Tests/C/test_free/main.out) ==9729== ==9729== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 37 from 1) ==9729== malloc/free: in use at exit: 0 bytes in 0 blocks. ==9729== malloc/free: 9 allocs, 9 frees, 180 bytes allocated. ==9729== For counts of detected errors, rerun with: -v ==9729== All heap blocks were freed -- no leaks are possible.
Partager