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?或者我该如何进一步排除故障?
如果你有一个32位的机器0xfffffffc是((int*)nullptr)-1.所以也许你正在使用nil指针的前一个元素(例如错误地使用一些反向迭代器等等......)
使用bt或backtrace命令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
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |