奇怪的glibc检测到free()无效指针错误

时间:2014-08-26 15:08:05

标签: c++ glibc

我意识到这个错误有很多问题

    *** glibc detected *** /usr/bin/obj_to_bob_debug: free(): invalid pointer: 0x0000000000bde130 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7ec66)[0x7f2d1f33fc66]
/usr/lib/x86_64-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x23)[0x7f2d1fc31c13]
/usr/bin/obj_to_bob_debug[0x4023b7]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f2d1f2e278d]
/usr/bin/obj_to_bob_debug[0x402109]
======= Memory map: ========
00400000-00415000 r-xp 00000000 fc:00 1061803                            /usr/bin/obj_to_bob_debug
00614000-00615000 r--p 00014000 fc:00 1061803                            /usr/bin/obj_to_bob_debug
00615000-00616000 rw-p 00015000 fc:00 1061803                            /usr/bin/obj_to_bob_debug
00bde000-00bff000 rw-p 00000000 00:00 0                                  [heap]
7f2d1f2c1000-7f2d1f476000 r-xp 00000000 fc:00 275257                     /lib/x86_64-linux-gnu/libc-2.15.so
7f2d1f476000-7f2d1f676000 ---p 001b5000 fc:00 275257                     /lib/x86_64-linux-gnu/libc-2.15.so
7f2d1f676000-7f2d1f67a000 r--p 001b5000 fc:00 275257                     /lib/x86_64-linux-gnu/libc-2.15.so
7f2d1f67a000-7f2d1f67c000 rw-p 001b9000 fc:00 275257                     /lib/x86_64-linux-gnu/libc-2.15.so
7f2d1f67c000-7f2d1f681000 rw-p 00000000 00:00 0
7f2d1f681000-7f2d1f696000 r-xp 00000000 fc:00 262189                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f2d1f696000-7f2d1f895000 ---p 00015000 fc:00 262189                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f2d1f895000-7f2d1f896000 r--p 00014000 fc:00 262189                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f2d1f896000-7f2d1f897000 rw-p 00015000 fc:00 262189                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7f2d1f897000-7f2d1f992000 r-xp 00000000 fc:00 275262                     /lib/x86_64-linux-gnu/libm-2.15.so
7f2d1f992000-7f2d1fb91000 ---p 000fb000 fc:00 275262                     /lib/x86_64-linux-gnu/libm-2.15.so
7f2d1fb91000-7f2d1fb92000 r--p 000fa000 fc:00 275262                     /lib/x86_64-linux-gnu/libm-2.15.so
7f2d1fb92000-7f2d1fb93000 rw-p 000fb000 fc:00 275262                     /lib/x86_64-linux-gnu/libm-2.15.so
7f2d1fb93000-7f2d1fc75000 r-xp 00000000 fc:00 1054000                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f2d1fc75000-7f2d1fe74000 ---p 000e2000 fc:00 1054000                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f2d1fe74000-7f2d1fe7c000 r--p 000e1000 fc:00 1054000                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f2d1fe7c000-7f2d1fe7e000 rw-p 000e9000 fc:00 1054000                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
7f2d1fe7e000-7f2d1fe93000 rw-p 00000000 00:00 0
7f2d1fe93000-7f2d1feb5000 r-xp 00000000 fc:00 275249                     /lib/x86_64-linux-gnu/ld-2.15.so
7f2d200a8000-7f2d200ad000 rw-p 00000000 00:00 0
7f2d200b2000-7f2d200b5000 rw-p 00000000 00:00 0
7f2d200b5000-7f2d200b6000 r--p 00022000 fc:00 275249                     /lib/x86_64-linux-gnu/ld-2.15.so
7f2d200b6000-7f2d200b8000 rw-p 00023000 fc:00 275249                     /lib/x86_64-linux-gnu/ld-2.15.so
7fffe2f9f000-7fffe2fc0000 rw-p 00000000 00:00 0                          [stack]
7fffe2ffe000-7fffe3000000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)

在我发布大量代码之前,我会尝试解释一下我觉得奇怪的事情...... 我使用g ++编译我的程序(4 .cpp文件和3 .h文件),95%的时间运行正常。 它解析.obj文件并写出我自己的二进制格式.bob。 在发生此错误的文件上,对于完全相同的调用是一致的,例如。

root@DevVm64-Liam:/# /usr/bin/obj_to_bob_debug /usr/local/apache2/htdocs/uploads/3dmodels/3/24/sample\ obj\ file.obj

但是对于任何失败的文件,更改输入文件名的长度会使其运行正常,例如。

root@DevVm64-Liam:/# /usr/bin/obj_to_bob_debug /usr/local/apache2/htdocs/uploads/3dmodels/3/24/sample\ obj\ file1.obj

但更改文件名,使其长度与错误相同。

无论文件名中的[正确转义]空格如何,都会发生这种情况。

而是发布一堆代码(我不知道我的代码中的错误发生在哪里)任何人都可以建议为什么会发生这种情况? 如果有必要,我可以尝试删除大部分代码并发布可能发生的可能区域。

注意:我从不打电话给免费或删除,因为我只使用一个或两个auto_ptr

我有一种感觉,但我不确定这段代码是否存在问题

    string outFile;

    //if no output file given set to same as input file with obj replaced with bob
    if (argc == 2) {
        char* tempOutFile = new char[fineName.length()];
        strcpy(tempOutFile, (fileName.substr(0, fileName.length()-4) + ".bob").c_str());
        outFile.assign(tempOutFile);
        delete tempOutFile;
    } else {
        outFile = argv[2];
    }

我一直在阅读strcpy可能存在问题,但我没有看到代码有任何问题...

1 个答案:

答案 0 :(得分:1)

非常确定这是一种未定义的行为。 strcpy正在复制到未初始化的指针。

char* tempOutFile; // = ???
// now your copying from the sub-string to an unknown memory address
strcpy(tempOutFile, (fileName.substr(0, fileName.length()-4) + ".bob").c_str());

所有这一切只是将子字符串复制到另一个字符串?就这样做:

string outFile;

//if no output file given set to same as input file with obj replaced with bob
if (argc == 2) {
    outFile = fileName.substr(0, fileName.length()-4) + ".bob";
} else {
    outFile = argv[2];
}

另外,请不要忘记调用该程序的名称用于argv[0]。因此,如果argc == 2,您的程序实际上只有一个参数argv[1]

     $ ./prog arg1 arg2
argv   ^-- 0  ^--1 ^--2
argc == 3 (size of argv)