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