17.10.2017 20:27, Biotronic пишет:
module stackCheck;

private size_t stackStart;
enum size_t pageSize = 0x1000;

static this() {
     import core.stdc.stdlib : alloca;
     stackStart = cast(size_t)alloca(size_t.sizeof) & ~(pageSize-1);
}

bool onStack(void* p) {
     size_t end = (cast(size_t)&p & ~(pageSize-1)) + pageSize;
     size_t pp = cast(size_t)p;

     if (end > stackStart) {
         return pp >= stackStart && pp <= end;
     } else {
         return pp <= stackStart && pp >= end;
     }
}

bool onStack(T)(ref T p) {
     return (&p).onStack;
}

unittest {
     int n;
     int* p = new int;

     assert(n.onStack);
     assert(!p.onStack);
}

Thanks! Your solution not only works but is portable also.

Reply via email to