[llvm] r338607 - [MS Demangler] Don't crash as often when demangling.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 1 11:32:29 PDT 2018


Author: zturner
Date: Wed Aug  1 11:32:28 2018
New Revision: 338607

URL: http://llvm.org/viewvc/llvm-project?rev=338607&view=rev
Log:
[MS Demangler] Don't crash as often when demangling.

We crash a lot on unrecognized inputs.  This adds some error
handling so we early out when we get unrecognized names.

Modified:
    llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp

Modified: llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp?rev=338607&r1=338606&r2=338607&view=diff
==============================================================================
--- llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp (original)
+++ llvm/trunk/lib/Demangle/MicrosoftDemangle.cpp Wed Aug  1 11:32:28 2018
@@ -978,11 +978,14 @@ Symbol *Demangler::parse(StringView &Man
   // What follows is a main symbol name. This may include
   // namespaces or class BackReferences.
   S->SymbolName = demangleFullyQualifiedSymbolName(MangledName);
-
+  if (Error)
+    return nullptr;
   // Read a variable.
   S->SymbolType = startsWithDigit(MangledName)
                       ? demangleVariableEncoding(MangledName)
                       : demangleFunctionEncoding(MangledName);
+  if (Error)
+    return nullptr;
 
   return S;
 }
@@ -1103,7 +1106,12 @@ Name *Demangler::demangleClassTemplateNa
   MangledName.consumeFront("?$");
 
   Name *Node = demangleSimpleName(MangledName, false);
+  if (Error)
+    return nullptr;
+
   Node->TParams = demangleTemplateParameterList(MangledName);
+  if (Error)
+    return nullptr;
 
   // Render this class template name into a string buffer so that we can
   // memorize it for the purpose of back-referencing.
@@ -1318,9 +1326,13 @@ Name *Demangler::demangleLocallyScopedNa
 // Parses a type name in the form of A at B@C@@ which represents C::B::A.
 Name *Demangler::demangleFullyQualifiedTypeName(StringView &MangledName) {
   Name *TypeName = demangleUnqualifiedTypeName(MangledName);
+  if (Error)
+    return nullptr;
   assert(TypeName);
 
   Name *QualName = demangleNameScopeChain(MangledName, TypeName);
+  if (Error)
+    return nullptr;
   assert(QualName);
   return QualName;
 }
@@ -1330,9 +1342,13 @@ Name *Demangler::demangleFullyQualifiedT
 // so we separate out the implementations for flexibility.
 Name *Demangler::demangleFullyQualifiedSymbolName(StringView &MangledName) {
   Name *SymbolName = demangleUnqualifiedSymbolName(MangledName);
+  if (Error)
+    return nullptr;
   assert(SymbolName);
 
   Name *QualName = demangleNameScopeChain(MangledName, SymbolName);
+  if (Error)
+    return nullptr;
   assert(QualName);
   return QualName;
 }
@@ -1964,9 +1980,7 @@ Demangler::demangleTemplateParameterList
     // Empty parameter pack.
     if (MangledName.consumeFront("$S") || MangledName.consumeFront("$$V") ||
         MangledName.consumeFront("$$$V")) {
-      if (!MangledName.startsWith('@'))
-        Error = true;
-      continue;
+      break;
     }
 
     if (MangledName.consumeFront("$$Y")) {
@@ -1980,19 +1994,21 @@ Demangler::demangleTemplateParameterList
       (*Current)->ParamType =
           demangleType(MangledName, QualifierMangleMode::Drop);
     }
+    if (Error)
+      return nullptr;
 
     Current = &(*Current)->Next;
   }
 
   if (Error)
-    return {};
+    return nullptr;
 
   // Template parameter lists cannot be variadic, so it can only be terminated
   // by @.
   if (MangledName.consumeFront('@'))
     return Head;
   Error = true;
-  return {};
+  return nullptr;
 }
 
 void Demangler::output(const Symbol *S, OutputStream &OS) {
@@ -2024,13 +2040,15 @@ char *llvm::microsoftDemangle(const char
   StringView Name{MangledName};
   Symbol *S = D.parse(Name);
 
-  if (D.Error)
+  OutputStream OS = OutputStream::create(Buf, N, 1024);
+  if (D.Error) {
+    OS << MangledName;
     *Status = llvm::demangle_invalid_mangled_name;
-  else
+  } else {
+    D.output(S, OS);
     *Status = llvm::demangle_success;
+  }
 
-  OutputStream OS = OutputStream::create(Buf, N, 1024);
-  D.output(S, OS);
   OS << '\0';
   return OS.getBuffer();
 }




More information about the llvm-commits mailing list