Valgrind... 4 octets à l'intérieur d'un bloc de taille 8 gratuit avais
J'obtiens cette erreur dans Valgrind après avoir tenté de libérer une liste. print_list décharges de la liste pour le syslog. Je suis assez confiant sur le fait que la sortie est correcte.
Valgrind:
==7028== 1 errors in context 1 of 10:
==7028== Invalid read of size 4
==7028== at 0x8049603: free_list (list.c:239)
==7028== by 0x80488B5: m61_close_for_valgrind (m61.c:36)
==7028== by 0x8048825: main (mytest.c:19)
==7028== Address 0x420006c is 4 bytes inside a block of size 8 free'd
==7028== at 0x4028F0F: free (vg_replace_malloc.c:446)
==7028== by 0x804960C: free_list (list.c:239)
==7028== by 0x80488B5: m61_close_for_valgrind (m61.c:36)
==7028== by 0x8048825: main (mytest.c:19)
==7028==
mytest.c:
15 char *temp = malloc(10);
16 char *temp2 = malloc(10);
17 free(temp);
18 free(temp2);
19 m61_close_for_valgrind();
liste.h
typedef struct lnode {
ACTIVE_ALLOCATION *value;
struct lnode *next;
} lnode;
liste.c (Appelé par m61_close_for_valgrind()
void free_list(LIST *s) {
lnode **nptr = &s->head;
print_list(s);
while (*nptr) {
lnode **tmp = nptr;
tmp = nptr;
if ((*tmp)->value) {
syslog(LOG_NOTICE,"Freeing (*tmp)->value=%p\n", (*tmp)->value);
//printf("%p\n",(*nptr)->value);
free((*tmp)->value); //Free active allocation metadata
}
nptr = &(*nptr)->next;
syslog(LOG_NOTICE,"New *nptr value=%p\n", (*nptr));
syslog(LOG_NOTICE,"Freeing (*tmp)=%p\n", (*tmp));
free(*tmp); //Free node
}
}
syslog
Sep 19 00:37:02 appliance mytest[7759]: -- Start List Dump --
Sep 19 00:37:02 appliance mytest[7759]: (*nptr)=0x903f220 (*nptr)->value=0x903f208 (*nptr)->next=0x903f260 (*nptr)->value->ptr=0x903f1f0
Sep 19 00:37:02 appliance mytest[7759]: (*nptr)->value->ptr=0x903f1f0
Sep 19 00:37:02 appliance mytest[7759]: (*nptr)=0x903f260 (*nptr)->value=0x903f248 (*nptr)->next=(nil) (*nptr)->value->ptr=0x903f230
Sep 19 00:37:02 appliance mytest[7759]: (*nptr)->value->ptr=0x903f230
Sep 19 00:37:02 appliance mytest[7759]: -- End List Dump --
Sep 19 00:37:02 appliance mytest[7759]: Freeing (*tmp)->value=0x903f208
Sep 19 00:37:02 appliance mytest[7759]: New *nptr value=0x903f260
Sep 19 00:37:02 appliance mytest[7759]: Freeing (*tmp)=0x903f220
Sep 19 00:37:02 appliance mytest[7759]: Freeing (*tmp)->value=0x903f248
Sep 19 00:37:02 appliance mytest[7759]: New *nptr value=(nil)
Sep 19 00:37:02 appliance mytest[7759]: Freeing (*tmp)=0x903f260
Je suis perplexe; le
valgrind
rapport fait référence à une adresse 0x0420006C, mais votre trace via syslog()
ne se réfère à aucune adresse n'importe où près de ce. Avez-vous changé le code après avoir généré le rapport, mais avant que vous avez généré la trace?OriginalL'auteur user994165 | 2013-09-19
Vous devez vous connecter pour publier un commentaire.
Que la caf a déjà écrit, vous avez accès à la mémoire qui vient d'être libéré.
Pour corriger cela, il suffit de ne pas utiliser des doubles pointeurs, seul pointeurs font très bien ici.
Donc remplacer
par
Même pour
dans la boucle. Faire
et de la baisse de la double affectation juste quand vous.
Ensuite accéder à la valeur et à côté par
et
directement
OriginalL'auteur Bodo Thiesen
À chaque itération autres que la première,
tmp
de points à lanext
pointeur à partir du nœud précédent - mais vous avez déjà libéré le nœud (dans l'itération précédente), donctmp
points dans un bloc libéré et vous ne pouvez pas déréférencer.OriginalL'auteur caf