我正在-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
有哪些潜在原因?或者我该如何进一步排除故障?
答案 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