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.