c - 如何检测内存是否来自堆栈? (不是堆或静态变量)

标签 c stack-memory

虽然没有官方支持的方法来做到这一点。 有没有办法(在现代系统上)检测指针是否来自堆栈(例如调用者的堆栈)。

即使这不会作为实际代码逻辑的一部分工作,它也可以帮助避免可以检测到它的配置中的错误,例如:

void my_function(void *arg) {
    /* Only some configurations can do this (depending on compiler & arch). */
#if THE_MOONS_ALIGN
    assert(not_stack_memory(arg));
#endif

   /* ... actual logic ... */
}

最佳答案

由于堆栈和内存布局不在 C 标准中,因此显然没有可移植的方法来确定堆栈位置。 但是,如果您正在为操作系统管理的系统进行编译,则操作系统很有可能会提供查询堆栈边界的 API。

在 Windows 上它可以完成为 -

#include <windows.h>
struct _TEB {
        NT_TIB NtTib;
};


void *getStackBase(){
        return NtCurrentTeb()->NtTib.StackBase;
}
void *getStackLimit(){
        return NtCurrentTeb()->NtTib.StackLimit;
}

但请注意,这将给出当前线程的栈边界,该变量可能位于另一个线程的栈上。在那种情况下,您将不得不遍历线程句柄并与每个堆栈绑定(bind)进行比较。 您可以使用 ThreadFirstThreadNext为了那个原因。

在 Linux 上,您可以阅读 /proc/<pid>/maps文件并查找 [stack]条目。

关于c - 如何检测内存是否来自堆栈? (不是堆或静态变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46314732/

相关文章:

c - C 源代码的标记化输出

c++ - 确定模板参数是否为指针

java - 堆 vs 堆栈 vs 永久空间

c - c中函数中的多维数组

c++ - 读取文件描述符挂起

c - 使用 libavcodec 的 mpegts 容器中的原始 H264 帧

c - 为什么C的sizeof的返回值类型会随上下文变化?

Java 枚举...它们是在哪里创建的?

c++ - 如何查找变量是在堆栈还是堆中分配?

java - Stack 和 Heap 是否都存在于您的系统 RAM 中?