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

ide*_*n42 7 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 ... */
}
Run Code Online (Sandbox Code Playgroud)

Aja*_*iya 5

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

在Windows上,它可以作为 -

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


void *getStackBase(){
        return NtCurrentTeb()->NtTib.StackBase;
}
void *getStackLimit(){
        return NtCurrentTeb()->NtTib.StackLimit;
}
Run Code Online (Sandbox Code Playgroud)

但请注意,这将给出当前线程的堆栈边界,该变量可能位于另一个线程的堆栈中.在这种情况下,您将不得不迭代线程句柄并与每个堆栈绑定进行比较.您可以使用ThreadFirstThreadNext.

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