Skip to content

Commit 5bb9118

Browse files
committed
Add memory hardening assert macros
1 parent 5646230 commit 5bb9118

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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

Comments
 (0)