1

我正在编译 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?或者我该如何进一步排除故障?

4

1 回答 1

5

如果你有一个 32 位机器0xfffffffc((int*)nullptr)-1. 因此,也许您正在获取 nil 指针的前一个元素(例如,错误地使用了某些反向迭代器等...)

使用btorbacktrace命令gdb了解发生了什么。我想问题出在调用者(或其调用者等...)

也尝试一些其他编译器(例如一些旧版本的GCC和几个版本的Clang/LLVM ....)。您可能会有一些其他工具没有检测到的未定义行为。您需要了解该错误是否在 Crypto++ 内部(或者可能,但不太可能,它在 GCC 本身内部;然后在GCC bugzilla上报告一个错误....)。如果您怀疑编译器,请传递-S -fverbose-asm -fdump-tree-all -O3g++以了解 GCC 正在做什么......(这将转储数百个文件,包括生成的.s汇编代码)。

还要询问加密++列表;也许报告 Crypto++ 错误跟踪器上的错误。使用该库的其他版本或快照进行测试

顺便说一句,我不确定-fsanitize=undefined或者-fsanitize=address应该与-O3;一起使用。我猜他们更适合搭配-O0 -gor-Og -g

于 2015-07-16T06:48:22.127 回答