libstdc++: Fix -Warray-bounds warning in std::vector<bool>

Resolves: RHEL-49861
This commit is contained in:
Siddhesh Poyarekar 2025-05-21 17:03:37 -04:00 committed by Siddhesh Poyarekar
parent d4a4a65e5b
commit cea7e675cb
2 changed files with 91 additions and 2 deletions

View File

@ -11,7 +11,7 @@ BuildRequires: scl-utils-build
%global gcc_major 14
# Note, gcc_release must be integer, if you want to add suffixes to
# %%{release}, append them after %%{gcc_release} on Release: line.
%global gcc_release 7
%global gcc_release 8
%global nvptx_tools_gitrev 87ce9dc5999e5fca2e1d3478a30888d9864c9804
%global newlib_cygwin_gitrev d45261f62a15f8abd94a1031020b9a9f455e4eed
%global isl_version 0.24
@ -152,7 +152,7 @@ BuildRequires: scl-utils-build
Summary: GCC version %{gcc_major}
Name: %{?scl_prefix}gcc
Version: %{gcc_version}
Release: %{gcc_release}.1%{?dist}
Release: %{gcc_release}%{?dist}
# License notes for some of the less obvious ones:
# gcc/doc/cppinternals.texi: Linux-man-pages-copyleft-2-para
# isl: MIT, BSD-2-Clause
@ -361,6 +361,8 @@ Patch3015: 0018-Use-CXX11-ABI.patch
Patch3017: 0020-more-fixes.patch
Patch3018: 0021-libstdc++-disable-tests.patch
Patch4000: gcc14-RHEL-49861.patch
%if 0%{?rhel} == 9
%global nonsharedver 110
%endif
@ -724,6 +726,9 @@ touch -r isl-0.24/m4/ax_prog_cxx_for_build.m4 isl-0.24/m4/ax_prog_cc_for_build.m
%patch -P3017 -p1 -b .dts-test-17~
%patch -P3018 -p1 -b .dts-test-18~
# Bugfix backports.
%patch -P4000 -p1 -b .RHEL-49861~
find gcc/testsuite -name \*.pr96939~ | xargs rm -f
echo 'Red Hat %{version}-%{gcc_release}' > gcc/DEV-PHASE
@ -2796,6 +2801,9 @@ fi
%endif
%changelog
* Thu May 22 2025 Siddhesh Poyarekar <siddhesh@redhat.com> 14.2.1-8
- libstdc++: Fix -Warray-bounds warning in std::vector<bool> (RHEL-49861)
* Fri Feb 7 2025 Marek Polacek <polacek@redhat.com> 14.2.1-7.1
- disable jQuery use, don't ship jquery.js (CVE-2020-11023, RHEL-78284)

81
gcc14-RHEL-49861.patch Normal file
View File

@ -0,0 +1,81 @@
From 9d5baaa92c6609191fd2488389562ac1ad1f0fb2 Mon Sep 17 00:00:00 2001
From: Jonathan Wakely <jwakely@redhat.com>
Date: Fri, 28 Mar 2025 15:41:41 +0000
Subject: [PATCH] libstdc++: Fix -Warray-bounds warning in std::vector<bool>
[PR110498]
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
In this case, we need to tell the compiler that the current size is not
larger than the new size so that all the existing elements can be copied
to the new storage. This avoids bogus warnings about overflowing the new
storage when the compiler can't tell that that cannot happen.
We might as well also hoist the loads of begin() and end() before the
allocation too. All callers will have loaded at least begin() before
calling _M_reallocate.
libstdc++-v3/ChangeLog:
PR libstdc++/110498
* include/bits/vector.tcc (vector<bool, A>::_M_reallocate):
Hoist loads of begin() and end() before allocation and use them
to state an unreachable condition.
* testsuite/23_containers/vector/bool/capacity/110498.cc: New
test.
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
(cherry picked from commit aa3aaf2bfb8fcc17076993df4297597b68bc5f60)
---
libstdc++-v3/include/bits/vector.tcc | 5 ++++-
.../vector/bool/capacity/110498.cc | 18 ++++++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
create mode 100644 libstdc++-v3/testsuite/23_containers/vector/bool/capacity/110498.cc
diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc
index dafc2a31a8b..c59c15beacd 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -1059,9 +1059,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
vector<bool, _Alloc>::
_M_reallocate(size_type __n)
{
+ const iterator __begin = begin(), __end = end();
+ if (size_type(__end - __begin) > __n)
+ __builtin_unreachable();
_Bit_pointer __q = this->_M_allocate(__n);
iterator __start(std::__addressof(*__q), 0);
- iterator __finish(_M_copy_aligned(begin(), end(), __start));
+ iterator __finish(_M_copy_aligned(__begin, __end, __start));
this->_M_deallocate();
this->_M_impl._M_start = __start;
this->_M_impl._M_finish = __finish;
diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/110498.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/110498.cc
new file mode 100644
index 00000000000..d2d09e10d19
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/110498.cc
@@ -0,0 +1,18 @@
+// { dg-options "-O3 -Werror=array-bounds" }
+// { dg-do compile }
+
+// Bug libstdc++/110498
+// Spurious warnings stringop-overflow and array-bounds copying data as bytes
+// into vector::reserve
+
+#include <vector>
+
+void f(std::vector<bool>& v)
+{
+ // Warning emitted when set to any number in the range [1,64].
+ const std::size_t reserve_size = 30;
+
+ v.reserve(reserve_size);
+ v.push_back(0);
+}
+
--
2.49.0