11

次のようなエラーが発生します。私はそれが私が不適切にメモリにアクセスすることと関係があることを知っていますが、私は正確にはその方法を知りません。私がどこで間違っているのかを知るのを手伝ってください。

*関数を簡略化したので、変数が何をしているのかが明確ではないことに注意してください。関数を誤って実装している方法や、メモリアクセスを誤用している場所を知る必要があります。

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; 

私が与えられたエラー:

*** 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]
4

2 に答える 2

10

すでに解放されているか、参照解除されたメモリを解放しようとしているようです。

プログラムをefenceにリンクするか、valgrindで実行します。

これにより、ポインタが逆参照される場所がわかります。

于 2012-09-23T01:01:52.553 に答える
6

メモリの破損は通常、割り当てられたメモリの終わりを超えて書き込むことによって引き起こされます。多くの場合、nullが文字列を終了するために必要な1バイトを誰かが追加するのを忘れたため、1バイトが原因です。

ダブルフリーとは、free(x)が同じ値のxで2回続けて呼び出されたことを意味します。コードのどこかでfree(x)が呼び出され、次に別のコードでfree(x)が再度呼び出される可能性があります。

問題を特定する最も簡単な方法は、gdbを使用して、コードをステップ実行するときに何が起こっているかを観察することです。

上記のmy_functionコードでは、mallocまたはfreeの呼び出しはありません。ゼロバッファはスタック上にあり、whileループはバッファの終わりを超えて書き込みを行いません。問題はコードの他の部分にあります。問題の修正にかかる時間は、malloc / free/strdupなどが呼び出された場所の数によって異なります。

于 2012-09-25T05:32:49.370 に答える