如何检查堆栈是否损坏

How to check that the stack is not corrupted

本文关键字:堆栈 是否 损坏 检查 何检查      更新时间:2023-10-16

我遇到了一个代码损坏的问题,我需要一种方法来检查本地堆栈是否混乱。我注意到有些东西正在覆盖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)捕获标记为"这个"的断言,并检查athis的值,我发现 athis都是伪造值,如0xabcd,而不是0x7FFFE1484580。编译器似乎认为thisconst,因此没有必要多次检查它。我想把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个单词的内存范围。