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.
