xref: /aosp_15_r20/external/flatbuffers/tests/fuzzer/CMakeLists.txt (revision 890232f25432b36107d06881e0a25aaa6b473652)
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