我正在编译 Crypto++ 库-O3
。根据 Undefined Behavior Sanitizer (UBsan) 和 Address Sanitizer (Asan),它可以。该程序在-O2
(以及-O3
在许多平台上)运行良好。
根据 Valgrind 的说法,它也可以-O2
。在-O3
,Valgrind 以“您的程序只是试图执行 Valgrind 不理解的指令”而死。我相当肯定这是因为 SSE4 指令和-O3
.
但是,我在某些平台上遇到了崩溃-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
在一个翻译单元中声明的静态类对象是否在初始化完成之前在另一个翻译单元中使用。但我不记得0xfffffffc
以前见过。
有哪些潜在原因this=0xfffffffc
?或者我该如何进一步排除故障?