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

jww*_*jww 0 c++ memory gdb this-pointer

我正在编译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();}
Run Code Online (Sandbox Code Playgroud)

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

(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
Run Code Online (Sandbox Code Playgroud)

我已经看到了this=0x00000000 ,如果在一个翻译单元中声明静态类对象中的另一个翻译单位在使用前初始化完成.但我不记得0xfffffffc过去见过.

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

Bas*_*tch 5

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

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

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

另请问关于crypto ++列表 ; 也许报告Crypto ++ bug跟踪器上的错误.使用该库的其他版本或快照进行测试

顺便说一下,我不确定-fsanitize=undefined-fsanitize=address是否应该使用-O3; 我猜他们更适合-O0 -g或者-Og -g

  • @jww FWIW,GCC-5.2刚刚在一小时前发布*.我不知道你在Fedora上使用了什么,但GCC-5.2.1的官方版本似乎不存在. (2认同)