此指针为0xfffffffc,潜在原因
This pointer is 0xfffffffc, potential causes?
我正在编译-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指针的前一个元素(例如错误地使用一些反向迭代器等)
使用gdb
的bt
或backtrace
命令来了解发生了什么。我想问题出在来电者(或来电者等)身上。
也尝试一些其他编译器(例如一些旧版本的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
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 此指针为0xfffffffc,潜在原因