编译器生成一个NULL调用?

时间:2015-12-24 14:54:09

标签: c++ gcc assembly

我一直在编译一个C ++(64位)程序,并且在使用gcc时由于NULL指针而得到了一个SIGSEGV。最初我用VS 2010实现了它,但代码本身并不依赖于编译器,只使用stl并在VS中正常工作。

当我用gcc编译它时,我发现这个部分有一个带有NULL指针的调用。

所有涉及的对象都是std::string所以这应该保存。

void Filename::updatePath(void)
{
    size_t len = mBasePath.size();
    if(len > 0)
    {
        len--;
        if(mBasePath[len] != mDelimiter)
            mBasePath += mDelimiter;
    }

    mOpenPath = mBasePath + mFilename;
}

生成的程序集

107                                             mBasePath += mDelimiter;
0000000000403ac4: 0x00000000488b45d0   mov -0x30(%rbp),%rax
0000000000403ac8: 0x000000000fb64020   movzbl 0x20(%rax),%eax
0000000000403acc: 0x00000000000fbec0   movsbl %al,%eax
0000000000403acf: 0x00000000488b55d0   mov -0x30(%rbp),%rdx
0000000000403ad3: 0x00000000488d4a08   lea 0x8(%rdx),%rcx
0000000000403ad7: 0x00000000000089c2   mov %eax,%edx
0000000000403ad9: 0x000000e8da3e0200   callq 0x4279b8 <_ZNSspLEc>
110                                     mOpenPath = mBasePath + mFilename;
0000000000403ade: 0x00000000488b45d0   mov -0x30(%rbp),%rax
0000000000403ae2: 0x00000000488d4810   lea 0x10(%rax),%rcx
0000000000403ae6: 0x00000000488b45d0   mov -0x30(%rbp),%rax
0000000000403aea: 0x00000000488d5008   lea 0x8(%rax),%rdx
0000000000403aee: 0x00000000488d45a0   lea -0x60(%rbp),%rax
0000000000403af2: 0x00000000004989c8   mov %rcx,%r8
0000000000403af5: 0x00000000004889c1   mov %rax,%rcx
0000000000403af8: 0x000000e803c5bfff   callq 0x0
0000000000403afd: 0x00000000488b45d0   mov -0x30(%rbp),%rax
0000000000403b01: 0x00000000488d4818   lea 0x18(%rax),%rcx
0000000000403b05: 0x00000000488d45a0   lea -0x60(%rbp),%rax
0000000000403b09: 0x00000000004889c2   mov %rax,%rdx
0000000000403b0c: 0x000000e8173c0200   callq 0x427728 <_ZNSsaSEOSs>

那么有人可以解释这里出了什么问题吗?代码位于静态库中,该库链接到可执行文件。我一直在使用-flto选项,但之前我已经这样做了,所以我真的不知道这可能来自哪里。

我是否需要升级到新的gcc版本?

  

gcc(x86_64-posix-seh-rev1,由MinGW-W64项目建造)4.9.2

0 个答案:

没有答案