summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-12-14 18:10:13 +0000
committerZachary Turner <zturner@google.com>2018-12-14 18:10:13 +0000
commit8fb9a71dde4a2f738f4b77e990dd7ec93d87a889 (patch)
treeae8037dedf921e39a63223c2086321a8d14f7489
parentf47d8be7be9f519e6628b15d6c7f9e5af1496ad6 (diff)
downloadbcm5719-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.cpp18
-rw-r--r--llvm/test/Demangle/invalid-manglings.test5
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
OpenPOWER on IntegriCloud