[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
This commit is contained in:
Zachary Turner 2018-12-14 18:10:13 +00:00
parent 6d3b7f4c22
commit 0a0be9b76e
2 changed files with 17 additions and 6 deletions

View File

@ -40,7 +40,8 @@ struct NodeList {
NodeList *Next = nullptr; NodeList *Next = nullptr;
}; };
static bool isMemberPointer(StringView MangledName) { static bool isMemberPointer(StringView MangledName, bool &Error) {
Error = false;
switch (MangledName.popFront()) { switch (MangledName.popFront()) {
case '$': case '$':
// This is probably an rvalue reference (e.g. $$Q), and you cannot have an // This is probably an rvalue reference (e.g. $$Q), and you cannot have an
@ -58,7 +59,8 @@ static bool isMemberPointer(StringView MangledName) {
// what. // what.
break; break;
default: 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 // If it starts with a number, then 6 indicates a non-member function
@ -89,9 +91,9 @@ static bool isMemberPointer(StringView MangledName) {
case 'T': case 'T':
return true; return true;
default: default:
assert(false); Error = true;
return false;
} }
return false;
} }
static SpecialIntrinsicKind static SpecialIntrinsicKind
@ -1651,10 +1653,12 @@ TypeNode *Demangler::demangleType(StringView &MangledName,
if (isTagType(MangledName)) if (isTagType(MangledName))
Ty = demangleClassType(MangledName); Ty = demangleClassType(MangledName);
else if (isPointerType(MangledName)) { else if (isPointerType(MangledName)) {
if (isMemberPointer(MangledName)) if (isMemberPointer(MangledName, Error))
Ty = demangleMemberPointerType(MangledName); Ty = demangleMemberPointerType(MangledName);
else else if (!Error)
Ty = demanglePointerType(MangledName); Ty = demanglePointerType(MangledName);
else
return nullptr;
} else if (isArrayType(MangledName)) } else if (isArrayType(MangledName))
Ty = demangleArrayType(MangledName); Ty = demangleArrayType(MangledName);
else if (isFunctionType(MangledName)) { else if (isFunctionType(MangledName)) {
@ -1988,6 +1992,8 @@ Demangler::demangleFunctionParameterList(StringView &MangledName) {
*Current = Arena.alloc<NodeList>(); *Current = Arena.alloc<NodeList>();
TypeNode *TN = demangleType(MangledName, QualifierMangleMode::Drop); TypeNode *TN = demangleType(MangledName, QualifierMangleMode::Drop);
if (!TN || Error)
return nullptr;
(*Current)->N = TN; (*Current)->N = TN;

View File

@ -4,3 +4,8 @@
?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z ?ff@@$$J0YAXAU?$AS_@$0A@PEAU?$AS_@$0A@H@__clang@@@__clang@@@Z
; CHECK: ?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 ; 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