Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur valgrind - Invalid read of size 8

Address 0x4a992e0 is 480 bytes inside an unallocated block of size ..

    1 avril 2022 à 19:37:45

    Bonjour,

    Ça fait plusieurs heures que je me penche sur cette erreur, et je n'arrive toujours pas à comprendre ce qui ne va pas... (Petite précision: je suis tout nouveau en C).

    En gros mon programme compile correctement et sans erreurs, mais à l'exécution de Valgrind j'obtiens cette erreur:

    ==14880== Invalid read of size 8
    ==14880==    at 0x48573A0: dir_free (directory.c:110)
    ==14880==    by 0x109099: main (directory-01.c:14)
    ==14880==  Address 0x4a992e0 is 480 bytes inside an unallocated block of size 4,194,016 in arena "client"

    Voici le code en question:

    struct dir
    {
    	uint32_t taille;
    	uint32_t nb_contact;
    	struct contact *first_cell;
    };
    
    /*
      Crée un nouvel annuaire contenant _len_ listes vides.
    */
    struct dir *dir_create(uint32_t len)
    {
    	struct dir *annuaire = calloc(1, sizeof(struct dir));
    	struct contact *first_cell = calloc(len, sizeof(struct contact));
    	annuaire->taille = len;
    	annuaire->nb_contact = 0;
    	annuaire->first_cell = first_cell;
    	return annuaire;
    }
    
    /*
      Libère la mémoire associée à l'annuaire _dir_.
    */
    void dir_free(struct dir *dir)
    {
    	struct contact *sent = dir->first_cell;
    	for (size_t i = 0; i < dir->taille; i++, sent += sizeof(struct contact))
    	{
    		if (sent->next != NULL)
    		{
    			delete_contacts(sent->next);
    		}
    	}
    	free(dir->first_cell);
    	free(dir);
    }

    L'erreur en question relevée par Valgrind ce situe à la ligne if (sent->next != NULL) de la fonction dir_free.

    En complément, voici à quoi ressemble mon struct contact:

    struct contact{
      char *nom;
      char *num;
      struct contact *next;
    };

    Quelqu'un a-t-il trouvé une raison à cette erreur ?




    -
    Edité par Logan2234 2 avril 2022 à 14:46:00

    • Partager sur Facebook
    • Partager sur Twitter

    Logan

      1 avril 2022 à 19:56:48

      Bonjour,

      Ligne 27, pour faire pointer sent sur le contact suivant, il suffit d'incrémenter ce pointeur.

      for ( size_t i = 0 ; i < dir->taille ; i++, sent++ )
      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        1 avril 2022 à 20:26:16

        Ton annuaire est dans un tableau ou une liste chaînée ? Je dis ça parce que tu donnes une taille de plusieurs éléments dans ton calloc ligne 14.  

        PS : Tu as compilé le code que tu as posté ? Car ligne 17 la structure dir n'a pas de champ nommé first_contact !

        • Partager sur Facebook
        • Partager sur Twitter
          1 avril 2022 à 20:56:31

          Dalfab a écrit:

          Bonjour,

          Ligne 27, pour faire pointer sent sur le contact suivant, il suffit d'incrémenter ce pointeur.

          for ( size_t i = 0 ; i < dir->taille ; i++, sent++ )

          D'accord merci :)

          Edit: Après modification de cette ligne, je n'ai effectivement plus de problèmes avec Valgrind, mais je ne comprends pas en quoi ça permet d'éviter l'erreur sachant chaque cellule de mon tableau sont espacées de sizeof(struct contact), donc pourquoi en ajoutant cette valeur à l'adresse de mon pointeur cela ne marchait pas ?

          rouIoude a écrit:

          Ton annuaire est dans un tableau ou une liste chaînée ? Je dis ça parce que tu donnes une taille de plusieurs éléments dans ton calloc ligne 14.  

          PS : Tu as compilé le code que tu as posté ? Car ligne 17 la structure dir n'a pas de champ nommé first_contact !


          Oui oui haha, j'ai juste modifié le nom des variables pour que ce soit peut-être plus parlant ici, aucun problème sur mon code à ce niveau là en tout cas, juste une erreur de ma part en renommant pour OC. 

          En gros mon annuaire contient un pointeur qui correspond à la première cellule de mon tableau. Puis chaque cellule de mon tableau est la tête d'une liste chaînée (le tableau est en fait une table de hachage, d'où les listes chaînées pour gérer les collisions).

          -
          Edité par Logan2234 1 avril 2022 à 21:05:17

          • Partager sur Facebook
          • Partager sur Twitter

          Logan

            2 avril 2022 à 9:34:12

            Logan2234 a écrit:

            Edit: Après modification de cette ligne, je n'ai effectivement plus de problèmes avec Valgrind, mais je ne comprends pas en quoi ça permet d'éviter l'erreur sachant chaque cellule de mon tableau sont espacées de sizeof(struct contact), donc pourquoi en ajoutant cette valeur à l'adresse de mon pointeur cela ne marchait pas ?

            Les opérations sur les pointeurs prennent déjà en compte la taille qui est pointée.
            Si tu ajoutes 1 à un pointeur, tu pointes sur l'élément suivant donc la valeur du pointeur augmente de sizeof(contract), toi tu ajoutais sizeof(contract) donc ton pointeur avançais de sizeof(contract)*sizeof(contract)!

            • Partager sur Facebook
            • Partager sur Twitter

            En recherche d'emploi.

            Erreur valgrind - Invalid read of size 8

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown