我遇到了代码损坏问题,我需要一种方法来检查本地堆栈是否困惑。我注意到有些东西正在覆盖 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”的断言,并检查 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));
我能做什么?使用 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/