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