<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 30, 2016 at 6:24 PM, David Majnemer via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: majnemer<br>
Date: Mon May 30 20:24:40 2016<br>
New Revision: 271243<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=271243&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=271243&view=rev</a><br>
Log:<br>
[llvm-pdbdump-fuzzer] Add a fuzzer for llvm-pdbdump<br>
<br>
Added:<br>
    llvm/trunk/tools/llvm-pdbdump/fuzzer/<br>
    llvm/trunk/tools/llvm-pdbdump/fuzzer/CMakeLists.txt<br>
    llvm/trunk/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp<br>
Modified:<br>
    llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt<br>
<br>
Modified: llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt?rev=271243&r1=271242&r2=271243&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt?rev=271243&r1=271242&r2=271243&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt (original)<br>
+++ llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt Mon May 30 20:24:40 2016<br>
@@ -18,3 +18,7 @@ add_llvm_tool(llvm-pdbdump<br>
   TypedefDumper.cpp<br>
   VariableDumper.cpp<br>
   )<br>
+<br>
+if(LLVM_USE_SANITIZE_COVERAGE)<br>
+  add_subdirectory(fuzzer)<br>
+endif()<br>
<br>
Added: llvm/trunk/tools/llvm-pdbdump/fuzzer/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/fuzzer/CMakeLists.txt?rev=271243&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/fuzzer/CMakeLists.txt?rev=271243&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-pdbdump/fuzzer/CMakeLists.txt (added)<br>
+++ llvm/trunk/tools/llvm-pdbdump/fuzzer/CMakeLists.txt Mon May 30 20:24:40 2016<br>
@@ -0,0 +1,15 @@<br>
+set(LLVM_LINK_COMPONENTS<br>
+  DebugInfoCodeView<br>
+  DebugInfoPDB<br>
+  Object<br>
+  Support<br>
+  )<br>
+<br>
+add_llvm_executable(llvm-pdbdump-fuzzer<br>
+  EXCLUDE_FROM_ALL<br>
+  llvm-pdbdump-fuzzer.cpp<br>
+  )<br>
+<br>
+target_link_libraries(llvm-pdbdump-fuzzer<br>
+  LLVMFuzzer<br>
+  )<br>
<br>
Added: llvm/trunk/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp?rev=271243&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp?rev=271243&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp (added)<br>
+++ llvm/trunk/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp Mon May 30 20:24:40 2016<br>
@@ -0,0 +1,77 @@<br>
+//===-- llvm-pdbdump-fuzzer.cpp - Fuzz the llvm-pdbdump tool --------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+///<br>
+/// \file<br>
+/// \brief This file implements a function that runs llvm-pdbdump<br>
+///  on a single input. This function is then linked into the Fuzzer library.<br>
+///<br>
+//===----------------------------------------------------------------------===//<br>
+#include "llvm/DebugInfo/CodeView/SymbolDumper.h"<br>
+#include "llvm/DebugInfo/CodeView/TypeDumper.h"<br>
+#include "llvm/DebugInfo/PDB/Raw/DbiStream.h"<br>
+#include "llvm/DebugInfo/PDB/Raw/ModStream.h"<br>
+#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"<br>
+#include "llvm/DebugInfo/PDB/Raw/RawSession.h"<br>
+#include "llvm/Support/MemoryBuffer.h"<br>
+#include "llvm/Support/ScopedPrinter.h"<br>
+<br>
+using namespace llvm;<br>
+<br>
+extern "C" void LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {<br>
+  std::unique_ptr<MemoryBuffer> Buff = MemoryBuffer::getMemBuffer(<br>
+      StringRef((const char *)data, size), "", false);<br>
+<br>
+  ScopedPrinter P(nulls());<br>
+  codeview::CVTypeDumper TD(P, false);<br>
+<br>
+  std::unique_ptr<pdb::PDBFile> File(new pdb::PDBFile(std::move(Buff)));<br>
+  if (auto E = File->parseFileHeaders()) {<br>
+    consumeError(std::move(E));<br>
+    return;<br>
+  }<br>
+  if (auto E = File->parseStreamData()) {<br>
+    consumeError(std::move(E));<br>
+    return;<br>
+  }<br>
+<br>
+  auto DbiS = File->getPDBDbiStream();<br>
+  if (auto E = DbiS.takeError()) {<br>
+    consumeError(std::move(E));<br>
+    return;<br>
+  }<br>
+  auto TpiS = File->getPDBTpiStream();<br>
+  if (auto E = TpiS.takeError()) {<br>
+    consumeError(std::move(E));<br>
+    return;<br>
+  }<br>
+  auto IpiS = File->getPDBIpiStream();<br>
+  if (auto E = IpiS.takeError()) {<br>
+    consumeError(std::move(E));<br>
+    return;<br>
+  }<br>
+  auto InfoS = File->getPDBInfoStream();<br>
+  if (auto E = InfoS.takeError()) {<br>
+    consumeError(std::move(E));<br>
+    return;<br>
+  }<br>
+  pdb::DbiStream &DS = DbiS.get();<br>
+<br>
+  for (auto &Modi : DS.modules()) {<br></blockquote><div><br></div><div>& I forget the exact API to llvm::Expected, but I suspect you can write "DBiS->modules()" & skip the DS temp, if you like/prefer, but I can see how being explicit about the type (in which case I'd probably write it as ... = *DbiS; (assuming that works...) but, again, different preferences for what's more readable for sure) might be desired.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    pdb::ModStream ModS(*File, Modi.Info);<br>
+    if (auto E = ModS.reload()) {<br>
+      consumeError(std::move(E));<br>
+      return;<br>
+    }<br>
+    codeview::CVSymbolDumper SD(P, TD, nullptr, false);<br>
+    bool HadError = false;<br>
+    for (auto &S : ModS.symbols(&HadError)) {<br>
+      SD.dump(S);<br>
+    }<br>
+  }<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>