]>
git.saurik.com Git - apple/xnu.git/blob - tests/bounded_ptr_src/discard_bounds.cpp
3 // T* discard_bounds() const;
6 #include <libkern/c++/bounded_ptr.h>
8 #include <darwintest.h>
9 #include <darwintest_utils.h>
10 #include "test_utils.h"
12 #define _assert(...) T_ASSERT_TRUE((__VA_ARGS__), # __VA_ARGS__)
17 struct tracking_policy
{
25 bool tracking_policy::did_trap
= false;
28 template <typename T
, typename QualT
>
32 std::array
<T
, 5> array
= {T
{0}, T
{1}, T
{2}, T
{3}, T
{4}};
35 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
39 test_bounded_ptr
<QualT
> const ptr(array
.begin() + 0, array
.begin(), array
.end());
40 QualT
* raw
= ptr
.discard_bounds();
41 _assert(raw
== &array
[0]);
44 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
48 test_bounded_ptr
<QualT
> const ptr(array
.begin() + 1, array
.begin(), array
.end());
49 QualT
* raw
= ptr
.discard_bounds();
50 _assert(raw
== &array
[1]);
53 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
57 test_bounded_ptr
<QualT
> const ptr(array
.begin() + 2, array
.begin(), array
.end());
58 QualT
* raw
= ptr
.discard_bounds();
59 _assert(raw
== &array
[2]);
62 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
66 test_bounded_ptr
<QualT
> const ptr(array
.begin() + 4, array
.begin(), array
.end());
67 QualT
* raw
= ptr
.discard_bounds();
68 _assert(raw
== &array
[4]);
70 // Make sure we don't trap when discarding the bounds of an in-bounds pointer
72 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
76 libkern::bounded_ptr
<QualT
, tracking_policy
> ptr(array
.begin() + 1, array
.begin(), array
.end());
77 tracking_policy::did_trap
= false;
80 _assert(!tracking_policy::did_trap
);
83 // Make sure we trap when discarding the bounds of an out-of-bounds pointer
85 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
89 libkern::bounded_ptr
<QualT
, tracking_policy
> ptr(array
.end() - 1, array
.begin(), array
.end() - 2);
90 tracking_policy::did_trap
= false;
91 (void)ptr
.discard_bounds();
92 _assert(tracking_policy::did_trap
);
95 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
99 libkern::bounded_ptr
<QualT
, tracking_policy
> ptr(array
.begin(), array
.begin() + 1, array
.end());
100 tracking_policy::did_trap
= false;
101 (void)ptr
.discard_bounds();
102 _assert(tracking_policy::did_trap
);
105 // T{0} T{1} T{2} T{3} T{4} <one-past-last>
107 // | (just a bit off) | |
109 T
* t3
= const_cast<T
*>(array
.begin() + 3);
110 char* just_off
= reinterpret_cast<char*>(t3
) + 1; // 1 byte off
111 libkern::bounded_ptr
<QualT
, tracking_policy
> ptr(reinterpret_cast<QualT
*>(just_off
), array
.begin(), array
.end() - 1);
113 tracking_policy::did_trap
= false;
114 (void)ptr
.discard_bounds();
115 _assert(tracking_policy::did_trap
);
119 T_DECL(discard_bounds
, "bounded_ptr.discard_bounds") {
122 tests
<T
, T
volatile>();
123 tests
<T
, T
const volatile>();