From 63606c09859e3c93736a2666a60c8680b8dc3237 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Wed, 15 Jul 2020 11:05:36 +0200 Subject: [PATCH] Added json_fuzzer and msgpack_fuzzer in test suite --- .travis.yml | 7 ++- CMakeLists.txt | 2 +- extras/ci/fuzz.sh | 30 ++++++------- extras/fuzzing/CMakeLists.txt | 43 ++++++++++++++++--- .../{fuzzer_main.cpp => reproducer.cpp} | 0 5 files changed, 57 insertions(+), 25 deletions(-) rename extras/fuzzing/{fuzzer_main.cpp => reproducer.cpp} (100%) diff --git a/.travis.yml b/.travis.yml index f58bdd3b..81d1b599 100644 --- a/.travis.yml +++ b/.travis.yml @@ -128,7 +128,12 @@ matrix: apt: sources: ['ubuntu-toolchain-r-test'] packages: ['clang-6.0','llvm-6.0'] - env: SCRIPT=fuzz CLANG=6.0 + env: SCRIPT=fuzz CLANG=6.0 FUZZER=json + - addons: + apt: + sources: ['ubuntu-toolchain-r-test'] + packages: ['clang-6.0','llvm-6.0'] + env: SCRIPT=fuzz CLANG=6.0 FUZZER=msgpack cache: directories: - "~/.platformio" diff --git a/CMakeLists.txt b/CMakeLists.txt index d854fdb9..d91a5a12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ # Copyright Benoit Blanchon 2014-2020 # MIT License -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.7) project(ArduinoJson VERSION 6.15.1) diff --git a/extras/ci/fuzz.sh b/extras/ci/fuzz.sh index ba3385e9..6e699804 100755 --- a/extras/ci/fuzz.sh +++ b/extras/ci/fuzz.sh @@ -1,26 +1,22 @@ #!/bin/bash -eux ROOT_DIR=$(dirname $0)/../../ -INCLUDE_DIR=${ROOT_DIR}/src/ FUZZING_DIR=${ROOT_DIR}/extras/fuzzing/ -CXXFLAGS="-g -fprofile-instr-generate -fcoverage-mapping -fsanitize=address,undefined,fuzzer -fno-sanitize-recover=all" -fuzz() { - NAME="$1" - FUZZER="${NAME}_fuzzer" - FUZZER_CPP="${FUZZING_DIR}/${NAME}_fuzzer.cpp" - CORPUS_DIR="${FUZZING_DIR}/${NAME}_corpus" - SEED_CORPUS_DIR="${FUZZING_DIR}/${NAME}_seed_corpus" +export CC="clang-${CLANG}" +export CXX="clang++-${CLANG}" +cmake -DCMAKE_BUILD_TYPE=Debug . - clang++-${CLANG} ${CXXFLAGS} -o ${FUZZER} -I$INCLUDE_DIR ${FUZZER_CPP} +FUZZER_TARGET="${FUZZER}_fuzzer" +FUZZER_PATH="extras/fuzzing/${FUZZER_TARGET}" +CORPUS_DIR="${FUZZING_DIR}/${FUZZER}_corpus" +SEED_CORPUS_DIR="${FUZZING_DIR}/${FUZZER}_seed_corpus" - export ASAN_OPTIONS="detect_leaks=0" - export LLVM_PROFILE_FILE="${FUZZER}.profraw" - ./${FUZZER} "$CORPUS_DIR" "$SEED_CORPUS_DIR" -max_total_time=30 -timeout=1 +cmake --build . --target $FUZZER_TARGET - llvm-profdata-${CLANG} merge -sparse ${LLVM_PROFILE_FILE} -o ${FUZZER}.profdata - llvm-cov-${CLANG} report ./${FUZZER} -instr-profile=${FUZZER}.profdata -} +export ASAN_OPTIONS="detect_leaks=0" +export LLVM_PROFILE_FILE="${FUZZER_TARGET}.profraw" +${FUZZER_PATH} "$CORPUS_DIR" "$SEED_CORPUS_DIR" -max_total_time=60 -timeout=1 -fuzz json -fuzz msgpack +llvm-profdata-${CLANG} merge -sparse ${LLVM_PROFILE_FILE} -o ${FUZZER_TARGET}.profdata +llvm-cov-${CLANG} report ./${FUZZER_PATH} -instr-profile=${FUZZER_TARGET}.profdata diff --git a/extras/fuzzing/CMakeLists.txt b/extras/fuzzing/CMakeLists.txt index f890786a..a6313470 100644 --- a/extras/fuzzing/CMakeLists.txt +++ b/extras/fuzzing/CMakeLists.txt @@ -6,18 +6,49 @@ if(MSVC) add_compile_options(-D_CRT_SECURE_NO_WARNINGS) endif() -add_executable(msgpack_fuzzer +add_executable(msgpack_reproducer msgpack_fuzzer.cpp - fuzzer_main.cpp + reproducer.cpp ) -target_link_libraries(msgpack_fuzzer +target_link_libraries(msgpack_reproducer ArduinoJson ) -add_executable(json_fuzzer +add_executable(json_reproducer json_fuzzer.cpp - fuzzer_main.cpp + reproducer.cpp ) -target_link_libraries(json_fuzzer +target_link_libraries(json_reproducer ArduinoJson ) + +macro(add_fuzzer name) + set(FUZZER "${name}_fuzzer") + set(CORPUS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${name}_corpus") + set(SEED_CORPUS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${name}_seed_corpus") + add_executable("${FUZZER}" + "${FUZZER}.cpp" + ) + target_link_libraries("${FUZZER}" + ArduinoJson + ) + set_target_properties("${FUZZER}" + PROPERTIES + COMPILE_FLAGS + "-fprofile-instr-generate -fcoverage-mapping -fsanitize=address,undefined,fuzzer -fno-sanitize-recover=all" + LINK_FLAGS + "-fprofile-instr-generate -fcoverage-mapping -fsanitize=address,undefined,fuzzer -fno-sanitize-recover=all" + ) + + add_test( + NAME + "${FUZZER}" + COMMAND + "${FUZZER}" "${CORPUS_DIR}" "${SEED_CORPUS_DIR}" -max_total_time=5 -timeout=1 + ) +endmacro() + +if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 6) + add_fuzzer(json) + add_fuzzer(msgpack) +endif() diff --git a/extras/fuzzing/fuzzer_main.cpp b/extras/fuzzing/reproducer.cpp similarity index 100% rename from extras/fuzzing/fuzzer_main.cpp rename to extras/fuzzing/reproducer.cpp