diff options
author | FalseIlyu <ilyulemail@gmail.com> | 2025-05-08 18:01:55 +0200 |
---|---|---|
committer | FalseIlyu <ilyulemail@gmail.com> | 2025-05-16 10:25:41 +0200 |
commit | 14109a5caa4a4c9b54e3d2749d2212d519951f00 (patch) | |
tree | a4afa5aaba57312af0f34155a231b5452f173968 /source/core/StarStringView.cpp | |
parent | da281a0c5286014f952b5a8ce2f346f99c114089 (diff) |
UB trying to dereference end of string view
Diffstat (limited to 'source/core/StarStringView.cpp')
-rw-r--r-- | source/core/StarStringView.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/source/core/StarStringView.cpp b/source/core/StarStringView.cpp index 2bc9cd5..535d350 100644 --- a/source/core/StarStringView.cpp +++ b/source/core/StarStringView.cpp @@ -113,8 +113,11 @@ bool StringView::beginsWith(StringView beg, CaseSensitivity cs) const { auto it = begin(); auto itEnd = end(); for (size_t i = 0; i != begSize; ++i) - if (it++ == itEnd) + { + if (it == itEnd) return false; + it++; + } return compare(0, begSize, beg, 0, NPos, cs) == 0; } @@ -352,18 +355,20 @@ StringView StringView::substr(size_t position, size_t n) const { auto it = begin(); for (size_t i = 0; i != position; ++i) { - if (it++ == itEnd) + if (it == itEnd) throw OutOfRangeException(strf("out of range in StringView::substr({}, {})", position, n)); + it++; } - const char* start = &*it.base(); + const auto itStart = it; for (size_t i = 0; i != n; ++i) { - if (it++ == itEnd) - return StringView(start, &*it.base() - start - 1); + if (it == itEnd) + break; + ++it; } - return StringView(start, &*it.base() - start); + return StringView(&*itStart.base(), it.base() - itStart.base()); } int StringView::compare(size_t selfOffset, size_t selfLen, StringView other, |