diff options
author | Chris Robinson <[email protected]> | 2022-05-16 23:08:07 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2022-05-16 23:56:07 -0700 |
commit | a5729d1ff6cc5e04d3ee108e553b45eeaa0fec9e (patch) | |
tree | bc915e54d10ec2fe751b78a41eab2c497c447df7 | |
parent | 3e9597a76829717ff5c6dac718bce7a0f072ba4a (diff) |
Check the container type given to DEF_NEWDEL and DEF_FAM_NEWDEL
There's apparently no way to get the containing class/struct type from a static
member function, and operator new/delete are implicitly static member functions
so the macros to define them need to be told the type to allocate for. This
ensures the type specified matches the containing type.
-rw-r--r-- | common/almalloc.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/common/almalloc.h b/common/almalloc.h index 711d02fd..295107dc 100644 --- a/common/almalloc.h +++ b/common/almalloc.h @@ -29,9 +29,11 @@ void *al_calloc(size_t alignment, size_t size); #define DEF_NEWDEL(T) \ void *operator new(size_t size) \ { \ - void *ret = al_malloc(alignof(T), size); \ - if(!ret) throw std::bad_alloc(); \ - return ret; \ + static_assert(&operator new == &T::operator new, \ + "Incorrect container type specified"); \ + if(void *ret{al_malloc(alignof(T), size)}) \ + return ret; \ + throw std::bad_alloc(); \ } \ void *operator new[](size_t size) { return operator new(size); } \ void operator delete(void *block) noexcept { al_free(block); } \ @@ -50,6 +52,8 @@ enum FamCount : size_t { }; #define DEF_FAM_NEWDEL(T, FamMem) \ static constexpr size_t Sizeof(size_t count) noexcept \ { \ + static_assert(&Sizeof == &T::Sizeof, \ + "Incorrect container type specified"); \ return std::max(decltype(FamMem)::Sizeof(count, offsetof(T, FamMem)), \ sizeof(T)); \ } \ |