这个指针是0xfffffffc,潜在的原因是什么?

时间:2015-07-16 06:43:06

标签: c++ memory gdb this-pointer

我正在-O3编译Crypto ++库。根据Undefined Behavior Sanitizer(UBsan)和Address Sanitizer(Asan),它可以。该程序在-O2(以及许多平台上的-O3)上正常运行。

根据Valgrind在-O2下的说法也可以。在-O3,Valgrind死于“你的程序只是试图执行Valgrind不理解的指令”。我很确定这是因为-O3的SSE4指令和矢量化。

但是,我在-O3的某些平台上遇到了崩溃。这台特殊的机器是Fedora 22 i686,它有GCC 5.2.1。相关框架显示this=0xfffffffc

Program received signal SIGSEGV, Segmentation fault.
0x0807be29 in CryptoPP::DL_GroupParameters_IntegerBased::GetEncodedElementSize
    (this=0xfffffffc, reversible=0x1) at gfpcrypt.h:55
55      unsigned int GetEncodedElementSize(bool reversible) const {return GetModulus().ByteCount();}

我能说的最好,那个地址周围没有任何东西:

(gdb) info shared
From        To          Syms Read   Shared Object Library
0xb7fdd860  0xb7ff6b30  Yes (*)     /lib/ld-linux.so.2
0xb7eb63d0  0xb7f7a344  Yes (*)     /lib/libstdc++.so.6
0xb7e005f0  0xb7e32bd8  Yes (*)     /lib/libm.so.6
0xb7951060  0xb7980cc4  Yes (*)     /lib/libubsan.so.0
0xb7932090  0xb7948001  Yes (*)     /lib/libgcc_s.so.1
0xb7916840  0xb79238d1  Yes (*)     /lib/libpthread.so.0
0xb775d3f0  0xb78a0b6b  Yes (*)     /lib/libc.so.6
0xb7741a90  0xb7742a31  Yes (*)     /lib/libdl.so.2

我见过this=0x00000000 if 在初始化完成之前,在一个翻译单元中声明的静态类对象在另一个翻译单元中使用。但我不记得过去曾见过0xfffffffc

this=0xfffffffc有哪些潜在原因?或者我该如何进一步排除故障?

1 个答案:

答案 0 :(得分:5)

如果你有32位机器0xfffffffc((int*)nullptr)-1。所以也许你正在使用nil指针的前一个元素(例如错误地使用一些反向迭代器等等......)

使用bt的{​​{1}}或backtrace命令了解发生的情况。我猜麻烦在于呼叫者(或其呼叫者等)......

还尝试其他一些编译器(例如GCC的某些旧版本和Clang/LLVM的几个版本....)。您可以使用其他工具未检测到的undefined behavior。你需要了解这个bug是否在Crypto ++中(或许,但非常不可能,它在GCC内部;然后在GCC bugzilla报告错误....)。如果您怀疑编译器,请将gdb传递给-S -fverbose-asm -fdump-tree-all -O3以了解GCC正在做什么....(这将转储数百个文件,包括生成的g++汇编代码)。

也问crypto++ lists;也许报告Crypto ++ bug跟踪器上的错误。使用该库的其他版本或快照进行测试

顺便说一句,我不确定.s-fsanitize=undefined是否应与-fsanitize=address一起使用;我想它们更适合-O3-O0 -g