diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2016-05-31 01:24:40 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2016-05-31 01:24:40 +0000 |
| commit | 8df24c3cfd12b25415169ea8ae69ba8d64a2254f (patch) | |
| tree | bf77dacf588bb67eb7b2cddfeef818d0f2d8ebc2 /llvm/tools/llvm-pdbdump | |
| parent | 2da766485fa6bbc2e6f6e98545faafe145ca6e20 (diff) | |
| download | bcm5719-llvm-8df24c3cfd12b25415169ea8ae69ba8d64a2254f.tar.gz bcm5719-llvm-8df24c3cfd12b25415169ea8ae69ba8d64a2254f.zip | |
[llvm-pdbdump-fuzzer] Add a fuzzer for llvm-pdbdump
llvm-svn: 271243
Diffstat (limited to 'llvm/tools/llvm-pdbdump')
| -rw-r--r-- | llvm/tools/llvm-pdbdump/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/fuzzer/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp | 77 |
3 files changed, 96 insertions, 0 deletions
diff --git a/llvm/tools/llvm-pdbdump/CMakeLists.txt b/llvm/tools/llvm-pdbdump/CMakeLists.txt index 02f386efe03..5f475c2b31f 100644 --- a/llvm/tools/llvm-pdbdump/CMakeLists.txt +++ b/llvm/tools/llvm-pdbdump/CMakeLists.txt @@ -18,3 +18,7 @@ add_llvm_tool(llvm-pdbdump TypedefDumper.cpp VariableDumper.cpp ) + +if(LLVM_USE_SANITIZE_COVERAGE) + add_subdirectory(fuzzer) +endif() diff --git a/llvm/tools/llvm-pdbdump/fuzzer/CMakeLists.txt b/llvm/tools/llvm-pdbdump/fuzzer/CMakeLists.txt new file mode 100644 index 00000000000..cf5a0f70aab --- /dev/null +++ b/llvm/tools/llvm-pdbdump/fuzzer/CMakeLists.txt @@ -0,0 +1,15 @@ +set(LLVM_LINK_COMPONENTS + DebugInfoCodeView + DebugInfoPDB + Object + Support + ) + +add_llvm_executable(llvm-pdbdump-fuzzer + EXCLUDE_FROM_ALL + llvm-pdbdump-fuzzer.cpp + ) + +target_link_libraries(llvm-pdbdump-fuzzer + LLVMFuzzer + ) diff --git a/llvm/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp b/llvm/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp new file mode 100644 index 00000000000..bfa8363898e --- /dev/null +++ b/llvm/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp @@ -0,0 +1,77 @@ +//===-- llvm-pdbdump-fuzzer.cpp - Fuzz the llvm-pdbdump tool --------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// \brief This file implements a function that runs llvm-pdbdump +/// on a single input. This function is then linked into the Fuzzer library. +/// +//===----------------------------------------------------------------------===// +#include "llvm/DebugInfo/CodeView/SymbolDumper.h" +#include "llvm/DebugInfo/CodeView/TypeDumper.h" +#include "llvm/DebugInfo/PDB/Raw/DbiStream.h" +#include "llvm/DebugInfo/PDB/Raw/ModStream.h" +#include "llvm/DebugInfo/PDB/Raw/PDBFile.h" +#include "llvm/DebugInfo/PDB/Raw/RawSession.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/ScopedPrinter.h" + +using namespace llvm; + +extern "C" void LLVMFuzzerTestOneInput(uint8_t *data, size_t size) { + std::unique_ptr<MemoryBuffer> Buff = MemoryBuffer::getMemBuffer( + StringRef((const char *)data, size), "", false); + + ScopedPrinter P(nulls()); + codeview::CVTypeDumper TD(P, false); + + std::unique_ptr<pdb::PDBFile> File(new pdb::PDBFile(std::move(Buff))); + if (auto E = File->parseFileHeaders()) { + consumeError(std::move(E)); + return; + } + if (auto E = File->parseStreamData()) { + consumeError(std::move(E)); + return; + } + + auto DbiS = File->getPDBDbiStream(); + if (auto E = DbiS.takeError()) { + consumeError(std::move(E)); + return; + } + auto TpiS = File->getPDBTpiStream(); + if (auto E = TpiS.takeError()) { + consumeError(std::move(E)); + return; + } + auto IpiS = File->getPDBIpiStream(); + if (auto E = IpiS.takeError()) { + consumeError(std::move(E)); + return; + } + auto InfoS = File->getPDBInfoStream(); + if (auto E = InfoS.takeError()) { + consumeError(std::move(E)); + return; + } + pdb::DbiStream &DS = DbiS.get(); + + for (auto &Modi : DS.modules()) { + pdb::ModStream ModS(*File, Modi.Info); + if (auto E = ModS.reload()) { + consumeError(std::move(E)); + return; + } + codeview::CVSymbolDumper SD(P, TD, nullptr, false); + bool HadError = false; + for (auto &S : ModS.symbols(&HadError)) { + SD.dump(S); + } + } +} |

