[llvm] r358485 - llvm-undname: Add a -raw-file flag to pass a raw buffer to microsoftDemangle

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 16 05:51:40 PDT 2019


Author: nico
Date: Tue Apr 16 05:51:40 2019
New Revision: 358485

URL: http://llvm.org/viewvc/llvm-project?rev=358485&view=rev
Log:
llvm-undname: Add a -raw-file flag to pass a raw buffer to microsoftDemangle

The default handling splits input into lines. Since
llvm-microsoft-demangle-fuzzer doesn't do this, oss-fuzz produces inputs
that only trigger crashes if the input isn't split into lines. This adds
a hidden flag -raw-file which passes file contents to microsoftDemangle() in
the same way the fuzzer does, for reproducing oss-fuzz reports.

Also change llvm-undname to have a non-0 exit code for invalid symbols.

Differential Revision: https://reviews.llvm.org/D60771

Modified:
    llvm/trunk/tools/llvm-undname/llvm-undname.cpp

Modified: llvm/trunk/tools/llvm-undname/llvm-undname.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-undname/llvm-undname.cpp?rev=358485&r1=358484&r2=358485&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-undname/llvm-undname.cpp (original)
+++ llvm/trunk/tools/llvm-undname/llvm-undname.cpp Tue Apr 16 05:51:40 2019
@@ -15,7 +15,9 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Demangle/Demangle.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/ErrorOr.h"
 #include "llvm/Support/InitLLVM.h"
+#include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Process.h"
 #include "llvm/Support/WithColor.h"
 #include "llvm/Support/raw_ostream.h"
@@ -29,10 +31,12 @@ using namespace llvm;
 cl::opt<bool> DumpBackReferences("backrefs", cl::Optional,
                                  cl::desc("dump backreferences"), cl::Hidden,
                                  cl::init(false));
+cl::opt<std::string> RawFile("raw-file", cl::Optional,
+                             cl::desc("for fuzzer data"), cl::Hidden);
 cl::list<std::string> Symbols(cl::Positional, cl::desc("<input symbols>"),
                               cl::ZeroOrMore);
 
-static void msDemangle(const std::string &S) {
+static bool msDemangle(const std::string &S) {
   int Status;
   MSDemangleFlags Flags = MSDF_None;
   if (DumpBackReferences)
@@ -47,6 +51,7 @@ static void msDemangle(const std::string
     WithColor::error() << "Invalid mangled name\n";
   }
   std::free(ResultBuf);
+  return Status == llvm::demangle_success;
 }
 
 int main(int argc, char **argv) {
@@ -54,6 +59,18 @@ int main(int argc, char **argv) {
 
   cl::ParseCommandLineOptions(argc, argv, "llvm-undname\n");
 
+  if (!RawFile.empty()) {
+    ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
+        MemoryBuffer::getFileOrSTDIN(RawFile);
+    if (std::error_code EC = FileOrErr.getError()) {
+      WithColor::error() << "Could not open input file \'" << RawFile
+                         << "\': " << EC.message() << '\n';
+      return 1;
+    }
+    return msDemangle(FileOrErr->get()->getBuffer()) ? 0 : 1;
+  }
+
+  bool Success = true;
   if (Symbols.empty()) {
     while (true) {
       std::string LineStr;
@@ -74,17 +91,19 @@ int main(int argc, char **argv) {
         outs() << Line << "\n";
         outs().flush();
       }
-      msDemangle(Line);
+      if (!msDemangle(Line))
+        Success = false;
       outs() << "\n";
     }
   } else {
     for (StringRef S : Symbols) {
       outs() << S << "\n";
       outs().flush();
-      msDemangle(S);
+      if (!msDemangle(S))
+        Success = false;
       outs() << "\n";
     }
   }
 
-  return 0;
+  return Success ? 0 : 1;
 }




More information about the llvm-commits mailing list