Date: Fri, 21 Jul 2023 13:15:36 -0400
On Fri, Jul 21, 2023 at 12:59 PM Jerry Coffin via Std-Proposals <
std-proposals_at_[hidden]> wrote:
> There's a corner case for which the current specification of
> `std::string::append` will frequently lead to undefined behavior.
>
> Consider something like:
>
> ```cpp
> std::strings = "A long enough string that two copies of it probably won't
> fit into the currently allocated storage";
> s.append(s);
> ```
>
Even more natural:
s += s;
which is equivalent to
s.append(s)
which is equivalent to
s.append(s.data(), s.size())
which has the following effects ([string.append]/8
<https://eel.is/c++draft/string.modifiers#string.append-8>):
> Appends a copy of the range [s, s + n) to the string.
However — it is not clear to me that this wording gives the implementation
permission to append *anything other than* [s, s+n) to the string in the
case that the appending operation itself causes [s, s+n) to become
invalidated.
In fact, I've been here before:
https://quuxplusone.github.io/blog/2021/04/17/pathological-string-appends/
Are you actually seeing some real-world `std::string` implementation
misbehave? If so, I strongly recommend filing a bug with that vendor. They
almost certainly already believe that they have to implement the behavior
you expected, and so they'll treat it as a real bug (even if a hard-to-fix
one).
Cheers,
Arthur
std-proposals_at_[hidden]> wrote:
> There's a corner case for which the current specification of
> `std::string::append` will frequently lead to undefined behavior.
>
> Consider something like:
>
> ```cpp
> std::strings = "A long enough string that two copies of it probably won't
> fit into the currently allocated storage";
> s.append(s);
> ```
>
Even more natural:
s += s;
which is equivalent to
s.append(s)
which is equivalent to
s.append(s.data(), s.size())
which has the following effects ([string.append]/8
<https://eel.is/c++draft/string.modifiers#string.append-8>):
> Appends a copy of the range [s, s + n) to the string.
However — it is not clear to me that this wording gives the implementation
permission to append *anything other than* [s, s+n) to the string in the
case that the appending operation itself causes [s, s+n) to become
invalidated.
In fact, I've been here before:
https://quuxplusone.github.io/blog/2021/04/17/pathological-string-appends/
Are you actually seeing some real-world `std::string` implementation
misbehave? If so, I strongly recommend filing a bug with that vendor. They
almost certainly already believe that they have to implement the behavior
you expected, and so they'll treat it as a real bug (even if a hard-to-fix
one).
Cheers,
Arthur
Received on 2023-07-21 17:15:50