[libc++] Set correct size at the end of growing std::string
commit6a9c41fdd4ca834a46fd866278c90a35f2375333
authorAdvenam Tacet <advenam.tacet@trailofbits.com>
Thu, 13 Jul 2023 00:30:36 +0000 (13 02:30 +0200)
committerAdvenam Tacet <advenam.tacet@trailofbits.com>
Sat, 15 Jul 2023 02:00:30 +0000 (15 04:00 +0200)
treec03e307f33b1ae64f4a629176be7a8c5b755acbf
parent6a35ceaacf06a5fcaf649d4f63600a79b365e103
[libc++] Set correct size at the end of growing std::string

This commit deprecates `std::basic_string::__grow_by`, which is part of ABIv1. The function is replaced by `std::basic_string:__grow_by_without_replace`, which is not part of ABI.

- The original function `__grow_by` is deprecated because it does not set the string size,  therefore it may not update the size when the size is changed, and it may also not set the size at all when the string was short initially. This leads to unpredictable size value. It is not removed or changed to avoid breaking the ABI.
- The commit adds `_LIBCPP_HIDE_FROM_ABI`  guarded by `_LIBCPP_ABI_VERSION >= 2` to `__grow_by`. This allows the function to be used in the dylib in ABIv1 without raising the `[abi:v170000]` error and removes it from future ABIs. `_LIBCPP_HIDE_FROM_ABI_AFTER_V1` cannot be used.
- Additionally, `__grow_by` has been removed from `_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST` in `libcxx/include/__string/extern_template_lists.h`.

This bugfix is necessary to implement string ASan annotations, because it mitigates the problems encountered in D132769.

Reviewed By: ldionne, #libc, philnik

Differential Revision: https://reviews.llvm.org/D148693
libcxx/include/__string/extern_template_lists.h
libcxx/include/string