Waarom krijg ik deze geheugentoegangsfout ‘Double Free of Corruption’?

Ik krijg het volgende type fout. Ik weet dat het iets met mij te maken heeft met me ten onrechte toegang tot het geheugen, maar ik weet niet precies hoe. Help me alsjeblieft waar ik fout ben gegaan.

* Opmerking Ik heb mijn functie vereenvoudigd en het is niet duidelijk wat de variabelen doen, ik moet alleen weten hoe ik de functie verkeerd implementeer of waar ik de geheugentoegang misbruikt.

int my_function(char const *file_name, size_t max)
        {
        myStruct.pStore = fopen(file_name,"w+");      //pStore is a FILE* 
        myStruct.max = max;                 
        // fill the with zeros ('0')
        int numberOfZeros = max*SIZE;
        char zeros[numberOfZeros];                      
        int i=0;
        while(i<numberOfZeros)         // insert zero's 
        {
                zeros[i]='0';
                i++;
        }
        fwrite(zeros,sizeof(char),numberOfZeros,myStruct.pStore);
        fclose(myStruct.pStore);
        return EXIT_SUCCESS; 

De fout die ik krijg:

*** glibc detected *** /home/.../: double free or corruption (top): 0x0804c008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7e82e42]
/lib/i386-linux-gnu/libc.so.6(fclose+0x154)[0xb7e72384]
/home/2012/spatar/cs/specs/release[0x80486b0]
/home/2012/spatar/cs/specs/release[0x8048acd]
/home/2012/spatar/cs/specs/release[0x8048af0]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb7e284d3]
/home/2012/spatar/cs/specs/release[0x80484e1]
 ======= Memory map: ========
08048000-0804a000 r-xp 00000000 00:3b 2331829    /home/2012/spatar/cs/Aspecs/release
0804a000-0804b000 r--p 00001000 00:3b 2331829    /home/2012/spatar/cs/specs/release
0804b000-0804c000 rw-p 00002000 00:3b 2331829    /home/2012/spatar/cs/specs/release
0804c000-0806d000 rw-p 00000000 00:00 0          [heap]
b7e0e000-b7e0f000 rw-p 00000000 00:00 0 
b7e0f000-b7fae000 r-xp 00000000 00:11 5415       /lib/i386-linux-gnu/libc-2.15.so
b7fae000-b7fb0000 r--p 0019f000 00:11 5415       /lib/i386-linux-gnu/libc-2.15.so
b7fb0000-b7fb1000 rw-p 001a1000 00:11 5415       /lib/i386-linux-gnu/libc-2.15.so
b7fb1000-b7fb4000 rw-p 00000000 00:00 0 
b7fbc000-b7fd8000 r-xp 00000000 00:11 5426       /lib/i386-linux-gnu/libgcc_s.so.1
b7fd8000-b7fd9000 r--p 0001b000 00:11 5426       /lib/i386-linux-gnu/libgcc_s.so.1
b7fd9000-b7fda000 rw-p 0001c000 00:11 5426       /lib/i386-linux-gnu/libgcc_s.so.1
b7fda000-b7fdd000 rw-p 00000000 00:00 0 
b7fdd000-b7fde000 r-xp 00000000 00:00 0          [vdso]
b7fde000-b7ffe000 r-xp 00000000 00:11 5405       /lib/i386-linux-gnu/ld-2.15.so
b7ffe000-b7fff000 r--p 0001f000 00:11 5405       /lib/i386-linux-gnu/ld-2.15.so
b7fff000-b8000000 rw-p 00020000 00:11 5405       /lib/i386-linux-gnu/ld-2.15.so
bffdf000-c0000000 rw-p 00000000 00:00 0          [stack]

Antwoord 1, autoriteit 100%

Het lijkt erop dat u geheugen probeert vrij te maken dat al is vrijgemaakt of waarvan de referentie is verwijderd.

Koppel uw programma met efenceof voer het uit met valgrind.

Dit zal u vertellen waar uw aanwijzer wordt verwijderd.


Antwoord 2, autoriteit 50%

Geheugencorruptie wordt meestal veroorzaakt door schrijven voorbij het einde van het toegewezen geheugen, en vaak is het één byte omdat iemand vergeten is één byte toe te voegen die nodig is om de null een tekenreeks te laten beëindigen.

Double free betekent dat free(x) twee keer achter elkaar is aangeroepen met dezelfde waarde van x. Ergens in je code wordt free(x) aangeroepen en dan hoogstwaarschijnlijk in een ander stuk code free(x) opnieuw.

De gemakkelijkste manier om het probleem te isoleren is door gdb te gebruiken en te observeren wat er gebeurt terwijl u door uw code stapt.

In uw my_function-code hierboven zijn er geen oproepen naar malloc of gratis. De nullenbuffer bevindt zich op de stapel en de while-lus schrijft niet verder dan het einde van de buffer. Het probleem zit in een ander deel van de code. Hoe lang het duurt om het probleem of de problemen op te lossen, hangt af van het aantal plaatsen waar malloc/free/strdup enz. vandaan worden gebeld.

Other episodes