[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