[libc++] Make sure __clear_and_shrink() maintains string invariants

__clear_and_shrink() was added in D41976, and a test was added alongside
it to make sure that the string invariants were maintained. However, it
appears that the test never ran under UBSan before, which would have
highlighted the fact that it doesn't actually maintain the string
invariants.

Differential Revision: https://reviews.llvm.org/D88849
This commit is contained in:
Louis Dionne 2020-10-05 16:16:13 -04:00
parent 7b5dfb400a
commit 602c193e2a
1 changed files with 2 additions and 1 deletions

View File

@ -3941,7 +3941,7 @@ basic_string<_CharT, _Traits, _Allocator>::__invariants() const
return false;
if (data() == 0)
return false;
if (data()[size()] != value_type(0))
if (data()[size()] != value_type())
return false;
return true;
}
@ -3959,6 +3959,7 @@ basic_string<_CharT, _Traits, _Allocator>::__clear_and_shrink() _NOEXCEPT
__alloc_traits::deallocate(__alloc(), __get_long_pointer(), capacity() + 1);
__set_long_cap(0);
__set_short_size(0);
traits_type::assign(*__get_short_pointer(), value_type());
}
}