brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.9 KiB · f530d9c Raw
146 lines · cpp
1// Test basic new functionality.2// RUN: %clangxx_hwasan -std=c++17 %s -o %t3// RUN: %run %t4 5#include <cassert>6#include <cstdint>7#include <cstdlib>8#include <new>9#include <sanitizer/allocator_interface.h>10#include <sanitizer/hwasan_interface.h>11 12void operator_new_delete(size_t size) {13	void *alloc = operator new(size);14	assert(alloc != nullptr);15	assert(__sanitizer_get_allocated_size(alloc) == size);16	operator delete(alloc);17 18	alloc = operator new(size);19	assert(alloc != nullptr);20	assert(__sanitizer_get_allocated_size(alloc) == size);21	operator delete(alloc, size);22}23 24void operator_new_delete_array(size_t size) {25	void *alloc = operator new[](size);26	assert(alloc != nullptr);27	assert(__sanitizer_get_allocated_size(alloc) == size);28	operator delete[](alloc);29 30	alloc = operator new[](size);31	assert(alloc != nullptr);32	assert(__sanitizer_get_allocated_size(alloc) == size);33	operator delete[](alloc, size);34}35 36void operator_new_delete(size_t size, std::align_val_t align) {37	void *alloc = operator new(size, align);38	assert(alloc != nullptr);39  assert(reinterpret_cast<uintptr_t>(alloc) % static_cast<uintptr_t>(align) == 0);40	assert(__sanitizer_get_allocated_size(alloc) >= size);41	operator delete(alloc, align);42 43	alloc = operator new(size, align);44	assert(alloc != nullptr);45  assert(reinterpret_cast<uintptr_t>(alloc) % static_cast<uintptr_t>(align) == 0);46	assert(__sanitizer_get_allocated_size(alloc) >= size);47	operator delete(alloc, size, align);48}49 50void operator_new_delete_array(size_t size, std::align_val_t align) {51	void *alloc = operator new[](size, align);52	assert(alloc != nullptr);53  assert(reinterpret_cast<uintptr_t>(alloc) % static_cast<uintptr_t>(align) == 0);54	assert(__sanitizer_get_allocated_size(alloc) >= size);55	operator delete[](alloc, align);56 57	alloc = operator new[](size, align);58	assert(alloc != nullptr);59  assert(reinterpret_cast<uintptr_t>(alloc) % static_cast<uintptr_t>(align) == 0);60	assert(__sanitizer_get_allocated_size(alloc) >= size);61	operator delete[](alloc, size, align);62}63 64void operator_new_delete(size_t size, const std::nothrow_t &tag) {65	void *alloc = operator new(size, tag);66	assert(alloc != nullptr);67	assert(__sanitizer_get_allocated_size(alloc) == size);68	operator delete(alloc, tag);69}70 71void operator_new_delete_array(size_t size, const std::nothrow_t &tag) {72	void *alloc = operator new[](size, tag);73	assert(alloc != nullptr);74	assert(__sanitizer_get_allocated_size(alloc) == size);75	operator delete[](alloc, tag);76}77 78void operator_new_delete(size_t size, std::align_val_t align, const std::nothrow_t &tag) {79	void *alloc = operator new(size, align, tag);80	assert(alloc != nullptr);81  assert(reinterpret_cast<uintptr_t>(alloc) % static_cast<uintptr_t>(align) == 0);82	assert(__sanitizer_get_allocated_size(alloc) >= size);83	operator delete(alloc, align, tag);84}85 86void operator_new_delete_array(size_t size, std::align_val_t align, const std::nothrow_t &tag) {87	void *alloc = operator new[](size, align, tag);88	assert(alloc != nullptr);89  assert(reinterpret_cast<uintptr_t>(alloc) % static_cast<uintptr_t>(align) == 0);90	assert(__sanitizer_get_allocated_size(alloc) >= size);91	operator delete[](alloc, align, tag);92}93 94void operator_new_delete(size_t size, void *ptr) {95	void *alloc = operator new(size, ptr);96	assert(alloc == ptr);97	operator delete(alloc, ptr);98}99 100void operator_new_delete_array(size_t size, void *ptr) {101	void *alloc = operator new[](size, ptr);102	assert(alloc == ptr);103	operator delete[](alloc, ptr);104}105 106int main() {107  __hwasan_enable_allocator_tagging();108 109  size_t volatile n = 0;110  char *a1 = new char[n];111  assert(a1 != nullptr);112  assert(__sanitizer_get_allocated_size(a1) == 1);113  delete[] a1;114 115	constexpr size_t kSize = 8;116	operator_new_delete(kSize);117	operator_new_delete_array(kSize);118	operator_new_delete(kSize, std::nothrow);119	operator_new_delete_array(kSize, std::nothrow);120 121	char buffer[kSize];122	operator_new_delete(kSize, buffer);123	operator_new_delete_array(kSize, buffer);124 125#if defined(__cpp_aligned_new) &&                                              \126    (!defined(__GLIBCXX__) ||                                                  \127     (defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE >= 7))128  // Aligned new/delete129  constexpr auto kAlign = std::align_val_t{8};130  void *a2 = ::operator new(4, kAlign);131  assert(a2 != nullptr);132  assert(reinterpret_cast<uintptr_t>(a2) % static_cast<uintptr_t>(kAlign) == 0);133  assert(__sanitizer_get_allocated_size(a2) >= 4);134  ::operator delete(a2, kAlign);135 136	operator_new_delete(kSize, std::align_val_t{kSize});137	operator_new_delete_array(kSize, std::align_val_t{kSize});138	operator_new_delete(kSize, std::align_val_t{kSize * 2});139	operator_new_delete_array(kSize, std::align_val_t{kSize * 2});140	operator_new_delete(kSize, std::align_val_t{kSize}, std::nothrow);141	operator_new_delete_array(kSize, std::align_val_t{kSize}, std::nothrow);142	operator_new_delete(kSize, std::align_val_t{kSize * 2}, std::nothrow);143	operator_new_delete_array(kSize, std::align_val_t{kSize * 2}, std::nothrow);144#endif145}146