Skip to content

Commit 39c17f4

Browse files
ddccDominic Chen
authored and
Dominic Chen
committed
[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.
1 parent 5f096fd commit 39c17f4

File tree

1 file changed

+3
-7
lines changed

1 file changed

+3
-7
lines changed

libcxx/include/__vector/vector.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ class _LIBCPP_TEMPLATE_VIS vector {
241241

242242
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void operator()() {
243243
if (__vec_.__begin_ != nullptr) {
244-
__vec_.__clear();
244+
__vec_.clear();
245245
__vec_.__annotate_delete();
246246
__alloc_traits::deallocate(__vec_.__alloc_, __vec_.__begin_, __vec_.capacity());
247247
}
@@ -520,7 +520,7 @@ class _LIBCPP_TEMPLATE_VIS vector {
520520

521521
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT {
522522
size_type __old_size = size();
523-
__clear();
523+
__base_destruct_at_end(this->__begin_);
524524
__annotate_shrink(__old_size);
525525
}
526526

@@ -732,10 +732,6 @@ class _LIBCPP_TEMPLATE_VIS vector {
732732
++__tx.__pos_;
733733
}
734734

735-
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __clear() _NOEXCEPT {
736-
__base_destruct_at_end(this->__begin_);
737-
}
738-
739735
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __base_destruct_at_end(pointer __new_last) _NOEXCEPT {
740736
pointer __soon_to_be_end = this->__end_;
741737
while (__new_last != __soon_to_be_end)
@@ -759,7 +755,7 @@ class _LIBCPP_TEMPLATE_VIS vector {
759755

760756
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const vector& __c, true_type) {
761757
if (this->__alloc_ != __c.__alloc_) {
762-
__clear();
758+
clear();
763759
__annotate_delete();
764760
__alloc_traits::deallocate(this->__alloc_, this->__begin_, capacity());
765761
this->__begin_ = this->__end_ = this->__cap_ = nullptr;

0 commit comments

Comments
 (0)