|
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)
|
|
44 | 44 | # define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(expression, message) _LIBCPP_ASSERT(expression, message)
|
45 | 45 | // Disabled checks.
|
46 | 46 | // 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) |
| 47 | +# define _LIBCPP_ASSERT_NON_NULL(expression, message) ((void)0) |
48 | 48 | // Overlapping ranges will make algorithms produce incorrect results but don't directly lead to a security
|
49 | 49 | // 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) |
| 50 | +# define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message) ((void)0) |
| 51 | +# define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message) ((void)0) |
| 52 | +# define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) ((void)0) |
| 53 | +# define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message) ((void)0) |
| 54 | +# define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message) ((void)0) |
| 55 | +# define _LIBCPP_ASSERT_PEDANTIC(expression, message) ((void)0) |
| 56 | +# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) ((void)0) |
| 57 | +# define _LIBCPP_ASSERT_INTERNAL(expression, message) ((void)0) |
| 58 | +# define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) ((void)0) |
59 | 59 |
|
60 | 60 | // Extensive hardening mode checks.
|
61 | 61 |
|
|
73 | 73 | # define _LIBCPP_ASSERT_PEDANTIC(expression, message) _LIBCPP_ASSERT(expression, message)
|
74 | 74 | # define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) _LIBCPP_ASSERT(expression, message)
|
75 | 75 | // Disabled checks.
|
76 |
| -# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) _LIBCPP_ASSUME(expression) |
77 |
| -# define _LIBCPP_ASSERT_INTERNAL(expression, message) _LIBCPP_ASSUME(expression) |
| 76 | +# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) ((void)0) |
| 77 | +# define _LIBCPP_ASSERT_INTERNAL(expression, message) ((void)0) |
78 | 78 |
|
79 | 79 | // Debug hardening mode checks.
|
80 | 80 |
|
|
99 | 99 | #else
|
100 | 100 |
|
101 | 101 | // 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) |
| 102 | +# define _LIBCPP_ASSERT_VALID_INPUT_RANGE(expression, message) ((void)0) |
| 103 | +# define _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(expression, message) ((void)0) |
| 104 | +# define _LIBCPP_ASSERT_NON_NULL(expression, message) ((void)0) |
| 105 | +# define _LIBCPP_ASSERT_NON_OVERLAPPING_RANGES(expression, message) ((void)0) |
| 106 | +# define _LIBCPP_ASSERT_VALID_DEALLOCATION(expression, message) ((void)0) |
| 107 | +# define _LIBCPP_ASSERT_VALID_EXTERNAL_API_CALL(expression, message) ((void)0) |
| 108 | +# define _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR(expression, message) ((void)0) |
| 109 | +# define _LIBCPP_ASSERT_ARGUMENT_WITHIN_DOMAIN(expression, message) ((void)0) |
| 110 | +# define _LIBCPP_ASSERT_PEDANTIC(expression, message) ((void)0) |
| 111 | +# define _LIBCPP_ASSERT_SEMANTIC_REQUIREMENT(expression, message) ((void)0) |
| 112 | +# define _LIBCPP_ASSERT_INTERNAL(expression, message) ((void)0) |
| 113 | +# define _LIBCPP_ASSERT_UNCATEGORIZED(expression, message) ((void)0) |
114 | 114 |
|
115 | 115 | #endif // _LIBCPP_HARDENING_MODE == _LIBCPP_HARDENING_MODE_FAST
|
116 | 116 | // clang-format on
|
|
0 commit comments