[llvm] 54a2994 - [Demangle] fix deref of std::string_view::end()
Nick Desaulniers via llvm-commits
llvm-commits at lists.llvm.org
Wed May 31 09:49:46 PDT 2023
Author: Nick Desaulniers
Date: 2023-05-31T09:49:36-07:00
New Revision: 54a2994fa8beb4f89bc3783b8f631f628a23e92c
URL: https://github.com/llvm/llvm-project/commit/54a2994fa8beb4f89bc3783b8f631f628a23e92c
DIFF: https://github.com/llvm/llvm-project/commit/54a2994fa8beb4f89bc3783b8f631f628a23e92c.diff
LOG: [Demangle] fix deref of std::string_view::end()
In D148546, I replaced much of the use of llvm::StringView w/
std::string_view. There's one important semantic difference between the
two:
In most STL containers, end() returns an iterator that refers to one
past the end of the container. But llvm::StringView::end() refers to the
last element.
Expressions such as `&*my_std_string_view.end()` produce the failed
assertion:
include/c++/v1/__iterator/bounded_iter.h:93: assertion
__in_bounds(__current_) failed: __bounded_iter::operator*: Attempt to
dereference an out-of-range iterator
This was caught when copying the recent downstream changes back upstream
in D148566, and is reproducible via:
$ libcxx/utils/ci/run-buildbot generic-debug-mode
when compiled with clang and clang++. The correct way to get the same
value as before without dereferencing invalid iterators is to prefer
`&*my_std_string_view.rbegin() + 1`.
Fix this downstream so that I might copy it back upstream in D148566.
The other instance of `&*my_std_string_view.end()` that I introduced in
D148546 has been fixed already in D149061.
Reviewed By: ashay-github
Differential Revision: https://reviews.llvm.org/D151760
Added:
Modified:
llvm/include/llvm/Demangle/ItaniumDemangle.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index 6eaf31e0dea44..68db8c62a29e5 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -3714,8 +3714,9 @@ Node *AbstractManglingParser<Derived, Alloc>::parseQualifiedType() {
std::string_view ProtoSourceName(Qual.data() + Len, Qual.size() - Len);
std::string_view Proto;
{
- ScopedOverride<const char *> SaveFirst(First, &*ProtoSourceName.begin()),
- SaveLast(Last, &*ProtoSourceName.end());
+ ScopedOverride<const char *> SaveFirst(First,
+ &*ProtoSourceName.begin()),
+ SaveLast(Last, &*ProtoSourceName.rbegin() + 1);
Proto = parseBareSourceName();
}
if (Proto.empty())
More information about the llvm-commits
mailing list