aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakhropov <akhropov@yandex-team.com>2024-12-18 22:54:51 +0300
committerakhropov <akhropov@yandex-team.com>2024-12-18 23:11:30 +0300
commit3a12c740b711f812b47062086b390345479f113c (patch)
tree66cc9137b0515566a9eab7c62a27f944f5ce1b64
parentf7f8a1dcd4b4b4a1af7acc6d8127d285c3850795 (diff)
downloadydb-3a12c740b711f812b47062086b390345479f113c.tar.gz
Add assertions for range bounds validity
commit_hash:4417c6200b3fc4e3e6e61648412d263366935fdf
-rw-r--r--util/generic/array_ref.h3
-rw-r--r--util/generic/buffer.h5
-rw-r--r--util/generic/iterator.h8
-rw-r--r--util/generic/strbuf.h7
-rw-r--r--util/generic/string.h5
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 {