xref: /llvm-project/compiler-rt/test/sanitizer_common/TestCases/Linux/new_delete_test.cpp (revision c27415ff86a617bdaaf310f6888f084bdf0705ea)
1*c27415ffSFangrui Song // RUN: %clangxx -fno-sized-deallocation -O0 %s -o %t && %run %t
2*c27415ffSFangrui Song // RUN: %clangxx -fsized-deallocation -O0 %s -o %t && %run %t
374989affSNico Weber 
474989affSNico Weber // ubsan does not intercept new/delete.
574989affSNico Weber // UNSUPPORTED: ubsan
674989affSNico Weber 
774989affSNico Weber // Check that all new/delete variants are defined and work with supported
874989affSNico Weber // sanitizers. Sanitizer-specific failure modes tests are supposed to go to
9a1e7e401SKazuaki Ishizaki // the particular sanitizer's test suites.
1074989affSNico Weber 
1174989affSNico Weber #include <cstddef>
1274989affSNico Weber 
1374989affSNico Weber // Define all new/delete to do not depend on the version provided by the
1474989affSNico Weber // platform. The implementation is provided by the sanitizer anyway.
1574989affSNico Weber 
1674989affSNico Weber namespace std {
1774989affSNico Weber struct nothrow_t {};
1874989affSNico Weber static const nothrow_t nothrow;
1974989affSNico Weber enum class align_val_t : size_t {};
2074989affSNico Weber }  // namespace std
2174989affSNico Weber 
2274989affSNico Weber void *operator new(size_t);
2374989affSNico Weber void *operator new[](size_t);
2474989affSNico Weber void *operator new(size_t, std::nothrow_t const&);
2574989affSNico Weber void *operator new[](size_t, std::nothrow_t const&);
2674989affSNico Weber void *operator new(size_t, std::align_val_t);
2774989affSNico Weber void *operator new[](size_t, std::align_val_t);
2874989affSNico Weber void *operator new(size_t, std::align_val_t, std::nothrow_t const&);
2974989affSNico Weber void *operator new[](size_t, std::align_val_t, std::nothrow_t const&);
3074989affSNico Weber 
3174989affSNico Weber void operator delete(void*) throw();
3274989affSNico Weber void operator delete[](void*) throw();
3374989affSNico Weber void operator delete(void*, std::nothrow_t const&);
3474989affSNico Weber void operator delete[](void*, std::nothrow_t const&);
3574989affSNico Weber void operator delete(void*, size_t) throw();
3674989affSNico Weber void operator delete[](void*, size_t) throw();
3774989affSNico Weber void operator delete(void*, std::align_val_t) throw();
3874989affSNico Weber void operator delete[](void*, std::align_val_t) throw();
3974989affSNico Weber void operator delete(void*, std::align_val_t, std::nothrow_t const&);
4074989affSNico Weber void operator delete[](void*, std::align_val_t, std::nothrow_t const&);
4174989affSNico Weber void operator delete(void*, size_t, std::align_val_t) throw();
4274989affSNico Weber void operator delete[](void*, size_t, std::align_val_t) throw();
4374989affSNico Weber 
4474989affSNico Weber 
4574989affSNico Weber template<typename T>
4674989affSNico Weber inline T* break_optimization(T *arg) {
4774989affSNico Weber   __asm__ __volatile__("" : : "r" (arg) : "memory");
4874989affSNico Weber   return arg;
4974989affSNico Weber }
5074989affSNico Weber 
5174989affSNico Weber 
5274989affSNico Weber struct S12 { int a, b, c; };
5374989affSNico Weber struct alignas(128) S12_128 { int a, b, c; };
5474989affSNico Weber struct alignas(256) S12_256 { int a, b, c; };
5574989affSNico Weber struct alignas(512) S1024_512 { char a[1024]; };
5674989affSNico Weber struct alignas(1024) S1024_1024 { char a[1024]; };
5774989affSNico Weber 
5874989affSNico Weber 
5974989affSNico Weber int main(int argc, char **argv) {
6074989affSNico Weber   delete break_optimization(new S12);
6174989affSNico Weber   operator delete(break_optimization(new S12), std::nothrow);
6274989affSNico Weber   delete [] break_optimization(new S12[100]);
6374989affSNico Weber   operator delete[](break_optimization(new S12[100]), std::nothrow);
6474989affSNico Weber 
6574989affSNico Weber   delete break_optimization(new S12_128);
6674989affSNico Weber   operator delete(break_optimization(new S12_128),
6774989affSNico Weber                   std::align_val_t(alignof(S12_128)));
6874989affSNico Weber   operator delete(break_optimization(new S12_128),
6974989affSNico Weber                   std::align_val_t(alignof(S12_128)), std::nothrow);
7074989affSNico Weber   operator delete(break_optimization(new S12_128), sizeof(S12_128),
7174989affSNico Weber                   std::align_val_t(alignof(S12_128)));
7274989affSNico Weber 
7374989affSNico Weber   delete [] break_optimization(new S12_128[100]);
7474989affSNico Weber   operator delete[](break_optimization(new S12_128[100]),
7574989affSNico Weber                     std::align_val_t(alignof(S12_128)));
7674989affSNico Weber   operator delete[](break_optimization(new S12_128[100]),
7774989affSNico Weber                     std::align_val_t(alignof(S12_128)), std::nothrow);
7874989affSNico Weber   operator delete[](break_optimization(new S12_128[100]), sizeof(S12_128[100]),
7974989affSNico Weber                     std::align_val_t(alignof(S12_128)));
8074989affSNico Weber }
81