r315336 - [clang-fuzzer] Allow building without coverage instrumentation.

Matt Morehouse via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 10 10:41:43 PDT 2017


Author: morehouse
Date: Tue Oct 10 10:41:43 2017
New Revision: 315336

URL: http://llvm.org/viewvc/llvm-project?rev=315336&view=rev
Log:
[clang-fuzzer] Allow building without coverage instrumentation.

Summary:
Compile with DummyClangFuzzer.cpp as entry point rather than
libFuzzer's main when coverage instrumentation is missing.

https://llvm.org/pr34314

Reviewers: kcc, bogner, vitalybuka

Reviewed By: vitalybuka

Subscribers: cfe-commits, mgorny

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

Added:
    cfe/trunk/tools/clang-fuzzer/DummyClangFuzzer.cpp
Modified:
    cfe/trunk/tools/clang-fuzzer/CMakeLists.txt
    cfe/trunk/tools/clang-fuzzer/ClangFuzzer.cpp

Modified: cfe/trunk/tools/clang-fuzzer/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-fuzzer/CMakeLists.txt?rev=315336&r1=315335&r2=315336&view=diff
==============================================================================
--- cfe/trunk/tools/clang-fuzzer/CMakeLists.txt (original)
+++ cfe/trunk/tools/clang-fuzzer/CMakeLists.txt Tue Oct 10 10:41:43 2017
@@ -1,60 +1,65 @@
-if( LLVM_USE_SANITIZE_COVERAGE )
-  set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD})
-  set(CXX_FLAGS_NOFUZZ ${CMAKE_CXX_FLAGS})
+set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD} FuzzMutate)
+set(CXX_FLAGS_NOFUZZ ${CMAKE_CXX_FLAGS})
+set(DUMMY_MAIN DummyClangFuzzer.cpp)
+if(LLVM_USE_SANITIZE_COVERAGE)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer")
+  unset(DUMMY_MAIN)
+endif()
+
+# Hack to bypass LLVM's cmake sources check and allow multiple libraries and
+# executables from this directory.
+set(LLVM_OPTIONAL_SOURCES
+  ClangFuzzer.cpp
+  DummyClangFuzzer.cpp
+  ExampleClangProtoFuzzer.cpp
+  )
+
+if(CLANG_ENABLE_PROTO_FUZZER)
+  # Create protobuf .h and .cc files, and put them in a library for use by
+  # clang-proto-fuzzer components.
+  find_package(Protobuf REQUIRED)
+  add_definitions(-DGOOGLE_PROTOBUF_NO_RTTI)
+  include_directories(${PROTOBUF_INCLUDE_DIRS})
+  include_directories(${CMAKE_CURRENT_BINARY_DIR})
+  protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS cxx_proto.proto)
+  set(LLVM_OPTIONAL_SOURCES ${LLVM_OPTIONAL_SOURCES} ${PROTO_SRCS})
+  add_clang_library(clangCXXProto
+    ${PROTO_SRCS}
+    ${PROTO_HDRS}
+
+    LINK_LIBS
+    ${PROTOBUF_LIBRARIES}
+    )
 
