此指针为0xfffffffc,潜在原因

This pointer is 0xfffffffc, potential causes?

本文关键字:指针 0xfffffffc      更新时间:2023-10-16

我正在编译-O3的crypto++库。根据未定义行为消毒程序(UBsan)和地址消毒程序(Asan),它是OK的。程序在-O2下运行良好(在许多平台上是-O3)。

根据-O2下的Valgrind也是OK的。在-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的潜在原因是什么?或者如何进一步排除故障?

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

使用gdbbtbacktrace命令来了解发生了什么。我想问题出在来电者(或来电者等)身上。

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

也询问crypto++列表;或者在Crypto++ bug跟踪器上报告这个bug。使用该库的其他版本或快照进行测试

BTW,我不确定-fsanitize=undefined-fsanitize=address应该与-O3一起使用;我想他们更适合-O0 -g-Og -g