[libc++] Make sure __clear_and_shrink() maintains string invariants
authorLouis Dionne <ldionne@apple.com>
Mon, 5 Oct 2020 20:16:13 +0000 (16:16 -0400)
committerLouis Dionne <ldionne@apple.com>
Wed, 7 Oct 2020 13:16:59 +0000 (09:16 -0400)
__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

libcxx/include/string

index b6380da..c900d96 100644 (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());
     }
 }