我一直在编译一个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