Christoph
Christoph

Reputation: 27985

How to tell if something is heap or stack allocated?

I wonder if there's a way to figure out if a variable is stack or heap allocated.

Consider this:

struct SomeStruct;

fn main() {
    let some_thing = Box::new(SomeStruct);
    println!("{:p}", some_thing);
    foo(&*some_thing);
}

fn foo (bar: &SomeStruct) {
    println!("{:p}", bar);
}

prints

0x1
0x1

And then

struct SomeStruct;

fn main() {
    let some_thing = &SomeStruct;
    println!("{:p}", some_thing);
    foo(some_thing);
}

fn foo (bar: &SomeStruct) {
    println!("{:p}", bar);
}

prints

0x10694dcc0
0x10694dcc0

I can see that the memory address is much shorter for the heap allocated version but I don't know if that's an reliable way to tell the difference. I wonder if there's something like std::foo::is_heap_allocated()

Upvotes: 16

Views: 3655

Answers (1)

Jorge Israel Peña
Jorge Israel Peña

Reputation: 38576

If you're on some POSIX system, you can probably use the sbrk() system call with an argument of 0 to determine the current location of the program break, which is the current limit of the heap. If the address of a given value is less than this address but greater than the start of the heap then it's on the heap. I don't know how you'd check if it's on the stack though, which isn't necessarily automatically the alternative of not being on the heap, since it can also be statically initialized or uninitialized data, though that would probably be obvious to you upon inspection of the code. You can probably use the rbp register on an x86_64 architecture, which should point to the beginning of the current stack frame. That's if you want to check if it's on the current stack frame, or if you want to check if it's anywhere on the stack you can probably use rsp.

I think you can get the start of the heap with the end() system call using the end argument. So the lower bound of the heap would be the result of end(end) and the upper bound would be sbrk(0).

Upvotes: 7

Related Questions