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 que je ne comprends pas


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut double free que je ne comprends pas
    Salut tout le monde,

    j'ai une jolie erreur de double free que je ne comprends pas .
    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
     
     
    *** glibc detected *** ./rfana: double free or corruption (out): 0x0804a008 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0xb7e65980]
    /lib/libc.so.6(__libc_free+0x89)[0xb7e66fe9]
    ./rfana[0x8048788]
    /lib/libc.so.6(__libc_start_main+0xd8)[0xb7e17838]
    ./rfana[0x8048671]
    ======= Memory map: ========
    08048000-08049000 r-xp 00000000 03:04 667639     /tmp/aie/coding/rfana/rfana
    08049000-0804a000 rw-p 00000000 03:04 667639     /tmp/aie/coding/rfana/rfana
    0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
    b7c00000-b7c21000 rw-p b7c00000 00:00 0 
    b7c21000-b7d00000 ---p b7c21000 00:00 0 
    b7e01000-b7e02000 rw-p b7e01000 00:00 0 
    b7e02000-b7f25000 r-xp 00000000 03:04 358628     /lib/libc-2.5.so
    b7f25000-b7f27000 r--p 00122000 03:04 358628     /lib/libc-2.5.so
    b7f27000-b7f28000 rw-p 00124000 03:04 358628     /lib/libc-2.5.so
    b7f28000-b7f2b000 rw-p b7f28000 00:00 0 
    b7f31000-b7f3b000 r-xp 00000000 03:04 340885     /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/libgcc_s.so.1
    b7f3b000-b7f3c000 rw-p 00009000 03:04 340885     /usr/lib/gcc/i686-pc-linux-gnu/4.1.1/libgcc_s.so.1
    b7f3c000-b7f3e000 rw-p b7f3c000 00:00 0 
    b7f3e000-b7f58000 r-xp 00000000 03:04 358627     /lib/ld-2.5.so
    b7f58000-b7f59000 r--p 00019000 03:04 358627     /lib/ld-2.5.so
    b7f59000-b7f5a000 rw-p 0001a000 03:04 358627     /lib/ld-2.5.so
    bfeca000-bfedf000 rw-p bfeca000 00:00 0          [stack]
    ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]
    inserted at counter: 440, value: -1Aborted

    Dans un premier temps, je fais dans un fichier ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    buffer = (char*) malloc (sizeof(char)*lSize);
    Puis, je fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    void insertMem(int value){
         if((counter_mem+1) >= ((val_realloc)*MEM_REALLOC))
    	  if((memCount = (int*) realloc(memCount, (++val_realloc)*MEM_REALLOC))== NULL)
    	       fprintf(stderr,"\nError realloc");
    [...]
    }
    Dans mon main, quand je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free(buffer);
    free(memCount);
    J'otiens donc le double free exception... pourtant ce sont bien deux zones mémoires différentes :S...

    Par contre, quand je fais UNIQUEMENT un:

    L'exception n'apparait plus.

    Merci beaucoup pour votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Bonjour,

    Le code que tu donnes n'est pas suffisant pour comprendre l'erreur.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut
    Bon, je peux pas tout le mettre ici, mais çA donne ça (fichier main.c):
    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
     
     
    int main(int argc, char ** argv){
         /** where the data file stands */
         complex *memfile;
         int start, end;
     
         if(argc != 3)
         {
    	  printf("\nUsage: ./plup <x> <file.dat>\n");
    	  exit(0);
         }
     
     
         // in order to write directly the microsec
         // we divide by 1000000
         frequency = atof(*(argv+1))/1000000;
         memfile = readFile(*(argv+2));
         binaryConverter(memfile);
     
         /** frees what done by malloc */
         free(memfile);
     
         // ?????????????????????????
         // ????????????????????????
         // Double free ? PK ?
     
         //free(memCount);
     
         return 0;

    Les variables frequency, memfile sont définie dans un header.

    Dans un autre fichier, reader.c

    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
     
     
    complex * readFile(char * argv){
         FILE * pFile;
         char * buffer;
         int lSize;
     
         pFile = fopen ( argv, "rb");
         if (pFile==NULL) {fputs ("File error\n",stderr); abort();}
     
         // obtain file size:
         fseek (pFile , 0 , SEEK_END);
         lSize = ftell (pFile);
         lSize -= (lSize%sizeof(complex));
         rewind (pFile);
     
         buffer = (char*) malloc (sizeof(char)*lSize);
         if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
     
         result = fread (buffer,sizeof(complex),lSize/sizeof(complex),pFile);
     
         if (result != (lSize/sizeof(complex))) {
              fputs ("Reading error",stderr); printf("\nValue of result: %d\n",result);exit (3);}
     
         fclose (pFile);
     
         return (complex*)buffer;
    }

    Dans ce même fichier, j'ai une fonction qui load en mémoire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    void insertMem(int value){
         if((counter_mem+1) >= ((val_realloc)*MEM_REALLOC))
              if((memCount = (int*) realloc(memCount, (++val_realloc)*MEM_REALLOC))== NULL)
                   fprintf(stderr,"\nError realloc");
         *(memCount+counter_mem++)=value;
     
    }
    Que j'appelle de temps à autre. Les pointeurs (int *)memCount et (*complex)memFile sont dans un fichier header (déclaration globale).

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    A mon avis tu as un problème de corruption de mémoire car tu passes allègrement d'un char* à un complex* pour le même pointeur, or comme les tailles de données sont, je suppose, différentes tu déborderais bien à un moment.
    D'autre part, memCount est-il initialisé avant ton realloc (au moins à NULL) ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut
    Citation Envoyé par Trap D
    A mon avis tu as un problème de corruption de mémoire car tu passes allègrement d'un char* à un complex* pour le même pointeur, or comme les tailles de données sont, je suppose, différentes tu déborderais bien à un moment.
    D'autre part, memCount est-il initialisé avant ton realloc (au moins à NULL) ?
    Merci pour la réponse.

    Mais en fait, la lecture du fichier ne pose absolument aucun problème (je redimensionne le pointeur en fait, c'est OK ça, vu que je divise lSize/sizeof(complex) ).

    Ce qui pose vraiment problème, c'est ce realloc, je ne peux pas le libérer. Si j'enlève l'instruction free(memCount) dans le main, alors mon programme fonctionne. Mais c'est illogique au possible :S... (je l'initialise bien à NULL)

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    tant qu'on ne voit pas comment elle est appelée, cette fonction, impossible d'en dire plus..

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

Discussions similaires

  1. std ::vector [erreur que je ne comprend pas]
    Par aaronw dans le forum SL & STL
    Réponses: 8
    Dernier message: 05/03/2006, 21h00
  2. [Débutant] Message d'erreur que je ne comprends pas
    Par Le Furet dans le forum Langage
    Réponses: 2
    Dernier message: 25/02/2006, 17h37
  3. [PostGreSQL] une erreur que je ne comprends pas
    Par flo78 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/02/2006, 10h18
  4. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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