]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Add valid range checks to std::span constructors [PR98421]
authorJonathan Wakely <jwakely@redhat.com>
Tue, 31 Aug 2021 16:34:51 +0000 (17:34 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 31 Aug 2021 18:13:55 +0000 (19:13 +0100)
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

PR libstdc++/98421
* include/std/span (span(Iter, size_type), span(Iter, Iter)):
Add valid range checks.
* testsuite/23_containers/span/cons_1_assert_neg.cc: New test.
* testsuite/23_containers/span/cons_2_assert_neg.cc: New test.

libstdc++-v3/include/std/span
libstdc++-v3/testsuite/23_containers/span/cons_1_assert_neg.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/span/cons_2_assert_neg.cc [new file with mode: 0644]

index 21d8f6a43a6832b6b4b07aaad2fa712df970e0cf..be053e8ef382448b18c2684140e709a45bbc7f96 100644 (file)
@@ -160,6 +160,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
            {
              __glibcxx_assert(__count == _Extent);
            }
+         __glibcxx_requires_valid_range(__first, __first + __count);
        }
 
       template<contiguous_iterator _It, sized_sentinel_for<_It> _End>
@@ -175,6 +176,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
            {
              __glibcxx_assert((__last - __first) == _Extent);
            }
+         __glibcxx_requires_valid_range(__first, __last);
        }
 
       template<size_t _ArrayExtent>
diff --git a/libstdc++-v3/testsuite/23_containers/span/cons_1_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/cons_1_assert_neg.cc
new file mode 100644 (file)
index 0000000..2f55512
--- /dev/null
@@ -0,0 +1,14 @@
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { xfail *-*-* } }
+// { dg-require-effective-target c++2a }
+
+#undef _GLIBCXX_DEBUG
+#define _GLIBCXX_DEBUG
+#include <span>
+#include <vector>
+
+int main()
+{
+  std::vector<int> v(2);
+  std::span<int, std::dynamic_extent> s(v.begin(), 3);
+}
diff --git a/libstdc++-v3/testsuite/23_containers/span/cons_2_assert_neg.cc b/libstdc++-v3/testsuite/23_containers/span/cons_2_assert_neg.cc
new file mode 100644 (file)
index 0000000..efef0e6
--- /dev/null
@@ -0,0 +1,14 @@
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { xfail *-*-* } }
+// { dg-require-effective-target c++2a }
+
+#undef _GLIBCXX_DEBUG
+#define _GLIBCXX_DEBUG
+#include <span>
+#include <vector>
+
+int main()
+{
+  std::vector<int> v(2), w(1);
+  std::span<int, std::dynamic_extent> s(v.begin(), w.end());
+}