|
23 | 23 | : _LIBCPP_ASSERTION_HANDLER(__FILE__ ":" _LIBCPP_TOSTRING(__LINE__) ": assertion " _LIBCPP_TOSTRING( \
|
24 | 24 | expression) " failed: " message "\n"))
|
25 | 25 |
|
26 |
| -// TODO: __builtin_assume can currently inhibit optimizations. Until this has been fixed and we can add |
27 |
| -// assumptions without a clear optimization intent, disable that to avoid worsening the code generation. |
28 |
| -// See https://discourse.llvm.org/t/llvm-assume-blocks-optimization/71609 for a discussion. |
29 |
| -#if 0 && __has_builtin(__builtin_assume) |
| 26 | +// WARNING: __builtin_assume can currently inhibit optimizations. Only add assumptions with a clear |
| 27 | +// optimization intent. See https://discourse.llvm.org/t/llvm-assume-blocks-optimization/71609 for a |
| 28 | +// discussion. |
| 29 | +#if __has_builtin(__builtin_assume) |
30 | 30 | # define _LIBCPP_ASSUME(expression) \
|
31 | 31 | (_LIBCPP_DIAGNOSTIC_PUSH _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wassume") \
|
32 | 32 | __builtin_assume(static_cast<bool>(expression)) _LIBCPP_DIAGNOSTIC_POP)
|
33 | 33 | #else
|
34 | 34 | # define _LIBCPP_ASSUME(expression) ((void)0)
|
35 | 35 | #endif
|
36 | 36 |
|
| 37 | +// Historically, disabled assertions below expanded to `_LIBCPP_ASSUME`, but this both triggers the |
| 38 | +// issue described above, and also causes every debug assertion to be a safety risk. |
| 39 | + |
37 | 40 | // clang-format off
|
38 | 41 | // Fast hardening mode checks.
|
39 | 42 |
|
|
44 | 47 | # define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(expression, message) _LIBCPP_ASSERT(expression, message)
|
45 | 48 | // Disabled checks.
|
46 | 49 | // On most modern platforms, dereferencing a null pointer does not lead to an actual memory access.
|
47 |
| -# define _LIBCPP_ASSERT_NON_NULL(expression, message) _LIBCPP_ASSUME(expression) |
| 50 | +# define _LIBCPP_ASSERT_NON_NULL(expression, message) ((void)0) |
48 | 51 | // Overlapping ranges will make algorithms produce incorrect results but don't directly lead to a security
|
49 | 52 | // vulnerability.
|
50 |
| -# define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message) _LIBCPP_ASSUME(expression) |
51 |
| -# define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message) _LIBCPP_ASSUME(expression) |
52 |
| -# define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) _LIBCPP_ASSUME(expression) |
53 |
| -# define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message) _LIBCPP_ASSUME(expression) |
54 |
| -# define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message) _LIBCPP_ASSUME(expression) |
55 |
| -# define _LIBCPP_ASSERT_PEDANTIC(expression, message) _LIBCPP_ASSUME(expression) |
56 |
| -# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) _LIBCPP_ASSUME(expression) |
57 |
| -# define _LIBCPP_ASSERT_INTERNAL(expression, message) _LIBCPP_ASSUME(expression) |
58 |
| -# define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) _LIBCPP_ASSUME(expression) |
| 53 | +# define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message) ((void)0) |
| 54 | +# define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message) ((void)0) |
| 55 | +# define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) ((void)0) |
| 56 | +# define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message) ((void)0) |
| 57 | +# define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message) ((void)0) |
| 58 | +# define _LIBCPP_ASSERT_PEDANTIC(expression, message) ((void)0) |
| 59 | +# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) ((void)0) |
| 60 | +# define _LIBCPP_ASSERT_INTERNAL(expression, message) ((void)0) |
| 61 | +# define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) ((void)0) |
59 | 62 |
|
60 | 63 | // Extensive hardening mode checks.
|
61 | 64 |
|
|
73 | 76 | # define _LIBCPP_ASSERT_PEDANTIC(expression, message) _LIBCPP_ASSERT(expression, message)
|
74 | 77 | # define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) _LIBCPP_ASSERT(expression, message)
|
75 | 78 | // Disabled checks.
|
76 |
| -# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) _LIBCPP_ASSUME(expression) |
77 |
| -# define _LIBCPP_ASSERT_INTERNAL(expression, message) _LIBCPP_ASSUME(expression) |
| 79 | +# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) ((void)0) |
| 80 | +# define _LIBCPP_ASSERT_INTERNAL(expression, message) ((void)0) |
78 | 81 |
|
79 | 82 | // Debug hardening mode checks.
|
80 | 83 |
|
|
99 | 102 | #else
|
100 | 103 |
|
101 | 104 | // All checks disabled.
|
102 |
| -# define _LIBCPP_ASSERT_VALID_INPUT_RANGE(expression, message) _LIBCPP_ASSUME(expression) |
103 |
| -# define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(expression, message) _LIBCPP_ASSUME(expression) |
104 |
| -# define _LIBCPP_ASSERT_NON_NULL(expression, message) _LIBCPP_ASSUME(expression) |
105 |
| -# define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message) _LIBCPP_ASSUME(expression) |
106 |
| -# define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message) _LIBCPP_ASSUME(expression) |
107 |
| -# define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) _LIBCPP_ASSUME(expression) |
108 |
| -# define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message) _LIBCPP_ASSUME(expression) |
109 |
| -# define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message) _LIBCPP_ASSUME(expression) |
110 |
| -# define _LIBCPP_ASSERT_PEDANTIC(expression, message) _LIBCPP_ASSUME(expression) |
111 |
| -# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) _LIBCPP_ASSUME(expression) |
112 |
| -# define _LIBCPP_ASSERT_INTERNAL(expression, message) _LIBCPP_ASSUME(expression) |
113 |
| -# define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) _LIBCPP_ASSUME(expression) |
| 105 | +# define _LIBCPP_ASSERT_VALID_INPUT_RANGE(expression, message) ((void)0) |
| 106 | +# define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(expression, message) ((void)0) |
| 107 | +# define _LIBCPP_ASSERT_NON_NULL(expression, message) ((void)0) |
| 108 | +# define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message) ((void)0) |
| 109 | +# define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message) ((void)0) |
| 110 | +# define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) ((void)0) |
| 111 | +# define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message) ((void)0) |
| 112 | +# define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message) ((void)0) |
| 113 | +# define _LIBCPP_ASSERT_PEDANTIC(expression, message) ((void)0) |
| 114 | +# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) ((void)0) |
| 115 | +# define _LIBCPP_ASSERT_INTERNAL(expression, message) ((void)0) |
| 116 | +# define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) ((void)0) |
114 | 117 |
|
115 | 118 | #endif // _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_FAST
|
116 | 119 | // clang-format on
|
|
0 commit comments