如何检查堆栈是否损坏
How to check that the stack is not corrupted
我遇到了一个代码损坏的问题,我需要一种方法来检查本地堆栈是否混乱。我注意到有些东西正在覆盖this
变量(好吧,这就是gdb似乎显示的)。它将this
指针显示为0x1959或其他一些看似错误的小16位值),所以我用这个定义
assert(VALID_RAM_MEMORY(this))
#define VALID_RAM_POINTER(x) (( (uint64_t)x & 0xFFFFFFFF00000000) == 0x7fff00000000ULL)
(所有的指针在我的代码地址看起来像,即从7FFF开始…)。然而,编译器似乎已经优化了这种签出。例如,如果我有
void* a = suspicious_call();
assert(VALID_RAM_POINTER(this));
assert(VALID_RAM_POINTER(a)); //<<-- this one
assert(VALID_RAM_POINTER(this));
我发现调试器(gdb)捕获标记为"这个"的断言,并检查a
和this
的值,我发现 a
和this
都是伪造值,如0xabcd,而不是0x7FFFE1484580。编译器似乎认为this
是const
,因此没有必要多次检查它。我想把this
作为volatile
,但这是不可能的(我试过)。你不能取this
的地址(它不是左值)。
1): warning #191: type qualifier is meaningless on cast type
assert(VALID_MEM_POINTER((volatile decltype(this))this));
我能做什么?
阻止编译器优化代码的一种方法是使用函数,并确保该函数不是内联的。
声明:
#ifdef _DEBUG
void check_valid_ram_pointer(const void* ptr);
#else
#define check_valid_ram_pointer(x)
#endif
实现,在.cpp文件中:
#define VALID_RAM_POINTER(x) (( (uint64_t)x & 0xFFFFFFFF00000000) == 0x7fff00000000ULL)
#ifdef _DEBUG
void check_valid_ram_pointer(const void* ptr)
{
assert(VALID_RAM_POINTER(ptr));
}
#endif
然后使用函数:
void* a = suspicious_call();
check_valid_ram_pointer(this);
check_valid_ram_pointer(a);
check_valid_ram_pointer(this);
在拨打可疑电话之前。获取函数第一个参数的地址。,声明的函数的最后一个局部变量。这是堆栈为这个指针分配的范围+ 2个额外的地址空间&返回地址。使用调试器,您可以在调用&打完电话之后。你也可以找到这个指针的内容,如果你调查(+-)2个单词的内存范围。
相关文章:
- 堆栈和队列是否像C++中的数组一样传递?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 是否可以检查悬挂光纤的调用堆栈?
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 是否可以访问代码中的调用堆栈?
- 堆栈变量超出范围时是否解除分配?
- 唯一指针是否在堆或堆栈上分配内存?
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 对象向量是否在堆或堆栈上分配C++?
- 有什么方法可以检测我的类的对象是否在堆栈上创建
- 是否可以检查存储在堆栈上的单词是否是回文,而C++中没有任何附加数据结构
- 虚拟功能是否不太可能导致堆栈溢出
- 在我的实现中使用堆栈是否正确?
- std :: vector用作堆栈和std :: stack之间是否存在任何复杂性差异
- 查看使用堆栈是否相等的两个字符串
- 如何在C++中检查两个堆栈是否相同
- 如果 EBP 帧指针为 NULL,堆栈是否损坏
- 如何检查堆栈是否损坏