From 5275598bb737911f121060eb53b29987423e7578 Mon Sep 17 00:00:00 2001 From: Michael Bloom Date: Wed, 14 Feb 2024 15:35:24 -0500 Subject: [PATCH 1/4] In subspan function, add static checks on extents --- include/etl/span.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/etl/span.h b/include/etl/span.h index 797e35e5e..bcdb6a22f 100644 --- a/include/etl/span.h +++ b/include/etl/span.h @@ -331,6 +331,12 @@ namespace etl ETL_NODISCARD ETL_CONSTEXPR etl::span subspan() const ETL_NOEXCEPT { + //if extent is static, check that OFFSET is within the original span + static_assert((extent != etl::dynamic_extent) ? OFFSET <= extent : true); + + //if count is also static, check that OFFSET + COUNT is within the original span + static_assert((extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (extent - OFFSET) : true); + return (COUNT == etl::dynamic_extent) ? etl::span(pbegin + OFFSET, (pbegin + Extent)) : etl::span(pbegin + OFFSET, pbegin + OFFSET + COUNT); } From f35ebfa1df80960a3ca5cbdf6461ca523bfc3232 Mon Sep 17 00:00:00 2001 From: Michael Bloom Date: Thu, 15 Feb 2024 09:23:34 -0500 Subject: [PATCH 2/4] Change to ETL_STATIC_ASSERT. Add static assert for first and last functions --- include/etl/span.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/include/etl/span.h b/include/etl/span.h index bcdb6a22f..1c40d4f1f 100644 --- a/include/etl/span.h +++ b/include/etl/span.h @@ -42,6 +42,7 @@ SOFTWARE. #include "memory.h" #include "array.h" #include "byte.h" +#include "static_assert.h" #include "private/dynamic_extent.h" @@ -295,6 +296,9 @@ namespace etl template ETL_NODISCARD ETL_CONSTEXPR etl::span first() const ETL_NOEXCEPT { + //if extent is static, check that original span contains at least COUNT elements + ETL_STATIC_ASSERT((extent != etl::dynamic_extent) ? COUNT <= extent : true, "Original span does not contain COUNT elements"); + return etl::span(pbegin, pbegin + COUNT); } @@ -312,6 +316,9 @@ namespace etl template ETL_NODISCARD ETL_CONSTEXPR etl::span last() const ETL_NOEXCEPT { + //if extent is static, check that original span contains at least COUNT elements + ETL_STATIC_ASSERT((extent != etl::dynamic_extent) ? COUNT <= extent : true, "Original span does not contain COUNT elements"); + return etl::span(pbegin + Extent - COUNT, (pbegin + Extent)); } @@ -332,10 +339,10 @@ namespace etl etl::span subspan() const ETL_NOEXCEPT { //if extent is static, check that OFFSET is within the original span - static_assert((extent != etl::dynamic_extent) ? OFFSET <= extent : true); + ETL_STATIC_ASSERT((extent != etl::dynamic_extent) ? OFFSET <= extent : true, "OFFSET is not within the original span"); //if count is also static, check that OFFSET + COUNT is within the original span - static_assert((extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (extent - OFFSET) : true); + ETL_STATIC_ASSERT((extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (extent - OFFSET) : true, "OFFSET + COUNT is not within the original span"); return (COUNT == etl::dynamic_extent) ? etl::span(pbegin + OFFSET, (pbegin + Extent)) : etl::span(pbegin + OFFSET, pbegin + OFFSET + COUNT); From 8bad0ea19097644434d78976b3cb4ee8c5d81b51 Mon Sep 17 00:00:00 2001 From: Michael Bloom Date: Thu, 15 Feb 2024 12:47:52 -0500 Subject: [PATCH 3/4] Add static assert to pre c++11 subspan --- include/etl/span.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/etl/span.h b/include/etl/span.h index 1c40d4f1f..0bd3f1c1b 100644 --- a/include/etl/span.h +++ b/include/etl/span.h @@ -354,6 +354,12 @@ namespace etl template etl::span subspan() const { + //if extent is static, check that OFFSET is within the original span + ETL_STATIC_ASSERT((extent != etl::dynamic_extent) ? OFFSET <= extent : true, "OFFSET is not within the original span"); + + //if count is also static, check that OFFSET + COUNT is within the original span + ETL_STATIC_ASSERT((extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (extent - OFFSET) : true, "OFFSET + COUNT is not within the original span"); + if (COUNT == etl::dynamic_extent) { return etl::span(pbegin + OFFSET, (pbegin + Extent)); From 5767899d85f2b1c23498f5616ca8722f8ef63f4d Mon Sep 17 00:00:00 2001 From: Michael Bloom Date: Thu, 15 Feb 2024 13:55:34 -0500 Subject: [PATCH 4/4] Change extent to Extent to better match existing code --- include/etl/span.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/include/etl/span.h b/include/etl/span.h index 0bd3f1c1b..2caa38975 100644 --- a/include/etl/span.h +++ b/include/etl/span.h @@ -296,8 +296,8 @@ namespace etl template ETL_NODISCARD ETL_CONSTEXPR etl::span first() const ETL_NOEXCEPT { - //if extent is static, check that original span contains at least COUNT elements - ETL_STATIC_ASSERT((extent != etl::dynamic_extent) ? COUNT <= extent : true, "Original span does not contain COUNT elements"); + //if Extent is static, check that original span contains at least COUNT elements + ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) ? COUNT <= Extent : true, "Original span does not contain COUNT elements"); return etl::span(pbegin, pbegin + COUNT); } @@ -316,8 +316,8 @@ namespace etl template ETL_NODISCARD ETL_CONSTEXPR etl::span last() const ETL_NOEXCEPT { - //if extent is static, check that original span contains at least COUNT elements - ETL_STATIC_ASSERT((extent != etl::dynamic_extent) ? COUNT <= extent : true, "Original span does not contain COUNT elements"); + //if Extent is static, check that original span contains at least COUNT elements + ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) ? COUNT <= Extent : true, "Original span does not contain COUNT elements"); return etl::span(pbegin + Extent - COUNT, (pbegin + Extent)); } @@ -338,11 +338,11 @@ namespace etl ETL_NODISCARD ETL_CONSTEXPR etl::span subspan() const ETL_NOEXCEPT { - //if extent is static, check that OFFSET is within the original span - ETL_STATIC_ASSERT((extent != etl::dynamic_extent) ? OFFSET <= extent : true, "OFFSET is not within the original span"); + //if Extent is static, check that OFFSET is within the original span + ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) ? OFFSET <= Extent : true, "OFFSET is not within the original span"); //if count is also static, check that OFFSET + COUNT is within the original span - ETL_STATIC_ASSERT((extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (extent - OFFSET) : true, "OFFSET + COUNT is not within the original span"); + ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) : true, "OFFSET + COUNT is not within the original span"); return (COUNT == etl::dynamic_extent) ? etl::span(pbegin + OFFSET, (pbegin + Extent)) : etl::span(pbegin + OFFSET, pbegin + OFFSET + COUNT); @@ -354,11 +354,11 @@ namespace etl template etl::span subspan() const { - //if extent is static, check that OFFSET is within the original span - ETL_STATIC_ASSERT((extent != etl::dynamic_extent) ? OFFSET <= extent : true, "OFFSET is not within the original span"); + //if Extent is static, check that OFFSET is within the original span + ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) ? OFFSET <= Extent : true, "OFFSET is not within the original span"); //if count is also static, check that OFFSET + COUNT is within the original span - ETL_STATIC_ASSERT((extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (extent - OFFSET) : true, "OFFSET + COUNT is not within the original span"); + ETL_STATIC_ASSERT((Extent != etl::dynamic_extent) && (COUNT != etl::dynamic_extent) ? COUNT <= (Extent - OFFSET) : true, "OFFSET + COUNT is not within the original span"); if (COUNT == etl::dynamic_extent) {