1f9e0df07SNico Weber // Test basic new functionality. 2c990d56dSVitaly Buka // RUN: %clangxx_hwasan -std=c++17 %s -o %t 3f9e0df07SNico Weber // RUN: %run %t 4f9e0df07SNico Weber 5c990d56dSVitaly Buka #include <cassert> 6c990d56dSVitaly Buka #include <cstdint> 7c990d56dSVitaly Buka #include <cstdlib> 8c990d56dSVitaly Buka #include <new> 9a908c535SNico Weber #include <sanitizer/allocator_interface.h> 10c990d56dSVitaly Buka #include <sanitizer/hwasan_interface.h> 11f9e0df07SNico Weber main()12f9e0df07SNico Weberint main() { 13f9e0df07SNico Weber __hwasan_enable_allocator_tagging(); 14f9e0df07SNico Weber 15f9e0df07SNico Weber size_t volatile n = 0; 16f9e0df07SNico Weber char *a1 = new char[n]; 17f9e0df07SNico Weber assert(a1 != nullptr); 18f9e0df07SNico Weber assert(__sanitizer_get_allocated_size(a1) == 0); 19f9e0df07SNico Weber delete[] a1; 20c990d56dSVitaly Buka 21*3e6cfc63SHans Wennborg #if defined(__cpp_aligned_new) && \ 22*3e6cfc63SHans Wennborg (!defined(__GLIBCXX__) || \ 23*3e6cfc63SHans Wennborg (defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE >= 7)) 24c990d56dSVitaly Buka // Aligned new/delete 25c990d56dSVitaly Buka constexpr auto kAlign = std::align_val_t{8}; 26c990d56dSVitaly Buka void *a2 = ::operator new(4, kAlign); 27c990d56dSVitaly Buka assert(a2 != nullptr); 28c990d56dSVitaly Buka assert(reinterpret_cast<uintptr_t>(a2) % static_cast<uintptr_t>(kAlign) == 0); 29c990d56dSVitaly Buka assert(__sanitizer_get_allocated_size(a2) >= 4); 30c990d56dSVitaly Buka ::operator delete(a2, kAlign); 31c990d56dSVitaly Buka #endif 32f9e0df07SNico Weber } 33