diff options
author | Nick Desaulniers <ndesaulniers@google.com> | 2023-06-02 14:53:46 -0700 |
---|---|---|
committer | Nick Desaulniers <ndesaulniers@google.com> | 2023-06-02 14:53:49 -0700 |
commit | 61e1c3d80db6e94e8b5b83b3819afefeec4d357b (patch) | |
tree | da734d13540b240a385abf5746732140ef12a502 /llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp | |
parent | fa98bdbd95d14959d3c6c09a4c29ba0d974883dd (diff) | |
download | llvm-61e1c3d80db6e94e8b5b83b3819afefeec4d357b.zip llvm-61e1c3d80db6e94e8b5b83b3819afefeec4d357b.tar.gz llvm-61e1c3d80db6e94e8b5b83b3819afefeec4d357b.tar.bz2 |
[Demangle] convert itaniumDemangle and nonMicrosoftDemangle to use std::string_view
D149104 converted llvm::demangle to use std::string_view. Enabling
"expensive checks" (via -DLLVM_ENABLE_EXPENSIVE_CHECKS=ON) causes
lld/test/wasm/why-extract.s to fail. The reason for this is obscure:
Reason #10007 why std::string_view is dangerous:
Consider the following pattern:
std::string_view s = ...;
const char *c = s.data();
std::strlen(c);
Is c a NUL-terminated C style string? It depends; but if it's not then
it's not safe to call std::strlen on the std::string_view::data().
std::string_view::length() should be used instead.
Fixing this fixes the one lone test that caught this.
microsoftDemangle, rustDemangle, and dlangDemangle should get this same
treatment, too. I will do that next.
Reviewed By: MaskRay, efriedma
Differential Revision: https://reviews.llvm.org/D149675
Diffstat (limited to 'llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp')
-rw-r--r-- | llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp index 109c1b2..2bbd57f 100644 --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -8,6 +8,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/Demangle/Demangle.h" +#include "llvm/Demangle/StringViewExtras.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" #include "llvm/Option/Option.h" @@ -71,10 +72,11 @@ static void error(const Twine &Message) { } static std::string demangle(const std::string &Mangled) { - const char *DecoratedStr = Mangled.c_str(); + using llvm::itanium_demangle::starts_with; + std::string_view DecoratedStr = Mangled; if (StripUnderscore) if (DecoratedStr[0] == '_') - ++DecoratedStr; + DecoratedStr.remove_prefix(1); std::string Result; if (nonMicrosoftDemangle(DecoratedStr, Result)) @@ -86,9 +88,9 @@ static std::string demangle(const std::string &Mangled) { if (Types) Undecorated = itaniumDemangle(DecoratedStr); - if (!Undecorated && strncmp(DecoratedStr, "__imp_", 6) == 0) { + if (!Undecorated && starts_with(DecoratedStr, "__imp_")) { Prefix = "import thunk for "; - Undecorated = itaniumDemangle(DecoratedStr + 6); + Undecorated = itaniumDemangle(DecoratedStr.substr(6)); } Result = Undecorated ? Prefix + Undecorated : Mangled; |