[gcc r16-9361] libstdc++: Validate user-provided stride values for layout_stride.

Tomasz Kaminski via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <20260721153115.671F44BA2E04__27113.1041621388$1784647884$gmane$org@sourceware.org>
https://gcc.gnu.org/g:f13f153acb97ac491efa6c0df854f3de2dc68b51

commit r16-9361-gf13f153acb97ac491efa6c0df854f3de2dc68b51
Author: Tomasz Kamiński <[email protected]>
Date:   Fri Jul 3 14:41:02 2026 +0200

    libstdc++: Validate user-provided stride values for layout_stride.
    
    Converting the __strides values using __index_type_cast asserts
    that they are non-negative and each value is representable as
    index_type.
    
    libstdc++-v3/ChangeLog:
    
            * include/std/mdspan
            (layout_stride::mapping::mapping(const extent_type&, span<...>)):
            Convert strides using __index_type_cast, which bring asserts
            for negative and unrepresentable values.
            * testsuite/23_containers/mdspan/layouts/stride_neg.cc: New test.
    
    Reviewed-by: Jonathan Wakely <[email protected]>
    Signed-off-by: Tomasz Kamiński <[email protected]>
    (cherry picked from commit 0bcb57a2294fbadfa8388bdc3a5be356ad3cf91c)

Diff:
---
 libstdc++-v3/include/std/mdspan                    |  3 ++-
 .../23_containers/mdspan/layouts/stride_neg.cc     | 31 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index 7ee0c351ad96..b47b4de67b2b 100644
--- a/libstdc++-v3/include/std/mdspan
+++ b/libstdc++-v3/include/std/mdspan
@@ -1897,7 +1897,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	: _M_extents(__exts)
 	{
 	  for (size_t __i = 0; __i < extents_type::rank(); ++__i)
-	    _M_strides[__i] = index_type(as_const(__strides[__i]));
+	    _M_strides[__i] =
+	      __mdspan::__index_type_cast<index_type>(as_const(__strides[__i]));
 	}
 
       template<typename _OIndexType>
diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc
new file mode 100644
index 000000000000..153560bc82ff
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc
@@ -0,0 +1,31 @@
+// { dg-do compile { target c++23 } }
+#include <mdspan>
+
+#include "../layout_traits.h"
+#include <cstdint>
+
+constexpr size_t dyn = std::dynamic_extent;
+
+constexpr bool
+test_stride_overflow()
+{
+  auto exts = std::extents<uint8_t, dyn, dyn>(1, 3);
+  auto n = size_t(1) << 9;
+  auto m = std::layout_stride::mapping(exts, std::array{n, 1zu}); // { dg-error "expansion of" }
+  (void) m;
+  return true;
+}
+static_assert(test_stride_overflow()); // { dg-error "expansion of" }
+
+constexpr bool
+test_stride_negative()
+{
+  auto exts = std::extents<std::size_t, dyn, dyn>(1, 3);
+  auto m = std::layout_stride::mapping(exts, std::array{1, -4}); // { dg-error "expansion of" } 
+  (void) m;
+  return true;
+}
+static_assert(test_stride_negative()); // { dg-error "expansion of" } 
+
+// { dg-prune-output "non-constant condition for static assertion" }
+// { dg-prune-output "__glibcxx_assert_fail()" }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.