|
| 1 | +#pragma once |
| 2 | + |
| 3 | +#include <bit> // IWYU pragma: keep for use of cross-library reference for standard library macro definitions |
| 4 | + |
| 5 | +#ifdef __GLIBCXX__ |
| 6 | +#include <debug/assertions.h> |
| 7 | + |
| 8 | +#define OV_HARDEN_ASSERT_VALID_RANGE_MESSAGE(BEGIN, END, MSG) __glibcxx_assert(BEGIN <= END) |
| 9 | +#define OV_HARDEN_ASSERT_NONEMPTY_RANGE(BEGIN, END, FUNC_NAME) __glibcxx_requires_non_empty_range(BEGIN, END) |
| 10 | + |
| 11 | +#define OV_HARDEN_ASSERT_ACCESS(INDEX, FUNC_NAME) __glibcxx_requires_subscript(INDEX) |
| 12 | +#define OV_HARDEN_ASSERT_NONEMPTY(FUNC_NAME) __glibcxx_requires_nonempty() |
| 13 | +#define OV_HARDEN_ASSERT_VALID_ITERATOR(IT, FUNC_NAME) \ |
| 14 | + OV_HARDEN_ASSERT_VALID_RANGE_MESSAGE(IT, end(), #FUNC_NAME " called with a non-dereferenceable iterator") |
| 15 | + |
| 16 | +#elif defined(_LIBCPP_VERSION) |
| 17 | +#include <__assert> |
| 18 | + |
| 19 | +#define OV_HARDEN_ASSERT_VALID_RANGE_MESSAGE(BEGIN, END, MSG) _LIBCPP_ASSERT_VALID_INPUT_RANGE(BEGIN <= END, MSG) |
| 20 | +#define OV_HARDEN_ASSERT_NONEMPTY_RANGE(BEGIN, END, FUNC_NAME) \ |
| 21 | + OV_HARDEN_ASSERT_VALID_RANGE_MESSAGE(BEGIN, END, #FUNC_NAME " called with an invalid range") |
| 22 | + |
| 23 | +#define OV_HARDEN_ASSERT_ACCESS(INDEX, FUNC_NAME) \ |
| 24 | + _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(INDEX < size(), #FUNC_NAME " index out of bounds") |
| 25 | +#define OV_HARDEN_ASSERT_NONEMPTY(FUNC_NAME) \ |
| 26 | + _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), #FUNC_NAME " called on an empty container") |
| 27 | +#define OV_HARDEN_ASSERT_VALID_ITERATOR(IT, FUNC_NAME) \ |
| 28 | + _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(IT != end(), #FUNC_NAME " called with a non-dereferenceable iterator") |
| 29 | + |
| 30 | +#elif defined(_MSVC_STL_VERSION) && _MSVC_STL_HARDENING == 1 |
| 31 | +#include <yvals.h> |
| 32 | + |
| 33 | +#define OV_HARDEN_ASSERT_VALID_RANGE_MESSAGE(BEGIN, END, MSG) _STL_VERIFY(BEGIN <= END, MSG) |
| 34 | +#define OV_HARDEN_ASSERT_NONEMPTY_RANGE(BEGIN, END, FUNC_NAME) \ |
| 35 | + OV_HARDEN_ASSERT_VALID_RANGE_MESSAGE(BEGIN, END, #FUNC_NAME " called with an invalid range") |
| 36 | + |
| 37 | +#define OV_HARDEN_ASSERT_ACCESS(INDEX, FUNC_NAME) _STL_VERIFY(INDEX < size(), #FUNC_NAME " index out of bounds") |
| 38 | +#define OV_HARDEN_ASSERT_NONEMPTY(FUNC_NAME) _STL_VERIFY(!empty(), #FUNC_NAME " called on an empty container") |
| 39 | +#define OV_HARDEN_ASSERT_VALID_ITERATOR(IT, FUNC_NAME) \ |
| 40 | + OV_HARDEN_ASSERT_VALID_RANGE_MESSAGE(IT, end(), #FUNC_NAME " called with a non-dereferenceable iterator") |
| 41 | + |
| 42 | +#else |
| 43 | +#define OV_HARDEN_ASSERT_VALID_RANGE_MESSAGE(BEGIN, END, MSG) |
| 44 | +#define OV_HARDEN_ASSERT_NONEMPTY_RANGE(BEGIN, END, FUNC_NAME) |
| 45 | +#define OV_HARDEN_ASSERT_ACCESS(INDEX, FUNC_NAME) |
| 46 | +#define OV_HARDEN_ASSERT_NONEMPTY(FUNC_NAME) |
| 47 | +#define OV_HARDEN_ASSERT_VALID_ITERATOR(IT, FUNC_NAME) |
| 48 | + |
| 49 | +#if defined(_GLIBCXX_ASSERTIONS) || _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_FAST || _MSVC_STL_HARDENING == 1 |
| 50 | +#warning "Unsupported standard library for memory hardening, hardening asserts will be ignored." |
| 51 | +#endif |
| 52 | +#endif |
0 commit comments