当前位置 博文首页 > lyndon:常见的内存报错原因

    lyndon:常见的内存报错原因

    作者:[db:作者] 时间:2021-09-15 10:18

    invalid next size (fast)

    出错原因:内存地址越界

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        char *p = malloc(4);
        char *x = malloc(4);
    
        for (int i = 0; i < 30; i++)
        {
            p[i] = 'a';
        }
    
        printf("%s\n", p);
    
        free(p);
    
        return 0;
    }
    
    $ gcc main.c 
    $ ./a.out 
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    *** Error in `./a.out': free(): invalid next size (fast): 0x0000000000d25010 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fce801a17e5]
    /lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7fce801aa37a]
    /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fce801ae53c]
    ./a.out[0x40061c]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fce8014a830]
    ./a.out[0x4004e9]
    ======= Memory map: ========
    00400000-00401000 r-xp 00000000 08:01 6455206                            /home/liyongjun/project/my/c/0126/a.out
    00600000-00601000 r--p 00000000 08:01 6455206                            /home/liyongjun/project/my/c/0126/a.out
    00601000-00602000 rw-p 00001000 08:01 6455206                            /home/liyongjun/project/my/c/0126/a.out
    00d25000-00d46000 rw-p 00000000 00:00 0                                  [heap]
    7fce7bdea000-7fce7be00000 r-xp 00000000 08:01 3806157                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7fce7be00000-7fce7bfff000 ---p 00016000 08:01 3806157                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7fce7bfff000-7fce7c000000 rw-p 00015000 08:01 3806157                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7fce7c000000-7fce7c021000 rw-p 00000000 00:00 0 
    7fce7c021000-7fce80000000 ---p 00000000 00:00 0 
    7fce8012a000-7fce802ea000 r-xp 00000000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7fce802ea000-7fce804ea000 ---p 001c0000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7fce804ea000-7fce804ee000 r--p 001c0000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7fce804ee000-7fce804f0000 rw-p 001c4000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7fce804f0000-7fce804f4000 rw-p 00000000 00:00 0 
    7fce804f4000-7fce8051a000 r-xp 00000000 08:01 3812091                    /lib/x86_64-linux-gnu/ld-2.23.so
    7fce806ee000-7fce806f1000 rw-p 00000000 00:00 0 
    7fce80718000-7fce80719000 rw-p 00000000 00:00 0 
    7fce80719000-7fce8071a000 r--p 00025000 08:01 3812091                    /lib/x86_64-linux-gnu/ld-2.23.so
    7fce8071a000-7fce8071b000 rw-p 00026000 08:01 3812091                    /lib/x86_64-linux-gnu/ld-2.23.so
    7fce8071b000-7fce8071c000 rw-p 00000000 00:00 0 
    7ffe8b88e000-7ffe8b8b0000 rw-p 00000000 00:00 0                          [stack]
    7ffe8b8d4000-7ffe8b8d7000 r--p 00000000 00:00 0                          [vvar]
    7ffe8b8d7000-7ffe8b8d9000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    已放弃 (核心已转储)
    

    double free or corruption (fasttop)

    出错原因:重复释放

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        char *p = malloc(4);
        // char *x = malloc(4);
    
        for (int i = 0; i < 4; i++)
        {
            p[i] = 'a';
        }
    
        printf("%s\n", p);
    
        free(p);
        free(p);
    
        return 0;
    }
    
    $ gcc main.c 
    $ ./a.out 
    aaaa
    *** Error in `./a.out': double free or corruption (fasttop): 0x0000000001439010 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7ff04d8187e5]
    /lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7ff04d82137a]
    /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7ff04d82553c]
    ./a.out[0x40061a]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7ff04d7c1830]
    ./a.out[0x4004e9]
    ======= Memory map: ========
    00400000-00401000 r-xp 00000000 08:01 6455206                            /home/liyongjun/project/my/c/0126/a.out
    00600000-00601000 r--p 00000000 08:01 6455206                            /home/liyongjun/project/my/c/0126/a.out
    00601000-00602000 rw-p 00001000 08:01 6455206                            /home/liyongjun/project/my/c/0126/a.out
    01439000-0145a000 rw-p 00000000 00:00 0                                  [heap]
    7ff048000000-7ff048021000 rw-p 00000000 00:00 0 
    7ff048021000-7ff04c000000 ---p 00000000 00:00 0 
    7ff04d58b000-7ff04d5a1000 r-xp 00000000 08:01 3806157                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff04d5a1000-7ff04d7a0000 ---p 00016000 08:01 3806157                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff04d7a0000-7ff04d7a1000 rw-p 00015000 08:01 3806157                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7ff04d7a1000-7ff04d961000 r-xp 00000000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7ff04d961000-7ff04db61000 ---p 001c0000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7ff04db61000-7ff04db65000 r--p 001c0000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7ff04db65000-7ff04db67000 rw-p 001c4000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7ff04db67000-7ff04db6b000 rw-p 00000000 00:00 0 
    7ff04db6b000-7ff04db91000 r-xp 00000000 08:01 3812091                    /lib/x86_64-linux-gnu/ld-2.23.so
    7ff04dd65000-7ff04dd68000 rw-p 00000000 00:00 0 
    7ff04dd8f000-7ff04dd90000 rw-p 00000000 00:00 0 
    7ff04dd90000-7ff04dd91000 r--p 00025000 08:01 3812091                    /lib/x86_64-linux-gnu/ld-2.23.so
    7ff04dd91000-7ff04dd92000 rw-p 00026000 08:01 3812091                    /lib/x86_64-linux-gnu/ld-2.23.so
    7ff04dd92000-7ff04dd93000 rw-p 00000000 00:00 0 
    7fffc9a71000-7fffc9a93000 rw-p 00000000 00:00 0                          [stack]
    7fffc9bab000-7fffc9bae000 r--p 00000000 00:00 0                          [vvar]
    7fffc9bae000-7fffc9bb0000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    已放弃 (核心已转储)
    

    free(): invalid pointer

    出错原因:释放的地址不是 malloc 申请的

    编译时有警告提醒

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        char p[1];
    
        free(p);
    
        return 0;
    }
    
    $ gcc main.c 
    main.c: In function ‘main’:
    main.c:8:5: warning: attempt to free a non-heap object ‘p’ [-Wfree-nonheap-object]
         free(p);
         ^
    $ ./a.out 
    *** Error in `./a.out': free(): invalid pointer: 0x00007ffd28125e67 ***
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fd41e4e87e5]
    /lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7fd41e4f137a]
    /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fd41e4f553c]
    ./a.out[0x4005c0]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fd41e491830]
    ./a.out[0x4004c9]
    ======= Memory map: ========
    00400000-00401000 r-xp 00000000 08:01 6455206                            /home/liyongjun/project/my/c/0126/a.out
    00600000-00601000 r--p 00000000 08:01 6455206                            /home/liyongjun/project/my/c/0126/a.out
    00601000-00602000 rw-p 00001000 08:01 6455206                            /home/liyongjun/project/my/c/0126/a.out
    7fd418000000-7fd418021000 rw-p 00000000 00:00 0 
    7fd418021000-7fd41c000000 ---p 00000000 00:00 0 
    7fd41e25b000-7fd41e271000 r-xp 00000000 08:01 3806157                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7fd41e271000-7fd41e470000 ---p 00016000 08:01 3806157                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7fd41e470000-7fd41e471000 rw-p 00015000 08:01 3806157                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7fd41e471000-7fd41e631000 r-xp 00000000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7fd41e631000-7fd41e831000 ---p 001c0000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7fd41e831000-7fd41e835000 r--p 001c0000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7fd41e835000-7fd41e837000 rw-p 001c4000 08:01 3812110                    /lib/x86_64-linux-gnu/libc-2.23.so
    7fd41e837000-7fd41e83b000 rw-p 00000000 00:00 0 
    7fd41e83b000-7fd41e861000 r-xp 00000000 08:01 3812091                    /lib/x86_64-linux-gnu/ld-2.23.so
    7fd41ea35000-7fd41ea38000 rw-p 00000000 00:00 0 
    7fd41ea5f000-7fd41ea60000 rw-p 00000000 00:00 0 
    7fd41ea60000-7fd41ea61000 r--p 00025000 08:01 3812091                    /lib/x86_64-linux-gnu/ld-2.23.so
    7fd41ea61000-7fd41ea62000 rw-p 00026000 08:01 3812091                    /lib/x86_64-linux-gnu/ld-2.23.so
    7fd41ea62000-7fd41ea63000 rw-p 00000000 00:00 0 
    7ffd28106000-7ffd28128000 rw-p 00000000 00:00 0                          [stack]
    7ffd28197000-7ffd2819a000 r--p 00000000 00:00 0                          [vvar]
    7ffd2819a000-7ffd2819c000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    已放弃 (核心已转储)
    

    corrupted size vs. prev_size

    待续

    cs
    下一篇:没有了