]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix -Wstringop-overread warning in std::vector<bool> [PR114758]
authorJonathan Wakely <jwakely@redhat.com>
Fri, 28 Mar 2025 15:41:41 +0000 (15:41 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 31 Mar 2025 21:54:08 +0000 (22:54 +0100)
As in r13-4393-gcca06f0d6d76b0 and a few other commits, we can avoid
bogus warnings in std::vector<bool> by hoisting some loads to before the
allocation that calls operator new. This means that the compiler has
enough info to remove the dead branches that trigger bogus warnings.

On trunk this is only needed with -fno-assume-sane-operators-new-delete
but it will help on the branches where that option doesn't exist.

libstdc++-v3/ChangeLog:

PR libstdc++/114758
* include/bits/vector.tcc (vector<bool, A>::_M_fill_insert):
Hoist loads of begin() and end() before allocation.
* testsuite/23_containers/vector/bool/capacity/114758.cc: New
test.

Reviewed-by: Tomasz KamiƄski <tkaminsk@redhat.com>
libstdc++-v3/include/bits/vector.tcc
libstdc++-v3/testsuite/23_containers/vector/bool/capacity/114758.cc [new file with mode: 0644]

index f197278d52e09d00679ff93a0160d29f356618a7..29aa63e47428d78b06d38f936e104328e3826d6d 100644 (file)
@@ -1134,11 +1134,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
        {
          const size_type __len = 
            _M_check_len(__n, "vector<bool>::_M_fill_insert");
+         iterator __begin = begin(), __end = end();
          _Bit_pointer __q = this->_M_allocate(__len);
          iterator __start(std::__addressof(*__q), 0);
-         iterator __i = _M_copy_aligned(begin(), __position, __start);
+         iterator __i = _M_copy_aligned(__begin, __position, __start);
          std::fill(__i, __i + difference_type(__n), __x);
-         iterator __finish = std::copy(__position, end(),
+         iterator __finish = std::copy(__position, __end,
                                        __i + difference_type(__n));
          this->_M_deallocate();
          this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/114758.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/114758.cc
new file mode 100644 (file)
index 0000000..c56d50a
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-options "-O3 -Werror=stringop-overread -fno-assume-sane-operators-new-delete" }
+// { dg-do compile }
+
+// Bug libstdc++/114758 The layout of a std::vector<bool> reports a warning
+
+#include <vector>
+
+void pr114758(std::vector<bool>& v)
+{
+  v.resize(3);
+  v = std::vector<bool>(3, false);
+}