diff options
author | akhropov <akhropov@yandex-team.com> | 2024-12-18 22:54:51 +0300 |
---|---|---|
committer | akhropov <akhropov@yandex-team.com> | 2024-12-18 23:11:30 +0300 |
commit | 3a12c740b711f812b47062086b390345479f113c (patch) | |
tree | 66cc9137b0515566a9eab7c62a27f944f5ce1b64 | |
parent | f7f8a1dcd4b4b4a1af7acc6d8127d285c3850795 (diff) | |
download | ydb-3a12c740b711f812b47062086b390345479f113c.tar.gz |
Add assertions for range bounds validity
commit_hash:4417c6200b3fc4e3e6e61648412d263366935fdf
-rw-r--r-- | util/generic/array_ref.h | 3 | ||||
-rw-r--r-- | util/generic/buffer.h | 5 | ||||
-rw-r--r-- | util/generic/iterator.h | 8 | ||||
-rw-r--r-- | util/generic/strbuf.h | 7 | ||||
-rw-r--r-- | util/generic/string.h | 5 |
5 files changed, 22 insertions, 6 deletions
diff --git a/util/generic/array_ref.h b/util/generic/array_ref.h index 2e62071be80..bf756d04539 100644 --- a/util/generic/array_ref.h +++ b/util/generic/array_ref.h @@ -1,5 +1,6 @@ #pragma once +#include <util/generic/iterator.h> #include <util/generic/yexception.h> #include <algorithm> @@ -49,7 +50,7 @@ public: constexpr inline TArrayRef(T* begin Y_LIFETIME_BOUND, T* end Y_LIFETIME_BOUND) noexcept : T_(begin) - , S_(end - begin) + , S_(NonNegativeDistance(begin, end)) { } diff --git a/util/generic/buffer.h b/util/generic/buffer.h index 4f82314a7a6..646d7feeab4 100644 --- a/util/generic/buffer.h +++ b/util/generic/buffer.h @@ -1,5 +1,6 @@ #pragma once +#include "iterator.h" #include "utility.h" #include <util/generic/fwd.h> @@ -57,7 +58,7 @@ public: } inline void Assign(const char* b, const char* e) { - Assign(b, e - b); + Assign(b, NonNegativeDistance(b, e)); } inline char* Data() noexcept { @@ -96,7 +97,7 @@ public: void Append(const char* buf, size_t len); inline void Append(const char* b, const char* e) { - Append(b, e - b); + Append(b, NonNegativeDistance(b, e)); } inline void Append(char ch) { diff --git a/util/generic/iterator.h b/util/generic/iterator.h index 19e9d20976d..fc46a36454f 100644 --- a/util/generic/iterator.h +++ b/util/generic/iterator.h @@ -1,5 +1,7 @@ #pragma once +#include <util/system/yassert.h> + #include <iterator> #include <utility> @@ -137,3 +139,9 @@ template <class TIterator> auto ToForwardIterator(TIterator iter) { return std::next(iter).base(); } + +template <class T> +constexpr inline size_t NonNegativeDistance(T* b, T* e) noexcept { + Y_ASSERT(e >= b); + return e - b; +} diff --git a/util/generic/strbuf.h b/util/generic/strbuf.h index 06e27550e6c..920b22123eb 100644 --- a/util/generic/strbuf.h +++ b/util/generic/strbuf.h @@ -1,6 +1,7 @@ #pragma once #include "fwd.h" +#include "iterator.h" #include "strbase.h" #include "utility.h" #include "typetraits.h" @@ -116,7 +117,11 @@ public: } constexpr inline TBasicStringBuf(const TCharType* beg Y_LIFETIME_BOUND, const TCharType* end Y_LIFETIME_BOUND) noexcept - : TStringView(beg, end - beg) +#if __cplusplus >= 202002L && __cpp_lib_string_view >= 201803L && !defined(_LIBCPP_HAS_NO_CONCEPTS) + : TStringView(beg, end) +#else + : TStringView(beg, NonNegativeDistance(beg, end)) +#endif { } diff --git a/util/generic/string.h b/util/generic/string.h index 2d112522408..f1d3cf32652 100644 --- a/util/generic/string.h +++ b/util/generic/string.h @@ -11,6 +11,7 @@ #include <util/system/compiler.h> #include <util/system/yassert.h> +#include "iterator.h" #include "ptr.h" #include "utility.h" #include "explicit_type.h" @@ -519,7 +520,7 @@ public: } TBasicString(const TCharType* b, const TCharType* e) - : TBasicString(b, e - b) + : TBasicString(b, NonNegativeDistance(b, e)) { } @@ -656,7 +657,7 @@ public: } TBasicString& assign(const TCharType* first, const TCharType* last) Y_LIFETIME_BOUND { - return assign(first, last - first); + return assign(first, NonNegativeDistance(first, last)); } TBasicString& assign(const TCharType* pc, size_t pos, size_t n) Y_LIFETIME_BOUND { |