# Build all these tests with -O0, otherwise optimizations may merge some # basic blocks and we'll fail to discover the targets. # We change the flags for every build type because we might be doing # a multi-configuration build (e.g. Xcode) where CMAKE_BUILD_TYPE doesn't # mean anything. set(variables_to_filter CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_MINSIZEREL LIBFUZZER_FLAGS_BASE ) foreach (VARNAME ${variables_to_filter}) string(REPLACE " " ";" BUILD_FLAGS_AS_LIST "${${VARNAME}}") set(new_flags "") foreach (flag ${BUILD_FLAGS_AS_LIST}) # NOTE: Use of XX here is to avoid a CMake warning due to CMP0054 if (NOT ("XX${flag}" MATCHES "XX-O[0123s]")) set(new_flags "${new_flags} ${flag}") else() set(new_flags "${new_flags} -O0") endif() endforeach() set(${VARNAME} "${new_flags}") endforeach() # Enable the coverage instrumentation (it is disabled for the Fuzzer lib). set(CMAKE_CXX_FLAGS "${LIBFUZZER_FLAGS_BASE} -fsanitize-coverage=edge,indirect-calls") # add_libfuzzer_test( # SOURCES source0.cpp [source1.cpp ...] # ) # # Declares a LibFuzzer test executable with target name LLVMFuzzer-. # # One or more source files to be compiled into the binary must be declared # after the SOURCES keyword. function(add_libfuzzer_test name) set(multi_arg_options "SOURCES") cmake_parse_arguments( "add_libfuzzer_test" "" "" "${multi_arg_options}" ${ARGN}) if ("${add_libfuzzer_test_SOURCES}" STREQUAL "") message(FATAL_ERROR "Source files must be specified") endif() add_executable(LLVMFuzzer-${name} ${add_libfuzzer_test_SOURCES} ) target_link_libraries(LLVMFuzzer-${name} LLVMFuzzer) # Place binary where llvm-lit expects to find it set_target_properties(LLVMFuzzer-${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/Fuzzer/test" ) set(TestBinaries ${TestBinaries} LLVMFuzzer-${name} PARENT_SCOPE) endfunction() # Variable to keep track of all test targets set(TestBinaries) ############################################################################### # Basic tests ############################################################################### set(Tests AccumulateAllocationsTest BufferOverflowOnInput CallerCalleeTest CounterTest CustomMutatorTest EmptyTest FourIndependentBranchesTest FullCoverageSetTest InitializeTest MemcmpTest LeakTest LeakTimeoutTest NullDerefTest NullDerefOnEmptyTest NthRunCrashTest OutOfMemoryTest RepeatedMemcmp SimpleCmpTest SimpleDictionaryTest SimpleFnAdapterTest SimpleHashTest SimpleTest SimpleThreadedTest SpamyTest StrcmpTest StrncmpTest SwitchTest ThreadedTest TimeoutTest ) if(APPLE) # LeakSanitizer is not supported on OSX right now set(HAS_LSAN 0) message(WARNING "LeakSanitizer is not supported on Apple platforms." " Building and running LibFuzzer LeakSanitizer tests is disabled." ) else() set(HAS_LSAN 1) endif() foreach(Test ${Tests}) add_libfuzzer_test(${Test} SOURCES ${Test}.cpp) endforeach() ############################################################################### # Unit tests ############################################################################### add_executable(LLVMFuzzer-Unittest FuzzerUnittest.cpp FuzzerFnAdapterUnittest.cpp ) target_link_libraries(LLVMFuzzer-Unittest gtest gtest_main LLVMFuzzerNoMain ) target_include_directories(LLVMFuzzer-Unittest PRIVATE "${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include" ) set(TestBinaries ${TestBinaries} LLVMFuzzer-Unittest) set_target_properties(LLVMFuzzer-Unittest PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) ############################################################################### # Additional tests ############################################################################### include_directories(..) if(APPLE) message(WARNING "DataflowSanitizer is not supported on Apple platforms." " Building and running LibFuzzer DataflowSanitizer tests is disabled." ) set(HAS_DFSAN 0) else() set(HAS_DFSAN 1) add_subdirectory(dfsan) endif() add_subdirectory(uninstrumented) add_subdirectory(ubsan) add_subdirectory(trace-bb) add_subdirectory(trace-pc) ############################################################################### # Configure lit to run the tests # # Note this is done after declaring all tests so we can inform lit if any tests # need to be disabled. ############################################################################### configure_lit_site_cfg( ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg ) configure_lit_site_cfg( ${CMAKE_CURRENT_SOURCE_DIR}/unit/lit.site.cfg.in ${CMAKE_CURRENT_BINARY_DIR}/unit/lit.site.cfg ) add_lit_testsuite(check-fuzzer "Running Fuzzer tests" ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${TestBinaries} FileCheck not )