From: Nick Desaulniers Date: Wed, 31 May 2023 16:44:13 +0000 (-0700) Subject: [Demangle] fix deref of std::string_view::end() X-Git-Tag: upstream/17.0.6~6602 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=54a2994fa8beb4f89bc3783b8f631f628a23e92c;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index 6eaf31e..68db8c6 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -3714,8 +3714,9 @@ Node *AbstractManglingParser::parseQualifiedType() { std::string_view ProtoSourceName(Qual.data() + Len, Qual.size() - Len); std::string_view Proto; { - ScopedOverride SaveFirst(First, &*ProtoSourceName.begin()), - SaveLast(Last, &*ProtoSourceName.end()); + ScopedOverride SaveFirst(First, + &*ProtoSourceName.begin()), + SaveLast(Last, &*ProtoSourceName.rbegin() + 1); Proto = parseBareSourceName(); } if (Proto.empty())