[llvm] r349169 - [MS Demangler] Fail gracefully on invalid pointer types.
Zachary Turner via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 14 10:10:13 PST 2018
Author: zturner
Date: Fri Dec 14 10:10:13 2018
New Revision: 349169
URL: http://llvm.org/viewvc/llvm-project?rev=349169&view=rev
Log:
[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.
Modified:
llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp
llvm/trunk/test/Demangle/invalid-manglings.test
Modified: llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp?rev=349169&r1=349168&r2=349169&view=diff
==============================================================================
--- llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp (original)
+++ llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp Fri Dec 14 10:10:13 2018
@@ -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 M
// 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 M
case 'T':
return true;
default:
- assert(false);
+ Error = true;
+ return false;
}
- return false;
}
static SpecialIntrinsicKind
@@ -1651,10 +1653,12 @@ TypeNode *Demangler::demangleType(String
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
*Current = Arena.alloc<NodeList>();
TypeNode *TN = demangleType(MangledName, QualifierMangleMode::Drop);
+ if (!TN || Error)
+ return nullptr;
(*Current)->N = TN;
Modified: llvm/trunk/test/Demangle/invalid-manglings.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Demangle/invalid-manglings.test?rev=349169&r1=349168&r2=349169&view=diff
==============================================================================
--- llvm/trunk/test/Demangle/invalid-manglings.test (original)
+++ llvm/trunk/test/Demangle/invalid-manglings.test Fri Dec 14 10:10:13 2018
@@ -4,3 +4,8 @@
?ff@@$$J0YAXAU?$AS_@$0A at PEAU?$AS_@$0A at H@__clang@@@__clang@@@Z
; CHECK: ?ff@@$$J0YAXAU?$AS_@$0A at PEAU?$AS_@$0A at H@__clang@@@__clang@@@Z
; CHECK-NEXT: error: Invalid mangled name
+
+?f0@@YAXPEU?$AS_@$00$$CAD at __clang@@@Z
+; CHECK-EMPTY:
+; CHECK-NEXT: ?f0@@YAXPEU?$AS_@$00$$CAD at __clang@@@Z
+; CHECK-NEXT: error: Invalid mangled name
\ No newline at end of file
More information about the llvm-commits
mailing list