web-dev-qa-db-fra.com

Lecture invalide de taille 8 - Valgrind + C

Valgrind signale une erreur Invalid read of size 8 dans le code suivant.

J'ai un tableau déclaré comme,

struct symbol *st[PARSER_HASH_SIZE];

Lorsque mon programme est initialisé, tous les éléments de ce tableau sont initialisés à 0.

memset(&st[0], 0, sizeof(st));

Mon programme crée des instances de struct symbol et s'insère dans le tableau ci-dessus en fonction de la valeur de hachage. Ainsi, peu d'éléments de ce tableau seront NULL et d'autres auront une valeur valide.

Le code suivant essaie de supprimer les éléments alloués et valgrind se plaint sur la ligne, sym = st[i]; sym != NULL; sym = sym->next

struct symbol *sym = NULL;

/* cleaning the symbol table entries */
for(i = 0; i < PARSER_HASH_SIZE; i++) {
    for(sym = st[i]; sym != NULL; sym = sym->next) { /* <-- Valgrind complains here */
        free(sym);
    }
}

J'essaie de comprendre la raison de cette erreur.

Toute aide est la bienvenue!

22
Navaneeth K N

Le problème est que vous libérez le sym, puis essayez d'accéder à une valeur à partir des données (maintenant libérées): sym->next.

Vous voulez probablement quelque chose comme ça pour la boucle intérieure:

struct symbol *next_sym = NULL;

for(sym = st[i]; sym != NULL; ) {
    next_sym = sym->next;
    free(sym);
    sym = next_sym;
}
42
ZoogieZork

il est également difficile de savoir si votre tableau est destiné à contenir des structures ou des pointeurs vers des structures

struct symbol *st[PARSER_HASH_SIZE];

dit que c'est un tableau de pointeurs vers des structures. Mais tu dis

"Lorsque mon programme est initialisé, tous les éléments de ce tableau sont initialisés à 0."

memset(&st[0], 0, sizeof(st));

Ceci traite les entrées comme des structures

pour effacer le tableau faire

for (int i = 0; i < PARSER_HASH_SIZE; i++)
{
    st[i] = 0;
}
3
pm100