1*890232f2SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.9) 2*890232f2SAndroid Build Coastguard Worker 3*890232f2SAndroid Build Coastguard Workerset(CMAKE_VERBOSE_MAKEFILE ON) 4*890232f2SAndroid Build Coastguard Workerset(CMAKE_EXPORT_COMPILE_COMMANDS ON) 5*890232f2SAndroid Build Coastguard Workerset(CMAKE_POSITION_INDEPENDENT_CODE ON) 6*890232f2SAndroid Build Coastguard Worker 7*890232f2SAndroid Build Coastguard Workerproject(FlatBuffersFuzzerTests) 8*890232f2SAndroid Build Coastguard Worker 9*890232f2SAndroid Build Coastguard Workeroption(BUILD_DEBUGGER "Compile a debugger with main() and without libFuzzer" OFF) 10*890232f2SAndroid Build Coastguard Worker 11*890232f2SAndroid Build Coastguard Workerif(NOT DEFINED FLATBUFFERS_MAX_PARSING_DEPTH) 12*890232f2SAndroid Build Coastguard Worker # Force checking of RecursionError in the test 13*890232f2SAndroid Build Coastguard Worker set(FLATBUFFERS_MAX_PARSING_DEPTH 24) 14*890232f2SAndroid Build Coastguard Workerendif() 15*890232f2SAndroid Build Coastguard Workermessage(STATUS "FLATBUFFERS_MAX_PARSING_DEPTH: ${FLATBUFFERS_MAX_PARSING_DEPTH}") 16*890232f2SAndroid Build Coastguard Worker 17*890232f2SAndroid Build Coastguard Worker# Usage '-fsanitize=address' doesn't allowed with '-fsanitize=memory'. 18*890232f2SAndroid Build Coastguard Worker# MemorySanitizer will not work out-of-the-box, and will instead report false 19*890232f2SAndroid Build Coastguard Worker# positives coming from uninstrumented code. Need to re-build both C++ standard 20*890232f2SAndroid Build Coastguard Worker# library: https://github.com/google/sanitizers/wiki/MemorySanitizerLibcxxHowTo 21*890232f2SAndroid Build Coastguard Workeroption(USE_ASAN "Use fuzzers with ASASN" OFF) 22*890232f2SAndroid Build Coastguard Workeroption(USE_MSAN "Use fuzzers with MSASN" OFF) 23*890232f2SAndroid Build Coastguard Workeroption(OSS_FUZZ "Set this option to use flags by oss-fuzz" OFF) 24*890232f2SAndroid Build Coastguard Worker 25*890232f2SAndroid Build Coastguard Worker# Use Clang linker. 26*890232f2SAndroid Build Coastguard Workerset(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld") 27*890232f2SAndroid Build Coastguard Worker 28*890232f2SAndroid Build Coastguard Worker# add_link_options(-stdlib=libc++) 29*890232f2SAndroid Build Coastguard Worker 30*890232f2SAndroid Build Coastguard Workeradd_compile_options( 31*890232f2SAndroid Build Coastguard Worker # -stdlib=libc++ # Use Clang libc++ instead of GNU. 32*890232f2SAndroid Build Coastguard Worker -std=c++17 33*890232f2SAndroid Build Coastguard Worker -Wall 34*890232f2SAndroid Build Coastguard Worker -pedantic 35*890232f2SAndroid Build Coastguard Worker -Werror 36*890232f2SAndroid Build Coastguard Worker -Wextra 37*890232f2SAndroid Build Coastguard Worker -Wno-unused-parameter 38*890232f2SAndroid Build Coastguard Worker -fsigned-char 39*890232f2SAndroid Build Coastguard Worker -fno-omit-frame-pointer 40*890232f2SAndroid Build Coastguard Worker -g # Generate source-level debug information 41*890232f2SAndroid Build Coastguard Worker # -flto # enable link-time optimisation 42*890232f2SAndroid Build Coastguard Worker) 43*890232f2SAndroid Build Coastguard Worker 44*890232f2SAndroid Build Coastguard Worker# https://llvm.org/docs/Passes.html save IR to see call graph make one bitcode 45*890232f2SAndroid Build Coastguard Worker# file:> llvm-link *.bc -o out.bc print call-graph:> opt out.bc -analyze -print- 46*890232f2SAndroid Build Coastguard Worker# callgraph &> callgraph.txt set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -save-temps 47*890232f2SAndroid Build Coastguard Worker# -flto") 48*890232f2SAndroid Build Coastguard Worker 49*890232f2SAndroid Build Coastguard Worker# A special target with fuzzer+sanitizer flags. 50*890232f2SAndroid Build Coastguard Workeradd_library(fuzzer_config INTERFACE) 51*890232f2SAndroid Build Coastguard Worker 52*890232f2SAndroid Build Coastguard Workertarget_compile_options( 53*890232f2SAndroid Build Coastguard Worker fuzzer_config 54*890232f2SAndroid Build Coastguard Worker INTERFACE 55*890232f2SAndroid Build Coastguard Worker $<$<NOT:$<BOOL:${OSS_FUZZ}>>: 56*890232f2SAndroid Build Coastguard Worker -fsanitize-coverage=trace-cmp 57*890232f2SAndroid Build Coastguard Worker > 58*890232f2SAndroid Build Coastguard Worker $<$<BOOL:${USE_ASAN}>: 59*890232f2SAndroid Build Coastguard Worker -fsanitize=fuzzer,undefined,address 60*890232f2SAndroid Build Coastguard Worker > 61*890232f2SAndroid Build Coastguard Worker $<$<BOOL:${USE_MSAN}>: 62*890232f2SAndroid Build Coastguard Worker -fsanitize=fuzzer,undefined,memory 63*890232f2SAndroid Build Coastguard Worker -fsanitize-memory-track-origins=2 64*890232f2SAndroid Build Coastguard Worker > 65*890232f2SAndroid Build Coastguard Worker $<$<BOOL:${OSS_FUZZ}>: 66*890232f2SAndroid Build Coastguard Worker ${CXX} 67*890232f2SAndroid Build Coastguard Worker ${CXXFLAGS} 68*890232f2SAndroid Build Coastguard Worker > 69*890232f2SAndroid Build Coastguard Worker) 70*890232f2SAndroid Build Coastguard Worker 71*890232f2SAndroid Build Coastguard Workertarget_link_libraries( 72*890232f2SAndroid Build Coastguard Worker fuzzer_config 73*890232f2SAndroid Build Coastguard Worker INTERFACE 74*890232f2SAndroid Build Coastguard Worker $<$<BOOL:${USE_ASAN}>: 75*890232f2SAndroid Build Coastguard Worker -fsanitize=fuzzer,undefined,address 76*890232f2SAndroid Build Coastguard Worker > 77*890232f2SAndroid Build Coastguard Worker $<$<BOOL:${USE_MSAN}>: 78*890232f2SAndroid Build Coastguard Worker -fsanitize=fuzzer,undefined,memory 79*890232f2SAndroid Build Coastguard Worker > 80*890232f2SAndroid Build Coastguard Worker $<$<BOOL:${OSS_FUZZ}>: 81*890232f2SAndroid Build Coastguard Worker $ENV{LIB_FUZZING_ENGINE} 82*890232f2SAndroid Build Coastguard Worker > 83*890232f2SAndroid Build Coastguard Worker) 84*890232f2SAndroid Build Coastguard Worker 85*890232f2SAndroid Build Coastguard Workerset(FLATBUFFERS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../") 86*890232f2SAndroid Build Coastguard Worker 87*890232f2SAndroid Build Coastguard Workerset(FlatBuffers_Library_SRCS 88*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/allocator.h 89*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/array.h 90*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/base.h 91*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/buffer.h 92*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/buffer_ref.h 93*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/default_allocator.h 94*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/detached_buffer.h 95*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/flatbuffer_builder.h 96*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/flatbuffers.h 97*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/flexbuffers.h 98*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/flex_flat_util.h 99*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/hash.h 100*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/idl.h 101*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/minireflect.h 102*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/reflection.h 103*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/reflection_generated.h 104*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/registry.h 105*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/stl_emulation.h 106*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/string.h 107*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/struct.h 108*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/table.h 109*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/util.h 110*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/vector.h 111*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/vector_downward.h 112*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/include/flatbuffers/verifier.h 113*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/src/idl_parser.cpp 114*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/src/idl_gen_text.cpp 115*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/src/reflection.cpp 116*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/src/binary_annotator.h 117*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/src/binary_annotator.cpp 118*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/src/util.cpp 119*890232f2SAndroid Build Coastguard Worker ${FLATBUFFERS_DIR}/tests/test_assert.cpp 120*890232f2SAndroid Build Coastguard Worker) 121*890232f2SAndroid Build Coastguard Worker 122*890232f2SAndroid Build Coastguard Workerinclude_directories(${FLATBUFFERS_DIR}/include) 123*890232f2SAndroid Build Coastguard Workerinclude_directories(${FLATBUFFERS_DIR}/tests) 124*890232f2SAndroid Build Coastguard Workerinclude_directories(${FLATBUFFERS_DIR}/src) 125*890232f2SAndroid Build Coastguard Worker 126*890232f2SAndroid Build Coastguard Workeradd_library(flatbuffers_fuzzed STATIC ${FlatBuffers_Library_SRCS}) 127*890232f2SAndroid Build Coastguard Worker# Use PUBLIC to force 'fuzzer_config' for all dependent targets 128*890232f2SAndroid Build Coastguard Workertarget_link_libraries(flatbuffers_fuzzed PUBLIC fuzzer_config) 129*890232f2SAndroid Build Coastguard Worker 130*890232f2SAndroid Build Coastguard Worker# FLATBUFFERS_ASSERT should assert in Release as well. Redefine 131*890232f2SAndroid Build Coastguard Worker# FLATBUFFERS_ASSERT macro definition. Declare as PUBLIC to cover asserts in all 132*890232f2SAndroid Build Coastguard Worker# included header files. 133*890232f2SAndroid Build Coastguard Workertarget_compile_definitions( 134*890232f2SAndroid Build Coastguard Worker flatbuffers_fuzzed 135*890232f2SAndroid Build Coastguard Worker PUBLIC 136*890232f2SAndroid Build Coastguard Worker FLATBUFFERS_ASSERT=fuzzer_assert_impl 137*890232f2SAndroid Build Coastguard Worker FLATBUFFERS_ASSERT_INCLUDE="${CMAKE_CURRENT_SOURCE_DIR}/fuzzer_assert.h" 138*890232f2SAndroid Build Coastguard Worker PRIVATE 139*890232f2SAndroid Build Coastguard Worker FLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH} 140*890232f2SAndroid Build Coastguard Worker) 141*890232f2SAndroid Build Coastguard Worker 142*890232f2SAndroid Build Coastguard Worker# Setup fuzzer tests. 143*890232f2SAndroid Build Coastguard Worker 144*890232f2SAndroid Build Coastguard Workeradd_executable(scalar_fuzzer flatbuffers_scalar_fuzzer.cc) 145*890232f2SAndroid Build Coastguard Workertarget_link_libraries(scalar_fuzzer PRIVATE flatbuffers_fuzzed) 146*890232f2SAndroid Build Coastguard Worker 147*890232f2SAndroid Build Coastguard Workeradd_executable(parser_fuzzer flatbuffers_parser_fuzzer.cc) 148*890232f2SAndroid Build Coastguard Workertarget_link_libraries(parser_fuzzer PRIVATE flatbuffers_fuzzed) 149*890232f2SAndroid Build Coastguard Worker 150*890232f2SAndroid Build Coastguard Workeradd_executable(verifier_fuzzer flatbuffers_verifier_fuzzer.cc) 151*890232f2SAndroid Build Coastguard Workertarget_link_libraries(verifier_fuzzer PRIVATE flatbuffers_fuzzed) 152*890232f2SAndroid Build Coastguard Worker 153*890232f2SAndroid Build Coastguard Workeradd_executable(flexverifier_fuzzer flexbuffers_verifier_fuzzer.cc) 154*890232f2SAndroid Build Coastguard Workertarget_link_libraries(flexverifier_fuzzer PRIVATE flatbuffers_fuzzed) 155*890232f2SAndroid Build Coastguard Worker 156*890232f2SAndroid Build Coastguard Workeradd_executable(monster_fuzzer flatbuffers_monster_fuzzer.cc) 157*890232f2SAndroid Build Coastguard Workertarget_link_libraries(monster_fuzzer PRIVATE flatbuffers_fuzzed) 158*890232f2SAndroid Build Coastguard Workeradd_custom_command( 159*890232f2SAndroid Build Coastguard Worker TARGET monster_fuzzer PRE_BUILD 160*890232f2SAndroid Build Coastguard Worker COMMAND ${CMAKE_COMMAND} -E copy 161*890232f2SAndroid Build Coastguard Worker ${CMAKE_SOURCE_DIR}/../monster_test.bfbs 162*890232f2SAndroid Build Coastguard Worker ${CMAKE_CURRENT_BINARY_DIR}/monster_test.bfbs) 163*890232f2SAndroid Build Coastguard Worker 164*890232f2SAndroid Build Coastguard Workeradd_executable(annotator_fuzzer flatbuffers_annotator_fuzzer.cc) 165*890232f2SAndroid Build Coastguard Workertarget_link_libraries(annotator_fuzzer PRIVATE flatbuffers_fuzzed) 166*890232f2SAndroid Build Coastguard Workeradd_custom_command( 167*890232f2SAndroid Build Coastguard Worker TARGET annotator_fuzzer PRE_BUILD 168*890232f2SAndroid Build Coastguard Worker 169*890232f2SAndroid Build Coastguard Worker COMMAND ${CMAKE_COMMAND} -E copy 170*890232f2SAndroid Build Coastguard Worker ${CMAKE_SOURCE_DIR}/../annotated_binary/annotated_binary.bfbs 171*890232f2SAndroid Build Coastguard Worker ${CMAKE_CURRENT_BINARY_DIR}/annotated_binary.bfbs 172*890232f2SAndroid Build Coastguard Worker 173*890232f2SAndroid Build Coastguard Worker COMMAND ${CMAKE_COMMAND} -E copy 174*890232f2SAndroid Build Coastguard Worker ${CMAKE_SOURCE_DIR}/../annotated_binary/annotated_binary.bin 175*890232f2SAndroid Build Coastguard Worker ${CMAKE_CURRENT_BINARY_DIR}/seed_annotator/annotated_binary.bin 176*890232f2SAndroid Build Coastguard Worker) 177*890232f2SAndroid Build Coastguard Worker 178*890232f2SAndroid Build Coastguard Worker# Build debugger for weird cases found with fuzzer. 179*890232f2SAndroid Build Coastguard Workerif(BUILD_DEBUGGER) 180*890232f2SAndroid Build Coastguard Worker add_library(flatbuffers_nonfuzz STATIC ${FlatBuffers_Library_SRCS}) 181*890232f2SAndroid Build Coastguard Worker target_compile_options( 182*890232f2SAndroid Build Coastguard Worker flatbuffers_nonfuzz 183*890232f2SAndroid Build Coastguard Worker PUBLIC 184*890232f2SAndroid Build Coastguard Worker $<$<BOOL:${USE_ASAN}>: 185*890232f2SAndroid Build Coastguard Worker -fsanitize=undefined,address 186*890232f2SAndroid Build Coastguard Worker > 187*890232f2SAndroid Build Coastguard Worker -fno-limit-debug-info 188*890232f2SAndroid Build Coastguard Worker ) 189*890232f2SAndroid Build Coastguard Worker 190*890232f2SAndroid Build Coastguard Worker target_link_libraries( 191*890232f2SAndroid Build Coastguard Worker flatbuffers_nonfuzz 192*890232f2SAndroid Build Coastguard Worker PUBLIC 193*890232f2SAndroid Build Coastguard Worker $<$<BOOL:${USE_ASAN}>: 194*890232f2SAndroid Build Coastguard Worker -fsanitize=undefined,address 195*890232f2SAndroid Build Coastguard Worker > 196*890232f2SAndroid Build Coastguard Worker ) 197*890232f2SAndroid Build Coastguard Worker 198*890232f2SAndroid Build Coastguard Worker target_compile_definitions( 199*890232f2SAndroid Build Coastguard Worker flatbuffers_nonfuzz 200*890232f2SAndroid Build Coastguard Worker PUBLIC 201*890232f2SAndroid Build Coastguard Worker FLATBUFFERS_ASSERT=fuzzer_assert_impl 202*890232f2SAndroid Build Coastguard Worker FLATBUFFERS_ASSERT_INCLUDE="${CMAKE_CURRENT_SOURCE_DIR}/fuzzer_assert.h" 203*890232f2SAndroid Build Coastguard Worker PRIVATE 204*890232f2SAndroid Build Coastguard Worker FLATBUFFERS_MAX_PARSING_DEPTH=${FLATBUFFERS_MAX_PARSING_DEPTH} 205*890232f2SAndroid Build Coastguard Worker ) 206*890232f2SAndroid Build Coastguard Worker add_executable(scalar_debug 207*890232f2SAndroid Build Coastguard Worker flatbuffers_scalar_fuzzer.cc 208*890232f2SAndroid Build Coastguard Worker scalar_debug.cpp 209*890232f2SAndroid Build Coastguard Worker ) 210*890232f2SAndroid Build Coastguard Worker target_link_libraries(scalar_debug PRIVATE flatbuffers_nonfuzz) 211*890232f2SAndroid Build Coastguard Worker 212*890232f2SAndroid Build Coastguard Worker add_executable(monster_debug 213*890232f2SAndroid Build Coastguard Worker flatbuffers_monster_fuzzer.cc 214*890232f2SAndroid Build Coastguard Worker monster_debug.cpp 215*890232f2SAndroid Build Coastguard Worker ) 216*890232f2SAndroid Build Coastguard Worker target_link_libraries(monster_debug PRIVATE flatbuffers_nonfuzz) 217*890232f2SAndroid Build Coastguard Worker add_custom_command( 218*890232f2SAndroid Build Coastguard Worker TARGET monster_debug PRE_BUILD 219*890232f2SAndroid Build Coastguard Worker COMMAND ${CMAKE_COMMAND} -E copy 220*890232f2SAndroid Build Coastguard Worker ${CMAKE_SOURCE_DIR}/../monster_test.bfbs 221*890232f2SAndroid Build Coastguard Worker ${CMAKE_CURRENT_BINARY_DIR}/monster_test.bfbs) 222*890232f2SAndroid Build Coastguard Worker 223*890232f2SAndroid Build Coastguard Workerendif(BUILD_DEBUGGER) 224