1*bb611c8fSApple OSS Distributions // 2*bb611c8fSApple OSS Distributions // Tests for 3*bb611c8fSApple OSS Distributions // T& operator[](std::ptrdiff_t n) const; 4*bb611c8fSApple OSS Distributions // 5*bb611c8fSApple OSS Distributions 6*bb611c8fSApple OSS Distributions #include <libkern/c++/bounded_ptr.h> 7*bb611c8fSApple OSS Distributions #include <array> 8*bb611c8fSApple OSS Distributions #include <cstddef> 9*bb611c8fSApple OSS Distributions #include <darwintest.h> 10*bb611c8fSApple OSS Distributions #include <darwintest_utils.h> 11*bb611c8fSApple OSS Distributions #include "test_utils.h" 12*bb611c8fSApple OSS Distributions 13*bb611c8fSApple OSS Distributions #define _assert(...) T_ASSERT_TRUE((__VA_ARGS__), # __VA_ARGS__) 14*bb611c8fSApple OSS Distributions 15*bb611c8fSApple OSS Distributions struct T { 16*bb611c8fSApple OSS Distributions int i; 17*bb611c8fSApple OSS Distributions friend constexpr bool 18*bb611c8fSApple OSS Distributions operator==(T const& a, T const& b) 19*bb611c8fSApple OSS Distributions { 20*bb611c8fSApple OSS Distributions return a.i == b.i; 21*bb611c8fSApple OSS Distributions } 22*bb611c8fSApple OSS Distributions }; 23*bb611c8fSApple OSS Distributions 24*bb611c8fSApple OSS Distributions namespace { 25*bb611c8fSApple OSS Distributions struct tracking_policy { 26*bb611c8fSApple OSS Distributions static bool did_trap; 27*bb611c8fSApple OSS Distributions static void 28*bb611c8fSApple OSS Distributions trap(char const*) 29*bb611c8fSApple OSS Distributions { 30*bb611c8fSApple OSS Distributions did_trap = true; 31*bb611c8fSApple OSS Distributions } 32*bb611c8fSApple OSS Distributions }; 33*bb611c8fSApple OSS Distributions bool tracking_policy::did_trap = false; 34*bb611c8fSApple OSS Distributions } 35*bb611c8fSApple OSS Distributions 36*bb611c8fSApple OSS Distributions template <typename T, typename QualT> 37*bb611c8fSApple OSS Distributions static void 38*bb611c8fSApple OSS Distributions tests() 39*bb611c8fSApple OSS Distributions { 40*bb611c8fSApple OSS Distributions std::array<T, 5> array = {T{0}, T{1}, T{2}, T{3}, T{4}}; 41*bb611c8fSApple OSS Distributions 42*bb611c8fSApple OSS Distributions { 43*bb611c8fSApple OSS Distributions // T{0} T{1} T{2} T{3} T{4} <one-past-last> 44*bb611c8fSApple OSS Distributions // ^ ^ 45*bb611c8fSApple OSS Distributions // | | 46*bb611c8fSApple OSS Distributions // begin, ptr end 47*bb611c8fSApple OSS Distributions test_bounded_ptr<QualT> ptr(array.begin() + 0, array.begin(), array.end()); 48*bb611c8fSApple OSS Distributions QualT& ref0 = ptr[0]; 49*bb611c8fSApple OSS Distributions _assert(&ref0 == &array[0]); 50*bb611c8fSApple OSS Distributions 51*bb611c8fSApple OSS Distributions QualT& ref1 = ptr[1]; 52*bb611c8fSApple OSS Distributions _assert(&ref1 == &array[1]); 53*bb611c8fSApple OSS Distributions 54*bb611c8fSApple OSS Distributions QualT& ref2 = ptr[2]; 55*bb611c8fSApple OSS Distributions _assert(&ref2 == &array[2]); 56*bb611c8fSApple OSS Distributions 57*bb611c8fSApple OSS Distributions QualT& ref3 = ptr[3]; 58*bb611c8fSApple OSS Distributions _assert(&ref3 == &array[3]); 59*bb611c8fSApple OSS Distributions 60*bb611c8fSApple OSS Distributions QualT& ref4 = ptr[4]; 61*bb611c8fSApple OSS Distributions _assert(&ref4 == &array[4]); 62*bb611c8fSApple OSS Distributions } 63*bb611c8fSApple OSS Distributions { 64*bb611c8fSApple OSS Distributions // T{0} T{1} T{2} T{3} T{4} <one-past-last> 65*bb611c8fSApple OSS Distributions // ^ ^ ^ 66*bb611c8fSApple OSS Distributions // | | | 67*bb611c8fSApple OSS Distributions // begin ptr end 68*bb611c8fSApple OSS Distributions test_bounded_ptr<QualT> ptr(array.begin() + 1, array.begin(), array.end()); 69*bb611c8fSApple OSS Distributions QualT& ref0 = ptr[-1]; 70*bb611c8fSApple OSS Distributions _assert(&ref0 == &array[0]); 71*bb611c8fSApple OSS Distributions 72*bb611c8fSApple OSS Distributions QualT& ref1 = ptr[0]; 73*bb611c8fSApple OSS Distributions _assert(&ref1 == &array[1]); 74*bb611c8fSApple OSS Distributions 75*bb611c8fSApple OSS Distributions QualT& ref2 = ptr[1]; 76*bb611c8fSApple OSS Distributions _assert(&ref2 == &array[2]); 77*bb611c8fSApple OSS Distributions 78*bb611c8fSApple OSS Distributions QualT& ref3 = ptr[2]; 79*bb611c8fSApple OSS Distributions _assert(&ref3 == &array[3]); 80*bb611c8fSApple OSS Distributions 81*bb611c8fSApple OSS Distributions QualT& ref4 = ptr[3]; 82*bb611c8fSApple OSS Distributions _assert(&ref4 == &array[4]); 83*bb611c8fSApple OSS Distributions } 84*bb611c8fSApple OSS Distributions { 85*bb611c8fSApple OSS Distributions // T{0} T{1} T{2} T{3} T{4} <one-past-last> 86*bb611c8fSApple OSS Distributions // ^ ^ ^ 87*bb611c8fSApple OSS Distributions // | | | 88*bb611c8fSApple OSS Distributions // begin ptr end 89*bb611c8fSApple OSS Distributions test_bounded_ptr<QualT> ptr(array.begin() + 2, array.begin(), array.end()); 90*bb611c8fSApple OSS Distributions QualT& ref0 = ptr[-2]; 91*bb611c8fSApple OSS Distributions _assert(&ref0 == &array[0]); 92*bb611c8fSApple OSS Distributions 93*bb611c8fSApple OSS Distributions QualT& ref1 = ptr[-1]; 94*bb611c8fSApple OSS Distributions _assert(&ref1 == &array[1]); 95*bb611c8fSApple OSS Distributions 96*bb611c8fSApple OSS Distributions QualT& ref2 = ptr[0]; 97*bb611c8fSApple OSS Distributions _assert(&ref2 == &array[2]); 98*bb611c8fSApple OSS Distributions 99*bb611c8fSApple OSS Distributions QualT& ref3 = ptr[1]; 100*bb611c8fSApple OSS Distributions _assert(&ref3 == &array[3]); 101*bb611c8fSApple OSS Distributions 102*bb611c8fSApple OSS Distributions QualT& ref4 = ptr[2]; 103*bb611c8fSApple OSS Distributions _assert(&ref4 == &array[4]); 104*bb611c8fSApple OSS Distributions } 105*bb611c8fSApple OSS Distributions { 106*bb611c8fSApple OSS Distributions // T{0} T{1} T{2} T{3} T{4} <one-past-last> 107*bb611c8fSApple OSS Distributions // ^ ^ ^ 108*bb611c8fSApple OSS Distributions // | | | 109*bb611c8fSApple OSS Distributions // begin ptr end 110*bb611c8fSApple OSS Distributions test_bounded_ptr<QualT> ptr(array.begin() + 4, array.begin(), array.end()); 111*bb611c8fSApple OSS Distributions QualT& ref0 = ptr[-4]; 112*bb611c8fSApple OSS Distributions _assert(&ref0 == &array[0]); 113*bb611c8fSApple OSS Distributions 114*bb611c8fSApple OSS Distributions QualT& ref1 = ptr[-3]; 115*bb611c8fSApple OSS Distributions _assert(&ref1 == &array[1]); 116*bb611c8fSApple OSS Distributions 117*bb611c8fSApple OSS Distributions QualT& ref2 = ptr[-2]; 118*bb611c8fSApple OSS Distributions _assert(&ref2 == &array[2]); 119*bb611c8fSApple OSS Distributions 120*bb611c8fSApple OSS Distributions QualT& ref3 = ptr[-1]; 121*bb611c8fSApple OSS Distributions _assert(&ref3 == &array[3]); 122*bb611c8fSApple OSS Distributions 123*bb611c8fSApple OSS Distributions QualT& ref4 = ptr[0]; 124*bb611c8fSApple OSS Distributions _assert(&ref4 == &array[4]); 125*bb611c8fSApple OSS Distributions } 126*bb611c8fSApple OSS Distributions { 127*bb611c8fSApple OSS Distributions // T{0} T{1} T{2} T{3} T{4} <one-past-last> 128*bb611c8fSApple OSS Distributions // ^ ^ 129*bb611c8fSApple OSS Distributions // | | 130*bb611c8fSApple OSS Distributions // begin end,ptr 131*bb611c8fSApple OSS Distributions test_bounded_ptr<QualT> ptr(array.end(), array.begin(), array.end()); 132*bb611c8fSApple OSS Distributions QualT& ref0 = ptr[-5]; 133*bb611c8fSApple OSS Distributions _assert(&ref0 == &array[0]); 134*bb611c8fSApple OSS Distributions 135*bb611c8fSApple OSS Distributions QualT& ref1 = ptr[-4]; 136*bb611c8fSApple OSS Distributions _assert(&ref1 == &array[1]); 137*bb611c8fSApple OSS Distributions 138*bb611c8fSApple OSS Distributions QualT& ref2 = ptr[-3]; 139*bb611c8fSApple OSS Distributions _assert(&ref2 == &array[2]); 140*bb611c8fSApple OSS Distributions 141*bb611c8fSApple OSS Distributions QualT& ref3 = ptr[-2]; 142*bb611c8fSApple OSS Distributions _assert(&ref3 == &array[3]); 143*bb611c8fSApple OSS Distributions 144*bb611c8fSApple OSS Distributions QualT& ref4 = ptr[-1]; 145*bb611c8fSApple OSS Distributions _assert(&ref4 == &array[4]); 146*bb611c8fSApple OSS Distributions } 147*bb611c8fSApple OSS Distributions 148*bb611c8fSApple OSS Distributions // Make sure we trap when we subscript a pointer at an out-of-bounds offset 149*bb611c8fSApple OSS Distributions { 150*bb611c8fSApple OSS Distributions // T{0} T{1} T{2} T{3} T{4} <one-past-last> 151*bb611c8fSApple OSS Distributions // ^ ^ ^ 152*bb611c8fSApple OSS Distributions // | | | 153*bb611c8fSApple OSS Distributions // begin end ptr 154*bb611c8fSApple OSS Distributions libkern::bounded_ptr<QualT, tracking_policy> ptr(array.end() - 1, array.begin(), array.end() - 2); 155*bb611c8fSApple OSS Distributions 156*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 157*bb611c8fSApple OSS Distributions (void)ptr[-4]; 158*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 159*bb611c8fSApple OSS Distributions 160*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 161*bb611c8fSApple OSS Distributions (void)ptr[-3]; 162*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 163*bb611c8fSApple OSS Distributions 164*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 165*bb611c8fSApple OSS Distributions (void)ptr[-2]; 166*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 167*bb611c8fSApple OSS Distributions 168*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 169*bb611c8fSApple OSS Distributions (void)ptr[-1]; // trap 170*bb611c8fSApple OSS Distributions _assert(tracking_policy::did_trap); 171*bb611c8fSApple OSS Distributions 172*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 173*bb611c8fSApple OSS Distributions (void)ptr[0]; // trap 174*bb611c8fSApple OSS Distributions _assert(tracking_policy::did_trap); 175*bb611c8fSApple OSS Distributions } 176*bb611c8fSApple OSS Distributions { 177*bb611c8fSApple OSS Distributions // T{0} T{1} T{2} T{3} T{4} <one-past-last> 178*bb611c8fSApple OSS Distributions // ^ ^ ^ 179*bb611c8fSApple OSS Distributions // | | | 180*bb611c8fSApple OSS Distributions // begin ptr end 181*bb611c8fSApple OSS Distributions libkern::bounded_ptr<QualT, tracking_policy> ptr(array.begin() + 1, array.begin(), array.end()); 182*bb611c8fSApple OSS Distributions 183*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 184*bb611c8fSApple OSS Distributions (void)ptr[-1]; 185*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 186*bb611c8fSApple OSS Distributions 187*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 188*bb611c8fSApple OSS Distributions (void)ptr[0]; 189*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 190*bb611c8fSApple OSS Distributions 191*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 192*bb611c8fSApple OSS Distributions (void)ptr[1]; 193*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 194*bb611c8fSApple OSS Distributions 195*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 196*bb611c8fSApple OSS Distributions (void)ptr[2]; 197*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 198*bb611c8fSApple OSS Distributions 199*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 200*bb611c8fSApple OSS Distributions (void)ptr[3]; 201*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 202*bb611c8fSApple OSS Distributions 203*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 204*bb611c8fSApple OSS Distributions (void)ptr[4]; // trap 205*bb611c8fSApple OSS Distributions _assert(tracking_policy::did_trap); 206*bb611c8fSApple OSS Distributions } 207*bb611c8fSApple OSS Distributions { 208*bb611c8fSApple OSS Distributions // T{0} T{1} T{2} T{3} T{4} <one-past-last> 209*bb611c8fSApple OSS Distributions // ^ ^ ^ 210*bb611c8fSApple OSS Distributions // | | | 211*bb611c8fSApple OSS Distributions // ptr begin end 212*bb611c8fSApple OSS Distributions libkern::bounded_ptr<QualT, tracking_policy> ptr(array.begin(), array.begin() + 1, array.end() - 1); 213*bb611c8fSApple OSS Distributions 214*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 215*bb611c8fSApple OSS Distributions (void)ptr[0]; // trap 216*bb611c8fSApple OSS Distributions _assert(tracking_policy::did_trap); 217*bb611c8fSApple OSS Distributions 218*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 219*bb611c8fSApple OSS Distributions (void)ptr[1]; 220*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 221*bb611c8fSApple OSS Distributions 222*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 223*bb611c8fSApple OSS Distributions (void)ptr[2]; 224*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 225*bb611c8fSApple OSS Distributions 226*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 227*bb611c8fSApple OSS Distributions (void)ptr[3]; 228*bb611c8fSApple OSS Distributions _assert(!tracking_policy::did_trap); 229*bb611c8fSApple OSS Distributions 230*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 231*bb611c8fSApple OSS Distributions (void)ptr[4]; // trap 232*bb611c8fSApple OSS Distributions _assert(tracking_policy::did_trap); 233*bb611c8fSApple OSS Distributions 234*bb611c8fSApple OSS Distributions tracking_policy::did_trap = false; 235*bb611c8fSApple OSS Distributions (void)ptr[5]; // trap 236*bb611c8fSApple OSS Distributions _assert(tracking_policy::did_trap); 237*bb611c8fSApple OSS Distributions } 238*bb611c8fSApple OSS Distributions } 239*bb611c8fSApple OSS Distributions 240*bb611c8fSApple OSS Distributions T_DECL(subscript, "bounded_ptr.subscript") { 241*bb611c8fSApple OSS Distributions tests<T, T>(); 242*bb611c8fSApple OSS Distributions tests<T, T const>(); 243*bb611c8fSApple OSS Distributions tests<T, T volatile>(); 244*bb611c8fSApple OSS Distributions tests<T, T const volatile>(); 245*bb611c8fSApple OSS Distributions 246*bb611c8fSApple OSS Distributions // Make sure that we don't hard-error in the definition of operator[] 247*bb611c8fSApple OSS Distributions // when instantiating a `bounded_ptr<cv-void>` 248*bb611c8fSApple OSS Distributions test_bounded_ptr<void> p1; 249*bb611c8fSApple OSS Distributions test_bounded_ptr<void const> p2; 250*bb611c8fSApple OSS Distributions test_bounded_ptr<void volatile> p3; 251*bb611c8fSApple OSS Distributions test_bounded_ptr<void const volatile> p4; 252*bb611c8fSApple OSS Distributions } 253