Skip to content

Commit f92677d

Browse files
ddccDominic Chen
authored andcommitted
[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()`.
1 parent 5f096fd commit f92677d

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

libcxx/include/__vector/vector.h

Lines changed: 2 additions & 2 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
}
@@ -759,7 +759,7 @@ class _LIBCPP_TEMPLATE_VIS vector {
759759

760760
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const vector& __c, true_type) {
761761
if (this->__alloc_ != __c.__alloc_) {
762-
__clear();
762+
clear();
763763
__annotate_delete();
764764
__alloc_traits::deallocate(this->__alloc_, this->__begin_, capacity());
765765
this->__begin_ = this->__end_ = this->__cap_ = nullptr;

0 commit comments

Comments
 (0)