[libcxx-commits] [libcxx] 5351ded - [libc++] Remove usage of internal string function in sstream (#75858)

via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jan 8 09:56:47 PST 2024


Author: Tacet
Date: 2024-01-08T18:56:43+01:00
New Revision: 5351ded68d579921a61b26a34e36046c22f668bd

URL: https://github.com/llvm/llvm-project/commit/5351ded68d579921a61b26a34e36046c22f668bd
DIFF: https://github.com/llvm/llvm-project/commit/5351ded68d579921a61b26a34e36046c22f668bd.diff

LOG: [libc++] Remove usage of internal string function in sstream (#75858)

This function replaces a call to `__move_assign` (internal function)
with two calls to public member functions (`resize` and `erase`). The
order of calls is chosen for the best performance.

This change is required to [turn on ASan string annotations for short
strings](https://github.com/llvm/llvm-project/pull/75882) (Short String
Optimization - SSO).

The `std::basic_string` class's `void __move_assign(basic_string&&
__str, size_type __pos, size_type __len)` function operates on
uninitialized strings, where it is reasonable to assume that the memory
is not poisoned. However, in `sstream` this function is applied to
existing strings that already have poisoned memory.

String ASan annotations turned on here:
https://github.com/llvm/llvm-project/pull/72677

Added: 
    

Modified: 
    libcxx/include/sstream

Removed: 
    


################################################################################
diff  --git a/libcxx/include/sstream b/libcxx/include/sstream
index bd5cea9a5e9447..9f75b7e0ac9e4b 100644
--- a/libcxx/include/sstream
+++ b/libcxx/include/sstream
@@ -398,9 +398,9 @@ public:
     typename string_type::size_type __pos           = __view.empty() ? 0 : __view.data() - __str_.data();
     // In C++23, this is just string_type(std::move(__str_), __pos, __view.size(), __str_.get_allocator());
     // But we need something that works in C++20 also.
-    string_type __result(__str_.get_allocator());
-    __result.__move_assign(std::move(__str_), __pos, __view.size());
-    __str_.clear();
+    string_type __result(std::move(__str_), __str_.get_allocator());
+    __result.resize(__pos + __view.size());
+    __result.erase(0, __pos);
     __init_buf_ptrs();
     return __result;
   }


        


More information about the libcxx-commits mailing list