gpt4 book ai didi

c++ - 如何找出指针是否在 PC/Visual C++ 的堆栈上

转载 作者:搜寻专家 更新时间:2023-10-31 00:24:22 25 4
gpt4 key购买 nike

[这是专门针对 PC/Visual C++ 的(尽管任何其他答案都会很有启发性:))]

如何判断指针是否来自堆栈中的对象?例如:

int g_n = 0;

void F()
{
int *pA = &s_n;
ASSERT_IS_POINTER_ON_STACK(pA);
int i = 0;
int *pB = &i;
ASSERT_IS_POINTER_ON_STACK(pB);
}

所以只有第二个断言 (pB) 应该触发。我正在考虑使用一些内联汇编来确定它是否在 SS 段寄存器或类似的东西中。有谁知道是否有任何内置函数或简单的方法来做到这一点?

谢谢!遥控

最佳答案

无论您做什么,它都将非常特定于平台且不可移植。假设您对此表示满意,请继续阅读。如果指针指向堆栈中的某处,它将位于当前堆栈指针 %esp 和堆栈顶部之间。

获取堆栈顶部的一种方法是在 main() 的开头读取它。但是,这有几个问题:- 堆栈顶部实际上略高,因为 C 运行时在进入 main() 之前初始化堆栈- 在 C++ 中,全局对象的构造函数在 main() 之前被调用- 如果您的应用程序是多线程的,则每个线程都有自己独立的堆栈。在这种情况下,您需要一个线程局部变量来描述堆栈的基数

获取当前堆栈指针的一种方法是使用内联汇编:

uint32_t GetESP(void)
{
uint32_t ret;
asm
{
mov esp, ret
}
return ret;
}

当心内联和优化!优化器可能会破坏此代码。

关于c++ - 如何找出指针是否在 PC/Visual C++ 的堆栈上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/338427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com