@@ -20,11 +20,13 @@ _STL_DISABLE_CLANG_WARNINGS
2020// (this will be auto-defined on unsupported platforms)
2121// + _DISABLE_STRING_ANNOTATION: same, but for only `basic_string`
2222// + _DISABLE_VECTOR_ANNOTATION: same, but for only `vector`
23+ // + _DISABLE_OPTIONAL_ANNOTATION: same, but for only `optional`
2324// - _ENABLE_STL_ANNOTATION_ON_UNSUPPORTED_PLATFORMS: Don't auto-disable ASan annotations
2425// - _ANNOTATE_STL: Even when ASan annotations are disabled, insert the code for annotating into the STL anyways;
2526// this is useful when building static libraries which may be linked against both ASan and non-ASan binaries.
2627// + _ANNOTATE_STRING: same, but only for `basic_string`
2728// + _ANNOTATE_VECTOR: same, but only for `vector`
29+ // + _ANNOTATE_OPTIONAL: same, but only for `optional`
2830
2931#if !defined(_DISABLE_STL_ANNOTATION) && !defined(_ENABLE_STL_ANNOTATION_ON_UNSUPPORTED_PLATFORMS)
3032
@@ -46,6 +48,9 @@ _STL_DISABLE_CLANG_WARNINGS
4648#ifndef _DISABLE_VECTOR_ANNOTATION
4749#define _DISABLE_VECTOR_ANNOTATION
4850#endif // ^^^ !defined(_DISABLE_VECTOR_ANNOTATION) ^^^
51+ #ifndef _DISABLE_OPTIONAL_ANNOTATION
52+ #define _DISABLE_OPTIONAL_ANNOTATION
53+ #endif // ^^^ !defined(_DISABLE_OPTIONAL_ANNOTATION) ^^^
4954
5055#endif // ^^^ defined(_DISABLE_STL_ANNOTATION) ^^^
5156
@@ -59,6 +64,10 @@ _STL_DISABLE_CLANG_WARNINGS
5964#define _ANNOTATE_VECTOR
6065#endif // ^^^ !defined(_ANNOTATE_VECTOR) ^^^
6166
67+ #ifndef _ANNOTATE_OPTIONAL
68+ #define _ANNOTATE_OPTIONAL
69+ #endif // ^^^ !defined(_ANNOTATE_OPTIONAL) ^^^
70+
6271#endif // ^^^ defined(_ANNOTATE_STL) ^^^
6372
6473#ifdef __SANITIZE_ADDRESS__
@@ -67,6 +76,8 @@ _STL_DISABLE_CLANG_WARNINGS
6776#define _INSERT_STRING_ANNOTATION
6877#define _ACTIVATE_VECTOR_ANNOTATION
6978#define _INSERT_VECTOR_ANNOTATION
79+ #define _ACTIVATE_OPTIONAL_ANNOTATION
80+ #define _INSERT_OPTIONAL_ANNOTATION
7081
7182#elif defined(__clang__) // ^^^ defined(__SANITIZE_ADDRESS__) / defined(__clang__) vvv
7283
@@ -75,6 +86,8 @@ _STL_DISABLE_CLANG_WARNINGS
7586#define _INSERT_STRING_ANNOTATION
7687#define _ACTIVATE_VECTOR_ANNOTATION
7788#define _INSERT_VECTOR_ANNOTATION
89+ #define _ACTIVATE_OPTIONAL_ANNOTATION
90+ #define _INSERT_OPTIONAL_ANNOTATION
7891#pragma comment(linker, "/INFERASANLIBS")
7992#endif // __has_feature(address_sanitizer)
8093
@@ -89,13 +102,20 @@ _STL_DISABLE_CLANG_WARNINGS
89102#undef _ACTIVATE_VECTOR_ANNOTATION
90103#undef _INSERT_VECTOR_ANNOTATION
91104#endif // ^^^ defined(_DISABLE_VECTOR_ANNOTATION) ^^^
105+ #ifdef _DISABLE_OPTIONAL_ANNOTATION
106+ #undef _ACTIVATE_OPTIONAL_ANNOTATION
107+ #undef _INSERT_OPTIONAL_ANNOTATION
108+ #endif // ^^^ defined(_DISABLE_OPTIONAL_ANNOTATION) ^^^
92109
93110#ifdef _ANNOTATE_STRING
94111#define _INSERT_STRING_ANNOTATION
95112#endif // ^^^ defined(_ANNOTATE_STRING) ^^^
96113#ifdef _ANNOTATE_VECTOR
97114#define _INSERT_VECTOR_ANNOTATION
98115#endif // ^^^ defined(_ANNOTATE_VECTOR) ^^^
116+ #ifdef _ANNOTATE_OPTIONAL
117+ #define _INSERT_OPTIONAL_ANNOTATION
118+ #endif // ^^^ defined(_ANNOTATE_OPTIONAL) ^^^
99119
100120
101121#ifndef _INSERT_STRING_ANNOTATION
@@ -104,6 +124,9 @@ _STL_DISABLE_CLANG_WARNINGS
104124#ifndef _INSERT_VECTOR_ANNOTATION
105125#pragma detect_mismatch("annotate_vector", "0")
106126#endif // ^^^ !defined(_INSERT_VECTOR_ANNOTATION) ^^^
127+ #ifndef _INSERT_OPTIONAL_ANNOTATION
128+ #pragma detect_mismatch("annotate_optional", "0")
129+ #endif // ^^^ !defined(_INSERT_OPTIONAL_ANNOTATION) ^^^
107130
108131#ifdef _ACTIVATE_STRING_ANNOTATION
109132#pragma comment(lib, "stl_asan")
@@ -113,9 +136,14 @@ _STL_DISABLE_CLANG_WARNINGS
113136#pragma comment(lib, "stl_asan")
114137#pragma detect_mismatch("annotate_vector", "1")
115138#endif // ^^^ defined(_ACTIVATE_VECTOR_ANNOTATION) ^^^
139+ #ifdef _ACTIVATE_OPTIONAL_ANNOTATION
140+ #pragma comment(lib, "stl_asan")
141+ #pragma detect_mismatch("annotate_optional", "1")
142+ #endif // ^^^ defined(_ACTIVATE_OPTIONAL_ANNOTATION) ^^^
116143
117144#undef _ACTIVATE_STRING_ANNOTATION
118145#undef _ACTIVATE_VECTOR_ANNOTATION
146+ #undef _ACTIVATE_OPTIONAL_ANNOTATION
119147
120148extern " C" {
121149#ifdef _INSERT_VECTOR_ANNOTATION
@@ -125,16 +153,27 @@ extern const bool _Asan_vector_should_annotate;
125153#ifdef _INSERT_STRING_ANNOTATION
126154extern const bool _Asan_string_should_annotate;
127155#endif
156+
157+ #ifdef _INSERT_OPTIONAL_ANNOTATION
158+ extern const bool _Asan_optional_should_annotate;
159+ #endif
128160} // extern "C"
129161
130- #if defined(_INSERT_VECTOR_ANNOTATION) || defined(_INSERT_STRING_ANNOTATION)
162+ #if defined(_INSERT_VECTOR_ANNOTATION) || defined(_INSERT_STRING_ANNOTATION) || defined(_INSERT_OPTIONAL_ANNOTATION)
131163extern " C" {
164+ void __cdecl __asan_poison_memory_region (const volatile void * _Addr, size_t _Size);
165+ void __cdecl __asan_unpoison_memory_region (const volatile void * _Addr, size_t _Size);
166+
132167// This must match ASan's primary declaration, which isn't marked `noexcept`.
133168void __cdecl __sanitizer_annotate_contiguous_container (
134169 const void * _First, const void * _End, const void * _Old_last, const void * _New_last);
135170} // extern "C"
136171
137172#ifdef _M_ARM64EC
173+ #pragma comment(linker, "/alternatename:#__asan_poison_memory_region=#__asan_poison_memory_region_default")
174+ #pragma comment(linker, "/alternatename:__asan_poison_memory_region=__asan_poison_memory_region_default")
175+ #pragma comment(linker, "/alternatename:#__asan_unpoison_memory_region=#__asan_unpoison_memory_region_default")
176+ #pragma comment(linker, "/alternatename:__asan_unpoison_memory_region=__asan_unpoison_memory_region_default")
138177#pragma comment(linker, \
139178 " /alternatename:#__sanitizer_annotate_contiguous_container=#__sanitizer_annotate_contiguous_container_default" )
140179#pragma comment(linker, \
@@ -143,7 +182,13 @@ void __cdecl __sanitizer_annotate_contiguous_container(
143182#pragma comment(linker, "/alternatename:_Asan_vector_should_annotate=_Asan_vector_should_annotate_default")
144183#pragma comment(linker, "/alternatename:#_Asan_string_should_annotate=#_Asan_string_should_annotate_default")
145184#pragma comment(linker, "/alternatename:_Asan_string_should_annotate=_Asan_string_should_annotate_default")
185+ #pragma comment(linker, "/alternatename:#_Asan_optional_should_annotate=#_Asan_optional_should_annotate_default")
186+ #pragma comment(linker, "/alternatename:_Asan_optional_should_annotate=_Asan_optional_should_annotate_default")
146187#elif defined(_M_HYBRID)
188+ #pragma comment(linker, "/alternatename:#__asan_poison_memory_region=#__asan_poison_memory_region_default")
189+ #pragma comment(linker, "/alternatename:___asan_poison_memory_region=___asan_poison_memory_region_default")
190+ #pragma comment(linker, "/alternatename:#__asan_unpoison_memory_region=#__asan_unpoison_memory_region_default")
191+ #pragma comment(linker, "/alternatename:___asan_unpoison_memory_region=___asan_unpoison_memory_region_default")
147192#pragma comment(linker, \
148193 " /alternatename:#__sanitizer_annotate_contiguous_container=#__sanitizer_annotate_contiguous_container_default" )
149194#pragma comment(linker, \
@@ -152,16 +197,24 @@ void __cdecl __sanitizer_annotate_contiguous_container(
152197#pragma comment(linker, "/alternatename:__Asan_vector_should_annotate=__Asan_vector_should_annotate_default")
153198#pragma comment(linker, "/alternatename:#_Asan_string_should_annotate=#_Asan_string_should_annotate_default")
154199#pragma comment(linker, "/alternatename:__Asan_string_should_annotate=__Asan_string_should_annotate_default")
200+ #pragma comment(linker, "/alternatename:#_Asan_optional_should_annotate=#_Asan_optional_should_annotate_default")
201+ #pragma comment(linker, "/alternatename:__Asan_optional_should_annotate=__Asan_optional_should_annotate_default")
155202#elif defined(_M_IX86)
203+ #pragma comment(linker, "/alternatename:___asan_poison_memory_region=___asan_poison_memory_region_default")
204+ #pragma comment(linker, "/alternatename:___asan_unpoison_memory_region=___asan_unpoison_memory_region_default")
156205#pragma comment(linker, \
157206 " /alternatename:___sanitizer_annotate_contiguous_container=___sanitizer_annotate_contiguous_container_default" )
158207#pragma comment(linker, "/alternatename:__Asan_vector_should_annotate=__Asan_vector_should_annotate_default")
159208#pragma comment(linker, "/alternatename:__Asan_string_should_annotate=__Asan_string_should_annotate_default")
209+ #pragma comment(linker, "/alternatename:__Asan_optional_should_annotate=__Asan_optional_should_annotate_default")
160210#elif defined(_M_X64) || defined(_M_ARM64)
211+ #pragma comment(linker, "/alternatename:__asan_poison_memory_region=__asan_poison_memory_region_default")
212+ #pragma comment(linker, "/alternatename:__asan_unpoison_memory_region=__asan_unpoison_memory_region_default")
161213#pragma comment(linker, \
162214 " /alternatename:__sanitizer_annotate_contiguous_container=__sanitizer_annotate_contiguous_container_default" )
163215#pragma comment(linker, "/alternatename:_Asan_vector_should_annotate=_Asan_vector_should_annotate_default")
164216#pragma comment(linker, "/alternatename:_Asan_string_should_annotate=_Asan_string_should_annotate_default")
217+ #pragma comment(linker, "/alternatename:_Asan_optional_should_annotate=_Asan_optional_should_annotate_default")
165218#else // ^^^ known architecture / unknown architecture vvv
166219#error Unknown architecture
167220#endif // ^^^ unknown architecture ^^^
0 commit comments