IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Double free or corruption


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut Double free or corruption
    Bonjour,

    je recode actuellement la commande ls -l de l'env UNIX.
    Il ne me reste plus qu'à mettre les noms de fichier dans l'ordre.
    Mon tri par insertion fonctionne mais ma fonction d'ajout dans ma liste chainée déconne ...

    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
    .. -> a.out -> main.c -> . -> my_ls.h.gch -> my_ls.c~ -> sort_names.c~ -> sort_names.c -> parse_time.c -> my_ls.c -> my_ls.h -> my_ls.h~ -> Pk�b� -> Fin de liste
    *** glibc detected *** ./a.out: double free or corruption (out): 0x0000000000400590 ***
    ======= Backtrace: =========
    /lib64/libc.so.6[0x3a19e76d63]
    /lib64/libc.so.6(closedir+0xd)[0x3a19ea659d]
    ./a.out[0x4009df]
    ./a.out[0x40067d]
    /lib64/libc.so.6(__libc_start_main+0xfd)[0x3a19e1ee5d]
    ./a.out[0x4005b9]
    ======= Memory map: ========
    00400000-00401000 r-xp 00000000 08:05 1312109                            /home/maingu_t/localc/FileSystem/my_ls/a.out
    00601000-00602000 rw-p 00001000 08:05 1312109                            /home/maingu_t/localc/FileSystem/my_ls/a.out
    01edb000-01f04000 rw-p 00000000 00:00 0                                  [heap]
    3a19a00000-3a19a1f000 r-xp 00000000 08:03 521237                         /lib64/ld-2.13.so
    3a19c1e000-3a19c1f000 r--p 0001e000 08:03 521237                         /lib64/ld-2.13.so
    3a19c1f000-3a19c20000 rw-p 0001f000 08:03 521237                         /lib64/ld-2.13.so
    3a19c20000-3a19c21000 rw-p 00000000 00:00 0 
    3a19e00000-3a19f91000 r-xp 00000000 08:03 521239                         /lib64/libc-2.13.so
    3a19f91000-3a1a191000 ---p 00191000 08:03 521239                         /lib64/libc-2.13.so
    3a1a191000-3a1a195000 r--p 00191000 08:03 521239                         /lib64/libc-2.13.so
    3a1a195000-3a1a196000 rw-p 00195000 08:03 521239                         /lib64/libc-2.13.so
    3a1a196000-3a1a19c000 rw-p 00000000 00:00 0 
    3a1b600000-3a1b615000 r-xp 00000000 08:03 521351                         /lib64/libgcc_s-4.5.1-20100924.so.1
    3a1b615000-3a1b814000 ---p 00015000 08:03 521351                         /lib64/libgcc_s-4.5.1-20100924.so.1
    3a1b814000-3a1b815000 rw-p 00014000 08:03 521351                         /lib64/libgcc_s-4.5.1-20100924.so.1
    7f9862898000-7f986289b000 rw-p 00000000 00:00 0 
    7f98628c5000-7f98628c7000 rw-p 00000000 00:00 0 
    7fff4aa09000-7fff4aa2a000 rw-p 00000000 00:00 0                          [stack]
    7fff4aa8e000-7fff4aa8f000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    Abandon (core dumped)
    Voila les fonctions du .c qui déconnent apparemment (je post seulement ce qui peut fail) :

    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
    llist	add_names_list()   /* Ajout des noms de fichiers dans ma liste chainée */
    {
      struct node	*new;
      struct dirent	*dirent;
      DIR		*dir;
      llist		liste;
     
      dir = opendir(".");
      while ((dirent = readdir(dir)) != NULL)
        {
          new = malloc(sizeof(struct node ));
          new->nom = dirent->d_name;
          new->next = liste;
          liste = new;
        }
      closedir(dir);
      return liste;
     
    void aff_list (llist const *liste)  /* Display de la liste chainée */
    {
       struct node const *p = *liste;
       while (p != NULL)
       {
          printf ("%s -> ", p->nom);
          p = p->next;
       }
       printf ("Fin de liste\n");
    }
     
    void     ls_l()   /* Ici simple display de la liste, pas encore triée */
      {
     llist	list;
     
     list = add_names_list();
     aff_list(&list);
     closedir(dir);
    }
    Et le .h des structures associées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct  node
    {
      char	const	*nom;
      struct node	*next;
    }node;
     
    typedef struct node* llist;
    Le truc incompréhensible c'est que le closedirr(dir) de ls_l(), qui prend un parametre un DIR* non initialisé, si je le vire, ça segfault d'entrée alors qu'il est présent dans ma fonction d'ajout dans la liste chainée ...

    Si vous pouviez m'aider ce serait sympa, merci

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    En initialisant liste à NULL en premier ????

    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
    llist	add_names_list()   /* Ajout des noms de fichiers dans ma liste chainée */
    {
      struct node	*new;
      struct dirent	*dirent;
      DIR		*dir;
      llist		liste=NULL;
     
      dir = opendir(".");
      while ((dirent = readdir(dir)) != NULL)
        {
          new = malloc(sizeof(struct node ));
          new->nom = dirent->d_name;
          new->next = liste;
          liste = new;
        }
      closedir(dir);
      return liste;

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut
    Ca ne marche pas ...
    Même erreur :s

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Ça devrait même pas compiler avec ta variable dir dans ls_l ... à moins que tu n'aies une variable globale de même nom ?

    Quels messages as-tu lors de la compilation (quel compilateur ?) ?
    As-tu mis les warnings au max (-Wall -Wextra) ?
    Quel est ton environnement ?

    As-tu essayé le mode debug ?
    As-tu parsemé ton code de printf pour le tracer ?

    => c'est pas un bon plan de donner à une variable le nom d'un keyword (new) ...

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par kwariz Voir le message
    => c'est pas un bon plan de donner à une variable le nom d'un keyword (new) ...
    new n'est pas un keyword en C. C'en est un en C++, en java, ..., mais pas en C, donc tu peux tout a fait le faire.

    D'ailleurs, en C++, le programme ne compilerait pas.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut
    Merci Kwariz.
    J'avais cherché le SegFault avec gdb sans qu'il ne me permette de trouver mon erreur et j'avais oublié de simplement use les falgs de compilation.

    Il se trouve que je n'avais pas initialisé ma variable dir.
    En retirant sa déclaration, j'ai pu retirer closedir et ça marche impeccablement bien maintenant

    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/05/2019, 17h27
  2. [ProFTPd][glibc detected double free or corruption]
    Par Théolude dans le forum Administration système
    Réponses: 1
    Dernier message: 28/08/2008, 09h19
  3. [SFML] Image double free or corruption
    Par Belegkarnil dans le forum SFML
    Réponses: 4
    Dernier message: 23/08/2007, 16h56
  4. erreur glibc detected double free or corruption.
    Par Screwt-K dans le forum C++
    Réponses: 1
    Dernier message: 02/07/2007, 16h46
  5. Problème d'éxécution: double free or corruption
    Par ciol_tebroc dans le forum C++
    Réponses: 3
    Dernier message: 17/05/2006, 19h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo