[gcc r14-11507] libstdc++: Fix -Warray-bounds warning in std::vector::resize [PR114945]
Jonathan Wakely
redi@gcc.gnu.org
Wed Apr 2 09:03:20 GMT 2025
https://gcc.gnu.org/g:6b11aed73f6601de32082a4519022d4de1ce8a8f
commit r14-11507-g6b11aed73f6601de32082a4519022d4de1ce8a8f
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Mon Mar 31 12:30:44 2025 +0100
libstdc++: Fix -Warray-bounds warning in std::vector::resize [PR114945]
This is yet another false positive warning fix. This time the compiler
can't prove that when the vector has sufficient excess capacity to
append new elements, the pointer to the existing storage is not null.
libstdc++-v3/ChangeLog:
PR libstdc++/114945
* include/bits/vector.tcc (vector::_M_default_append): Add
unreachable condition so the compiler knows that _M_finish is
not null.
* testsuite/23_containers/vector/capacity/114945.cc: New test.
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
(cherry picked from commit 844eed3364309bd20cbb7d6793a16b7c6b889ba4)
Diff:
---
libstdc++-v3/include/bits/vector.tcc | 3 ++
.../23_containers/vector/capacity/114945.cc | 36 ++++++++++++++++++++++
2 files changed, 39 insertions(+)
diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc
index 0458d560075f..0bd1ae411028 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -816,6 +816,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
if (__navail >= __n)
{
+ if (!this->_M_impl._M_finish)
+ __builtin_unreachable();
+
_GLIBCXX_ASAN_ANNOTATE_GROW(__n);
this->_M_impl._M_finish =
std::__uninitialized_default_n_a(this->_M_impl._M_finish,
diff --git a/libstdc++-v3/testsuite/23_containers/vector/capacity/114945.cc b/libstdc++-v3/testsuite/23_containers/vector/capacity/114945.cc
new file mode 100644
index 000000000000..daafc59d5a9d
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/capacity/114945.cc
@@ -0,0 +1,36 @@
+// { dg-options "-O2 -Werror=stringop-overflow -Werror=array-bounds" }
+// { dg-do compile { target c++11 } }
+
+// Bug libstdc++/114945
+// Sporadic std::vector::resize() -Wstringop-overflow or -Warray-bounds warning
+
+#include <stdint.h>
+#include <vector>
+template <typename a> struct b {
+ void resize(std::size_t c) { d.resize(c); }
+ template <typename e> void f(a, e);
+ std::vector<char> d;
+};
+#include <regex>
+std::regex g;
+uint64_t h;
+uint32_t i;
+struct s {
+ enum class j : size_t;
+ void k();
+ using l = b<j>;
+ std::vector<l> m;
+};
+enum class s::j : size_t { n };
+void o() { g = ""; }
+void s::k() {
+ l p;
+ auto q = uint32_t(), r = uint32_t();
+ if (h)
+ r = i;
+ b<size_t> t;
+ if (q || r)
+ p.f(j::n, 5);
+ t.resize(4);
+ m.push_back(p);
+}
More information about the Libstdc++-cvs
mailing list