Skip to content

Commit 2b8f8b2

Browse files
committed
Add address sanitizer annotations when building with msvc 2022
1 parent 6c822d0 commit 2b8f8b2

File tree

1 file changed

+43
-3
lines changed

1 file changed

+43
-3
lines changed

folly/memory/UninitializedMemoryHacks.h

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
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+
246256
template <typename Tag, typename T, typename A, A Ptr_Eos>
247257
struct 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+
391420
template <
392421
typename Tag,
393422
typename T,
@@ -400,7 +429,13 @@ template <
400429
struct 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)
428468
FOLLY_DECLARE_VECTOR_RESIZE_WITHOUT_INIT(char)
429469
FOLLY_DECLARE_VECTOR_RESIZE_WITHOUT_INIT(unsigned char)

0 commit comments

Comments
 (0)