-  if(CLANG_ENABLE_PROTO_FUZZER)
-    # Create protobuf .h and .cc files, and put them in a library for use by
-    # clang-proto-fuzzer components.
-    find_package(Protobuf REQUIRED)
-    add_definitions(-DGOOGLE_PROTOBUF_NO_RTTI)
-    include_directories(${PROTOBUF_INCLUDE_DIRS})
-    include_directories(${CMAKE_CURRENT_BINARY_DIR})
-    protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS cxx_proto.proto)
-    # Hack to bypass LLVM's cmake sources check and allow multiple libraries and
-    # executables from this directory.
-    set(LLVM_OPTIONAL_SOURCES
-      ClangFuzzer.cpp
-      ExampleClangProtoFuzzer.cpp
-      ${PROTO_SRCS}
-      )
-    add_clang_library(clangCXXProto
-      ${PROTO_SRCS}
-      ${PROTO_HDRS}
-
-      LINK_LIBS
-      ${PROTOBUF_LIBRARIES}
-      )
-
-    # Build and include libprotobuf-mutator
-    include(ProtobufMutator)
-    include_directories(${ProtobufMutator_INCLUDE_DIRS})
-
-    # Build the protobuf->C++ translation library and driver.
-    add_clang_subdirectory(proto-to-cxx)
-
-    # Build the protobuf fuzzer
-    add_clang_executable(clang-proto-fuzzer ExampleClangProtoFuzzer.cpp)
-    target_link_libraries(clang-proto-fuzzer
-      ${ProtobufMutator_LIBRARIES}
-      clangCXXProto
-      clangHandleCXX
-      clangProtoToCXX
-      )
-  else()
-    # Hack to bypass LLVM's cmake sources check and allow multiple libraries and
-    # executables from this directory.
-    set(LLVM_OPTIONAL_SOURCES ClangFuzzer.cpp ExampleClangProtoFuzzer.cpp)
-  endif()
-
-  add_clang_subdirectory(handle-cxx)
-
-  add_clang_executable(clang-fuzzer
-    EXCLUDE_FROM_ALL
-    ClangFuzzer.cpp
+  # Build and include libprotobuf-mutator
+  include(ProtobufMutator)
+  include_directories(${ProtobufMutator_INCLUDE_DIRS})
+
+  # Build the protobuf->C++ translation library and driver.
+  add_clang_subdirectory(proto-to-cxx)
+
+  # Build the protobuf fuzzer
+  add_clang_executable(clang-proto-fuzzer
+    ${DUMMY_MAIN}
+    ExampleClangProtoFuzzer.cpp
     )
 
-  target_link_libraries(clang-fuzzer
+  target_link_libraries(clang-proto-fuzzer
+    ${ProtobufMutator_LIBRARIES}
+    clangCXXProto
     clangHandleCXX
+    clangProtoToCXX
     )
 endif()
+
+add_clang_subdirectory(handle-cxx)
+
+add_clang_executable(clang-fuzzer
+  EXCLUDE_FROM_ALL
+  ${DUMMY_MAIN}
+  ClangFuzzer.cpp
+  )
+
+target_link_libraries(clang-fuzzer
+  clangHandleCXX
+  )

Modified: cfe/trunk/tools/clang-fuzzer/ClangFuzzer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-fuzzer/ClangFuzzer.cpp?rev=315336&r1=315335&r2=315336&view=diff
==============================================================================
--- cfe/trunk/tools/clang-fuzzer/ClangFuzzer.cpp (original)
+++ cfe/trunk/tools/clang-fuzzer/ClangFuzzer.cpp Tue Oct 10 10:41:43 2017
@@ -17,6 +17,8 @@
 
 using namespace clang_fuzzer;
 
+extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { return 0; }
+
 extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {
   std::string s((const char *)data, size);
   HandleCXX(s, {"-O2"});

Added: cfe/trunk/tools/clang-fuzzer/DummyClangFuzzer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-fuzzer/DummyClangFuzzer.cpp?rev=315336&view=auto
==============================================================================
--- cfe/trunk/tools/clang-fuzzer/DummyClangFuzzer.cpp (added)
+++ cfe/trunk/tools/clang-fuzzer/DummyClangFuzzer.cpp Tue Oct 10 10:41:43 2017
@@ -0,0 +1,21 @@
+//===-- DummyClangFuzzer.cpp - Entry point to sanity check fuzzers --------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Provides a main() to build without linking libFuzzer.
+//
+//===----------------------------------------------------------------------===//
+#include "llvm/FuzzMutate/FuzzerCLI.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
+extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv);
+
+int main(int argc, char *argv[]) {
+  return llvm::runFuzzerOnInputs(argc, argv, LLVMFuzzerTestOneInput,
+                                 LLVMFuzzerInitialize);
+}




More information about the cfe-commits mailing list