On Tue, Apr 1, 2025 at 11:32 AM Jonathan Wakely <jwak...@redhat.com> wrote:

> This was fixed on trunk by r15-4473-g3abe751ea86e34, but that isn't
> suitable for backporting. Instead, just add another unreachable
> condition in std::vector::_M_range_insert so the compiler knows this
> memcpy doesn't use a length originating from a negative ptrdiff_t
> converted to a very positive size_t.
>
> libstdc++-v3/ChangeLog:
>
>         PR libstdc++/117983
>         * include/bits/vector.tcc (vector::_M_range_insert): Add
>         unreachable condition to tell the compiler begin() <= end().
>         * testsuite/23_containers/vector/modifiers/insert/117983.cc: New
>         test.
>
> (cherry picked from commit 878812b6f6905774ab37cb78903e3e11bf1c508c)
> ---
>
> Tested x86_64-linux.
>
LGTM.

>
> This warning is a regression on 12/13/14 so this is needed on all
> release branches.
>
>  libstdc++-v3/include/bits/vector.tcc            |  2 ++
>  .../vector/modifiers/insert/117983.cc           | 17 +++++++++++++++++
>  2 files changed, 19 insertions(+)
>  create mode 100644
> libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/117983.cc
>
> diff --git a/libstdc++-v3/include/bits/vector.tcc
> b/libstdc++-v3/include/bits/vector.tcc
> index 0458d560075..b7f472ae09c 100644
> --- a/libstdc++-v3/include/bits/vector.tcc
> +++ b/libstdc++-v3/include/bits/vector.tcc
> @@ -1002,6 +1002,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
>                 // reachable.
>                 pointer __old_start = this->_M_impl._M_start;
>                 pointer __old_finish = this->_M_impl._M_finish;
> +               if ((__old_finish - __old_start) < 0)
> +                 __builtin_unreachable();
>
>                 const size_type __len =
>                   _M_check_len(__n, "vector::_M_range_insert");
> diff --git
> a/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/117983.cc
> b/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/117983.cc
> new file mode 100644
> index 00000000000..e6027a677ee
> --- /dev/null
> +++
> b/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/117983.cc
> @@ -0,0 +1,17 @@
> +// { dg-options "-O3 -Werror=stringop-overflow" }
> +// { dg-do compile }
> +
> +// PR libstdc++/117983
> +// -Wstringop-overflow false positive for __builtin_memmove from
> vector::insert
> +
> +#include <vector>
> +
> +typedef std::vector<unsigned char> bytes;
> +
> +void push(bytes chunk, bytes& data) {
> +  if (data.empty()) {
> +    data.swap(chunk);
> +  } else {
> +    data.insert(data.end(), chunk.begin(), chunk.end());
> +  }
> +}
> --
> 2.49.0
>
>

Reply via email to