78 lines · cpp
1/// From sanitizer_common/TestCases/Linux/new_delete_test.cpp2// RUN: %clangxx_nsan -fno-sized-deallocation -O0 %s -o %t && %run %t3// RUN: %clangxx_nsan -fsized-deallocation -O0 %s -o %t && %run %t4 5#include <cstddef>6 7namespace std {8struct nothrow_t {};9static const nothrow_t nothrow;10enum class align_val_t : size_t {};11} // namespace std12 13void *operator new(size_t);14void *operator new[](size_t);15void *operator new(size_t, std::nothrow_t const &);16void *operator new[](size_t, std::nothrow_t const &);17void *operator new(size_t, std::align_val_t);18void *operator new[](size_t, std::align_val_t);19void *operator new(size_t, std::align_val_t, std::nothrow_t const &);20void *operator new[](size_t, std::align_val_t, std::nothrow_t const &);21 22void operator delete(void *) throw();23void operator delete[](void *) throw();24void operator delete(void *, std::nothrow_t const &);25void operator delete[](void *, std::nothrow_t const &);26void operator delete(void *, size_t) throw();27void operator delete[](void *, size_t) throw();28void operator delete(void *, std::align_val_t) throw();29void operator delete[](void *, std::align_val_t) throw();30void operator delete(void *, std::align_val_t, std::nothrow_t const &);31void operator delete[](void *, std::align_val_t, std::nothrow_t const &);32void operator delete(void *, size_t, std::align_val_t) throw();33void operator delete[](void *, size_t, std::align_val_t) throw();34 35template <typename T> inline T *break_optimization(T *arg) {36 __asm__ __volatile__("" : : "r"(arg) : "memory");37 return arg;38}39 40struct S12 {41 int a, b, c;42};43struct alignas(128) S12_128 {44 int a, b, c;45};46struct alignas(256) S12_256 {47 int a, b, c;48};49struct alignas(512) S1024_512 {50 char a[1024];51};52struct alignas(1024) S1024_1024 {53 char a[1024];54};55 56int main(int argc, char **argv) {57 delete break_optimization(new S12);58 operator delete(break_optimization(new S12), std::nothrow);59 delete[] break_optimization(new S12[100]);60 operator delete[](break_optimization(new S12[100]), std::nothrow);61 62 delete break_optimization(new S12_128);63 operator delete(break_optimization(new S12_128),64 std::align_val_t(alignof(S12_128)));65 operator delete(break_optimization(new S12_128),66 std::align_val_t(alignof(S12_128)), std::nothrow);67 operator delete(break_optimization(new S12_128), sizeof(S12_128),68 std::align_val_t(alignof(S12_128)));69 70 delete[] break_optimization(new S12_128[100]);71 operator delete[](break_optimization(new S12_128[100]),72 std::align_val_t(alignof(S12_128)));73 operator delete[](break_optimization(new S12_128[100]),74 std::align_val_t(alignof(S12_128)), std::nothrow);75 operator delete[](break_optimization(new S12_128[100]), sizeof(S12_128[100]),76 std::align_val_t(alignof(S12_128)));77}78