From 39c17f4f51c99426fa6c41354d6cd50cdd7c611c Mon Sep 17 00:00:00 2001 From: Dominic Chen Date: Mon, 23 Dec 2024 21:50:55 -0800 Subject: [PATCH] [libc++] Fix vector sanitization annotations on destruction In D144155/D136765, the asan annotations for `std::vector` were modified to unpoison freed backing memory on destruction, instead of leaving it poisoned. However, calling `__clear()` instead of `clear()` skips informing the asan runtime of this decrease in the accessible container size, which breaks the invariant that the value of `old_mid` should match the value of `new_mid` from the previous call to `__sanitizer_annotate_contiguous_container`, which can trip the sanity checks for the partial poison between [d1, d2) and the container redzone between [d2, c), if enabled. To fix this, ensure that `clear()` is called instead, as is already done by `__vdeallocate()`. Also remove `__clear()`, since it is no longer called. --- libcxx/include/__vector/vector.h | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/libcxx/include/__vector/vector.h b/libcxx/include/__vector/vector.h index 6ba7ba7bcf724..2ebacd324394c 100644 --- a/libcxx/include/__vector/vector.h +++ b/libcxx/include/__vector/vector.h @@ -241,7 +241,7 @@ class _LIBCPP_TEMPLATE_VIS vector { _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void operator()() { if (__vec_.__begin_ != nullptr) { - __vec_.__clear(); + __vec_.clear(); __vec_.__annotate_delete(); __alloc_traits::deallocate(__vec_.__alloc_, __vec_.__begin_, __vec_.capacity()); } @@ -520,7 +520,7 @@ class _LIBCPP_TEMPLATE_VIS vector { _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { size_type __old_size = size(); - __clear(); + __base_destruct_at_end(this->__begin_); __annotate_shrink(__old_size); } @@ -732,10 +732,6 @@ class _LIBCPP_TEMPLATE_VIS vector { ++__tx.__pos_; } - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __clear() _NOEXCEPT { - __base_destruct_at_end(this->__begin_); - } - _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __base_destruct_at_end(pointer __new_last) _NOEXCEPT { pointer __soon_to_be_end = this->__end_; while (__new_last != __soon_to_be_end) @@ -759,7 +755,7 @@ class _LIBCPP_TEMPLATE_VIS vector { _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const vector& __c, true_type) { if (this->__alloc_ != __c.__alloc_) { - __clear(); + clear(); __annotate_delete(); __alloc_traits::deallocate(this->__alloc_, this->__begin_, capacity()); this->__begin_ = this->__end_ = this->__cap_ = nullptr;