1 #ifndef TESTS_SAFE_ALLOCATION_TEST_UTILS_H 2 #define TESTS_SAFE_ALLOCATION_TEST_UTILS_H 3 4 #include <libkern/c++/bounded_ptr.h> 5 #include <libkern/c++/safe_allocation.h> 6 #include <darwintest_utils.h> 7 #include <cassert> 8 #include <cstddef> 9 #include <cstdlib> 10 #include <cstring> 11 12 namespace { 13 struct assert_trapping_policy { 14 static void trapassert_trapping_policy15 trap(char const*) 16 { 17 assert(false); 18 } 19 }; 20 21 struct malloc_allocator { 22 static void* allocatemalloc_allocator23 allocate(size_t n) 24 { 25 return std::malloc(n); 26 } 27 28 static void* allocate_zeromalloc_allocator29 allocate_zero(size_t n) 30 { 31 const auto result = malloc_allocator::allocate(n); 32 std::memset(result, 0, n); 33 return result; 34 } 35 36 static void deallocatemalloc_allocator37 deallocate(void* p, size_t n) 38 { 39 std::free(p); 40 } 41 }; 42 43 struct tracking_allocator { 44 static void resettracking_allocator45 reset() 46 { 47 allocated_size = 0; 48 deallocated_size = 0; 49 did_allocate = false; 50 did_deallocate = false; 51 } 52 static std::size_t allocated_size; 53 static std::size_t deallocated_size; 54 static bool did_allocate; 55 static bool did_deallocate; 56 57 static void* allocatetracking_allocator58 allocate(std::size_t n) 59 { 60 did_allocate = true; 61 allocated_size = n; 62 return std::malloc(n); 63 } 64 65 static void* allocate_zerotracking_allocator66 allocate_zero(std::size_t n) 67 { 68 const auto result = tracking_allocator::allocate(n); 69 std::memset(result, 0, n); 70 return result; 71 } 72 73 static void deallocatetracking_allocator74 deallocate(void* p, std::size_t n) 75 { 76 did_deallocate = true; 77 deallocated_size = n; 78 std::free(p); 79 } 80 }; 81 82 std::size_t tracking_allocator::allocated_size = 0; 83 std::size_t tracking_allocator::deallocated_size = 0; 84 bool tracking_allocator::did_allocate = false; 85 bool tracking_allocator::did_deallocate = false; 86 87 struct tracking_trapping_policy { 88 static void resettracking_trapping_policy89 reset() 90 { 91 did_trap = false; 92 } 93 static bool did_trap; 94 static void traptracking_trapping_policy95 trap(char const*) 96 { 97 did_trap = true; 98 } 99 }; 100 bool tracking_trapping_policy::did_trap = false; 101 102 template <typename T> 103 using test_safe_allocation = libkern::safe_allocation<T, malloc_allocator, assert_trapping_policy>; 104 105 template <typename T> 106 using tracked_safe_allocation = libkern::safe_allocation<T, tracking_allocator, assert_trapping_policy>; 107 108 template <typename T> 109 using test_bounded_ptr = libkern::bounded_ptr<T, assert_trapping_policy>; 110 } // end anonymous namespace 111 112 #define CHECK(...) T_ASSERT_TRUE((__VA_ARGS__), # __VA_ARGS__) 113 114 #endif // !TESTS_SAFE_ALLOCATION_TEST_UTILS_H 115