zeek/auxil/spicy/ci/fuzz/CMakeLists.txt
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

60 lines
2.5 KiB
CMake

# Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
# Declares a new fuzzer target.
function (fuzz_parser)
set(options)
set(oneValueArg PARSER)
set(multiValueArgs MODULES SOURCES)
cmake_parse_arguments(PARSE_ARGV 0 FUZZ "${options}" "${oneValueArg}" "${multiValueArgs}")
if (NOT DEFINED FUZZ_PARSER)
message(FATAL_ERROR "PARSER" is required)
endif ()
string(REPLACE "::" "_" _parser ${FUZZ_PARSER})
list(TRANSFORM FUZZ_MODULES PREPEND ${_parser}_ OUTPUT_VARIABLE _generated_sources)
list(TRANSFORM _generated_sources APPEND ".cc" OUTPUT_VARIABLE _generated_sources)
list(APPEND _generated_sources "${_parser}___linker__.cc")
add_custom_command(
OUTPUT ${_generated_sources}
COMMAND ${CMAKE_BINARY_DIR}/bin/spicyc -x ${CMAKE_CURRENT_BINARY_DIR}/${_parser}
"${FUZZ_SOURCES}"
DEPENDS spicyc
COMMENT "Generating C++ code for ${FUZZ_PARSER}")
add_executable(fuzz-${_parser} fuzz.cc ${_generated_sources})
target_compile_definitions(fuzz-${_parser} PRIVATE SPICY_FUZZ_PARSER="${_parser}")
target_compile_options(fuzz-${_parser} PRIVATE -fsanitize=fuzzer-no-link)
target_link_options(fuzz-${_parser} PRIVATE -fsanitize=fuzzer-no-link)
set(_libfuzzer_lib $ENV{LIBFUZZER_LIB})
if ("${_libfuzzer_lib}" STREQUAL "")
message(FATAL_ERROR "When building fuzzers the environment variable LIBFUZZER_LIB "
"must contain the path to libclang_rt.fuzzer_no_main-<arch>.a")
endif ()
if (NOT EXISTS ${_libfuzzer_lib})
message(FATAL_ERROR "Configured LIBFUZZER_LIB ${_libfuzzer_lib} does not exist")
endif ()
target_link_libraries(fuzz-${_parser} spicy-rt hilti-rt "${_libfuzzer_lib}")
endfunction ()
fuzz_parser(PARSER "DHCP::Message" SOURCES ${CMAKE_SOURCE_DIR}/spicy-dhcp/analyzer/analyzer.spicy
MODULES DHCP)
fuzz_parser(PARSER "TFTP::Packet" SOURCES ${CMAKE_SOURCE_DIR}/spicy-tftp/analyzer/tftp.spicy
MODULES TFTP)
fuzz_parser(PARSER "pe::ImageFile" SOURCES ${CMAKE_SOURCE_DIR}/spicy-pe/analyzer/analyzer.spicy
MODULES PE)
fuzz_parser(PARSER "PNG::File" SOURCES ${CMAKE_SOURCE_DIR}/spicy-png/analyzer/analyzer.spicy
MODULES PNG)
fuzz_parser(PARSER "dns::Message" SOURCES ${CMAKE_SOURCE_DIR}/spicy-dns/analyzer/analyzer.spicy
MODULES DNS)
foreach (P IN ITEMS Request Requests Reply Replies)
fuzz_parser(PARSER "HTTP::${P}" SOURCES ${CMAKE_SOURCE_DIR}/spicy-http/analyzer/analyzer.spicy
MODULES HTTP filter)
endforeach ()