[llvm] r312338 - llvm-isel-fuzzer: Make buildable and testable without libFuzzer

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 1 12:50:03 PDT 2017


Kostya Serebryany <kcc at google.com> writes:
> Can we reuse lib/fuzzer/standalone/StandaloneFuzzTargetMain.c for this
> purpose?

Given that this was moved to compiler-rt, I don't think so. We really
want to be able to test these things when we only have an LLVM checkout.

If we did find a way to make this practical we'd have to make
StandaloneFuzzTargetMain's argument handling a bit more robust.

> Also, it's possible to link against libFuzzer w/o using the coverage
> instrumentation.

Fair enough, but does that give us any real advantage over wiring up a
dummy main? This way we can build these targets with any compiler
regardless of whether it supports libFuzzer, so anyone building anywhere
should see problems before it gets to the bots.

> On Fri, Sep 1, 2017 at 10:02 AM, Justin Bogner via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: bogner
>> Date: Fri Sep  1 10:02:22 2017
>> New Revision: 312338
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=312338&view=rev
>> Log:
>> llvm-isel-fuzzer: Make buildable and testable without libFuzzer
>>
>> This adds a dummy main so we can build and run the llvm-isel-fuzzer
>> functionality when we aren't building LLVM with coverage. The approach
>> here should serve as a template to stop in-tree fuzzers from
>> bitrotting (See llvm.org/pr34314).
>>
>> Note that I'll probably move most of the logic in DummyISelFuzzer's
>> `main` to a library so it's easy to reuse it in other fuzz targets,
>> but I'm planning on doing that in a follow up that also consolidates
>> argument handling in our LLVMFuzzerInitialize implementations.
>>
>> Added:
>>     llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp
>> Modified:
>>     llvm/trunk/cmake/modules/AddLLVM.cmake
>>     llvm/trunk/tools/llvm-isel-fuzzer/CMakeLists.txt
>>
>> Modified: llvm/trunk/cmake/modules/AddLLVM.cmake
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/
>> modules/AddLLVM.cmake?rev=312338&r1=312337&r2=312338&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/cmake/modules/AddLLVM.cmake (original)
>> +++ llvm/trunk/cmake/modules/AddLLVM.cmake Fri Sep  1 10:02:22 2017
>> @@ -893,11 +893,15 @@ macro(add_llvm_utility name)
>>  endmacro(add_llvm_utility name)
>>
>>  macro(add_llvm_fuzzer name)
>> +  cmake_parse_arguments(ARG "" "DUMMY_MAIN" "" ${ARGN})
>>    if( LLVM_USE_SANITIZE_COVERAGE )
>>      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer")
>> -    add_llvm_executable(${name} ${ARGN})
>> +    add_llvm_executable(${name} ${ARG_UNPARSED_ARGUMENTS})
>>      set_target_properties(${name} PROPERTIES FOLDER "Fuzzers")
>> -  endif()
>> +  elseif( ARG_DUMMY_MAIN )
>> +    add_llvm_executable(${name} ${ARG_DUMMY_MAIN}
>> ${ARG_UNPARSED_ARGUMENTS})
>> +    set_target_properties(${name} PROPERTIES FOLDER "Fuzzers")
>> +endif()
>>  endmacro()
>>
>>  macro(add_llvm_target target_name)
>>
>> Modified: llvm/trunk/tools/llvm-isel-fuzzer/CMakeLists.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-
>> isel-fuzzer/CMakeLists.txt?rev=312338&r1=312337&r2=312338&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/tools/llvm-isel-fuzzer/CMakeLists.txt (original)
>> +++ llvm/trunk/tools/llvm-isel-fuzzer/CMakeLists.txt Fri Sep  1 10:02:22
>> 2017
>> @@ -12,4 +12,5 @@ set(LLVM_LINK_COMPONENTS
>>      Support
>>      Target
>>  )
>> -add_llvm_fuzzer(llvm-isel-fuzzer llvm-isel-fuzzer.cpp)
>> +add_llvm_fuzzer(llvm-isel-fuzzer llvm-isel-fuzzer.cpp
>> +  DUMMY_MAIN DummyISelFuzzer.cpp)
>>
>> Added: llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-
>> isel-fuzzer/DummyISelFuzzer.cpp?rev=312338&view=auto
>> ============================================================
>> ==================
>> --- llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp (added)
>> +++ llvm/trunk/tools/llvm-isel-fuzzer/DummyISelFuzzer.cpp Fri Sep  1
>> 10:02:22 2017
>> @@ -0,0 +1,56 @@
>> +//===--- DummyFuzzerMain.cpp - Entry point to sanity check the fuzzer
>> -----===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===------------------------------------------------------
>> ----------------===//
>> +//
>> +// Implementation of main so we can build and test without linking
>> libFuzzer.
>> +//
>> +//===------------------------------------------------------
>> ----------------===//
>> +
>> +#include "llvm/ADT/StringRef.h"
>> +#include "llvm/Support/Compiler.h"
>> +#include "llvm/Support/Error.h"
>> +#include "llvm/Support/MemoryBuffer.h"
>> +#include "llvm/Support/raw_ostream.h"
>> +
>> +using namespace llvm;
>> +
>> +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
>> +extern "C" LLVM_ATTRIBUTE_WEAK int LLVMFuzzerInitialize(int *argc,
>> +                                                        char ***argv) {
>> +  return 0;
>> +}
>> +
>> +int main(int argc, char *argv[]) {
>> +  errs() << "*** This tool was not linked to libFuzzer.\n"
>> +         << "*** No fuzzing will be performed.\n";
>> +  if (int RC = LLVMFuzzerInitialize(&argc, &argv)) {
>> +    errs() << "Initialization failed\n";
>> +    return RC;
>> +  }
>> +
>> +  for (int I = 1; I < argc; ++I) {
>> +    StringRef Arg(argv[I]);
>> +    if (Arg.startswith("-")) {
>> +      if (Arg.equals("-ignore_remaining_args=1"))
>> +        break;
>> +      continue;
>> +    }
>> +
>> +    auto BufOrErr = MemoryBuffer::getFile(Arg, /*FileSize-*/ -1,
>> +                                          /*RequiresNullTerminator=*/
>> false);
>> +    if (std::error_code EC = BufOrErr.getError()) {
>> +      errs() << "Error reading file: " << Arg << ": " << EC.message() <<
>> "\n";
>> +      return 1;
>> +    }
>> +    std::unique_ptr<MemoryBuffer> Buf = std::move(BufOrErr.get());
>> +    errs() << "Running: " << Arg << " (" << Buf->getBufferSize() << "
>> bytes)\n";
>> +    LLVMFuzzerTestOneInput(
>> +        reinterpret_cast<const uint8_t *>(Buf->getBufferStart()),
>> +        Buf->getBufferSize());
>> +  }
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>


More information about the llvm-commits mailing list