2121#include < type_traits>
2222#include < vector>
2323
24- // On MSVC an incorrect <version> header get's picked up
24+ // On MSVC an incorrect <version> header gets picked up
2525#if !defined(_MSC_VER) && __has_include(<version>)
2626#include < version>
2727#endif
@@ -243,17 +243,36 @@ struct MakeUnsafeStringSetLargerSize {
243243
244244#elif defined(_MSC_VER)
245245
246+ #if defined(_ANNOTATE_STRING) || !defined(_DISABLE_STRING_ANNOTATION)
247+ #ifdef __SANITIZE_ADDRESS__
248+ #define _INSERT_STRING_ANNOTATION
249+ #elif defined(__clang__)
250+ #if __has_feature(address_sanitizer)
251+ #define _INSERT_STRING_ANNOTATION
252+ #endif
253+ #endif
254+ #endif
255+
246256template <typename Tag, typename T, typename A, A Ptr_Eos>
247257struct MakeUnsafeStringSetLargerSize {
248258 friend void unsafeStringSetLargerSizeImpl (
249259 std::basic_string<T>& s, std::size_t n) {
260+ #if _MSC_VER >= 1938 && defined(_INSERT_STRING_ANNOTATION)
261+ const std::size_t n0 = s.size ();
262+ #endif
250263 (s.*Ptr_Eos)(n);
264+ #if _MSC_VER >= 1938 && defined(_INSERT_STRING_ANNOTATION)
265+ if (_Asan_string_should_annotate && s.capacity () > std::string ().capacity ())
266+ __sanitizer_annotate_contiguous_container (&s[0 ], &s[0 ] + s.capacity () + 1 ,
267+ &s[0 ] + n0 + 1 , &s[0 ] + n + 1 );
268+ #endif
251269 }
252270};
253271
254272#if _MSC_VER < 1939
255273#define FOLLY_DECLARE_STRING_RESIZE_WITHOUT_INIT (TYPE ) \
256- template void std::basic_string<TYPE>::_Eos(std::size_t ); \
274+ template void std::basic_string<TYPE>::_Eos(std::size_t ) \
275+ noexcept (_MSC_VER >= 1937 ); \
257276 template struct folly ::detail::MakeUnsafeStringSetLargerSize< \
258277 FollyMemoryDetailTranslationUnitTag, \
259278 TYPE, \
@@ -388,6 +407,16 @@ void unsafeVectorSetLargerSize(std::vector<T>& v, std::size_t n) {
388407
389408#elif defined(_MSC_VER)
390409
410+ #if defined(_ANNOTATE_VECTOR) || !defined(_DISABLE_VECTOR_ANNOTATION)
411+ #ifdef __SANITIZE_ADDRESS__
412+ #define _INSERT_VECTOR_ANNOTATION
413+ #elif defined(__clang__)
414+ #if __has_feature(address_sanitizer)
415+ #define _INSERT_VECTOR_ANNOTATION
416+ #endif
417+ #endif
418+ #endif
419+
391420template <
392421 typename Tag,
393422 typename T,
@@ -400,7 +429,13 @@ template <
400429struct MakeUnsafeVectorSetLargerSize : std::vector<T> {
401430 friend void unsafeVectorSetLargerSizeImpl (std::vector<T>& v, std::size_t n) {
402431 // v._Mypair._Myval2._Mylast += (n - v.size());
403- ((v.*Ptr_Mypair).*Ptr_Myval2).*Ptr_Mylast += (n - v.size ());
432+ const std::size_t n0 = v.size ();
433+ ((v.*Ptr_Mypair).*Ptr_Myval2).*Ptr_Mylast += (n - n0);
434+ #if _MSC_VER >= 1930 && defined(_INSERT_VECTOR_ANNOTATION)
435+ if (_Asan_vector_should_annotate)
436+ __sanitizer_annotate_contiguous_container (&v[0 ], &v[0 ] + v.capacity (),
437+ &v[0 ] + n0, &v[0 ] + n);
438+ #endif
404439 }
405440};
406441
@@ -424,6 +459,11 @@ struct MakeUnsafeVectorSetLargerSize : std::vector<T> {
424459} // namespace detail
425460} // namespace folly
426461
462+ #if defined(_MSC_VER)
463+ #undef _INSERT_STRING_ANNOTATION
464+ #undef _INSERT_VECTOR_ANNOTATION
465+ #endif
466+
427467#if defined(FOLLY_DECLARE_VECTOR_RESIZE_WITHOUT_INIT)
428468FOLLY_DECLARE_VECTOR_RESIZE_WITHOUT_INIT (char )
429469FOLLY_DECLARE_VECTOR_RESIZE_WITHOUT_INIT(unsigned char )
0 commit comments