c++ - 如何检查堆栈是否未损坏

标签 c++ gdb stack-overflow icc

我遇到了代码损坏问题,我需要一种方法来检查本地堆栈是否困惑。我注意到有些东西正在覆盖 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) 捕获标记为“this one”的断言,并检查 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));

我能做什么?使用 icc 和 gdb。

最佳答案

阻止编译器优化代码的一种方法是使用函数并确保该函数不是内联的。

声明:

#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);

关于c++ - 如何检查堆栈是否未损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32899903/

相关文章:

java - 归并排序实现给出了 StackOverflow

c++ - bazel 创建临时文件失败

c - 使用 gdb 进入带有共享库的第 3 方函数

c - 分配 :what can "corrupt" allocated memory in Linux/Qt application (threads involved)?

c - 在变量被释放时中断

java - Cuckoo Hashing Collisions 导致溢出

java - 为什么我得到 StackOverflowError

c++ - 传递本地创建的 lambda 用于回调,然后超出范围

c++ - 在 C++ 中调度异常

c++ - 与字符串文字 C++ 的比较