diff options
| author | Zachary Turner <zturner@google.com> | 2018-12-14 18:10:13 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2018-12-14 18:10:13 +0000 |
| commit | 8fb9a71dde4a2f738f4b77e990dd7ec93d87a889 (patch) | |
| tree | ae8037dedf921e39a63223c2086321a8d14f7489 | |
| parent | f47d8be7be9f519e6628b15d6c7f9e5af1496ad6 (diff) | |
| download | bcm5719-llvm-8fb9a71dde4a2f738f4b77e990dd7ec93d87a889.tar.gz bcm5719-llvm-8fb9a71dde4a2f738f4b77e990dd7ec93d87a889.zip | |
[MS Demangler] Fail gracefully on invalid pointer types.
Once we detect a 'P', we know we a pointer type is upcoming, so
we make some assumptions about the output that follows. If those
assumptions didn't hold, we would assert. Instead, we should
fail gracefully and propagate the error up.
llvm-svn: 349169
| -rw-r--r-- | llvm/lib/Demangle/MicrosoftDemangle.cpp | 18 | ||||
| -rw-r--r-- | llvm/test/Demangle/invalid-manglings.test | 5 |
2 files changed, 17 insertions, 6 deletions
diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index c486652e732..cca7bf95a7e 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -40,7 +40,8 @@ struct NodeList { NodeList *Next = nullptr; }; -static bool isMemberPointer(StringView MangledName) { +static bool isMemberPointer(StringView MangledName, bool &Error) { + Error = false; switch (MangledName.popFront()) { case '$': // This is probably an rvalue reference (e.g. $$Q), and you cannot have an @@ -58,7 +59,8 @@ static bool isMemberPointer(StringView MangledName) { // what. break; default: - assert(false && "Ty is not a pointer type!"); + Error = true; + return false; } // If it starts with a number, then 6 indicates a non-member function @@ -89,9 +91,9 @@ static bool isMemberPointer(StringView MangledName) { case 'T': return true; default: - assert(false); + Error = true; + return false; } - return false; } static SpecialIntrinsicKind @@ -1651,10 +1653,12 @@ TypeNode *Demangler::demangleType(StringView &MangledName, if (isTagType(MangledName)) Ty = demangleClassType(MangledName); else if (isPointerType(MangledName)) { - if (isMemberPointer(MangledName)) + if (isMemberPointer(MangledName, Error)) Ty = demangleMemberPointerType(MangledName); - else + else if (!Error) Ty = demanglePointerType(MangledName); + else + return nullptr; } else if (isArrayType(MangledName)) Ty = demangleArrayType(MangledName); else if (isFunctionType(MangledName)) { @@ -1988,6 +1992,8 @@ Demangler::demangleFunctionParameterList(StringView &MangledName) { *Current = Arena.alloc<NodeList>(); TypeNode *TN = demangleType(MangledName, QualifierMangleMode::Drop); + if (!TN || Error) + return nullptr; (*Current)->N = TN; diff --git a/llvm/test/Demangle/invalid-manglings.test b/llvm/test/Demangle/invalid-manglings.test index 7f996b7aa9b..365b14cd1a5 100644 --- a/llvm/test/Demangle/invalid-manglings.test +++ b/llvm/test/Demangle/invalid-manglings.test @@ -4,3 +4,8 @@ ?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z ; CHECK: ?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z ; CHECK-NEXT: error: Invalid mangled name + +?f0@@YAXPEU?$AS_@$00$$CAD@__clang@@@Z +; CHECK-EMPTY: +; CHECK-NEXT: ?f0@@YAXPEU?$AS_@$00$$CAD@__clang@@@Z +; CHECK-NEXT: error: Invalid mangled name
\ No newline at end of file |

