diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2024-12-16 17:42:24 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2024-12-17 18:54:17 +0000 |
commit | b273e25e11c842a5729d0e03c85088cf5ba8e06c (patch) | |
tree | 3c8136973abb80e378877ce78dacd6b781a3da70 /gcc | |
parent | ef458b3fa75537cb2d16f4ce61bc52642ddefd8a (diff) | |
download | gcc-b273e25e11c842a5729d0e03c85088cf5ba8e06c.zip gcc-b273e25e11c842a5729d0e03c85088cf5ba8e06c.tar.gz gcc-b273e25e11c842a5729d0e03c85088cf5ba8e06c.tar.bz2 |
libstdc++: Fix std::deque::insert(pos, first, last) undefined behaviour [PR118035]
Inserting an empty range into a std::deque results in undefined calls to
either std::copy, std::copy_backward, std::move, or std::move_backward.
We call those algos with invalid arguments where the output range is the
same as the input range, e.g. std::copy(first, last, first) which
violates the preconditions for the algorithms.
This fix simply returns early if there's nothing to insert. Most callers
already ensure that we don't even call _M_range_insert_aux with an empty
range, but some callers don't. Rather than checking for n == 0 in each
of the callers, this just does the check once and uses __builtin_expect
to treat empty insertions as unlikely.
libstdc++-v3/ChangeLog:
PR libstdc++/118035
* include/bits/deque.tcc (_M_range_insert_aux): Return
immediately if inserting an empty range.
* testsuite/23_containers/deque/modifiers/insert/118035.cc: New
test.
Diffstat (limited to 'gcc')
0 files changed, 0 insertions, 0 deletions