1#!/bin/sh 2# 3# Creates fuzzer builds of various kinds 4# - oss-fuzz emulated mode (makes sure a simulated invocation by oss-fuzz works) 5# - libFuzzer build (you will need clang) 6# - afl build (you will need afl) 7# 8# 9# Copyright (c) 2019 Paul Dreik 10# 11# For the license information refer to format.h. 12 13set -e 14me=$(basename $0) 15root=$(readlink -f "$(dirname "$0")/../..") 16 17 18echo $me: root=$root 19 20here=$(pwd) 21 22CXXFLAGSALL="-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION= -g" 23CMAKEFLAGSALL="$root -GNinja -DCMAKE_BUILD_TYPE=Debug -DFMT_DOC=Off -DFMT_TEST=Off -DFMT_FUZZ=On -DCMAKE_CXX_STANDARD=17" 24 25CLANG=clang++-11 26 27# For performance analysis of the fuzzers. 28builddir=$here/build-fuzzers-perfanalysis 29mkdir -p $builddir 30cd $builddir 31CXX="ccache g++" CXXFLAGS="$CXXFLAGSALL -g" cmake \ 32$CMAKEFLAGSALL \ 33-DFMT_FUZZ_LINKMAIN=On \ 34-DCMAKE_BUILD_TYPE=Release 35 36cmake --build $builddir 37 38# Builds the fuzzers as oss-fuzz does. 39builddir=$here/build-fuzzers-ossfuzz 40mkdir -p $builddir 41cd $builddir 42CXX=$CLANG \ 43CXXFLAGS="$CXXFLAGSALL -fsanitize=fuzzer-no-link" cmake \ 44cmake $CMAKEFLAGSALL \ 45-DFMT_FUZZ_LINKMAIN=Off \ 46-DFMT_FUZZ_LDFLAGS="-fsanitize=fuzzer" 47 48cmake --build $builddir 49 50 51# Builds fuzzers for local fuzzing with libfuzzer with asan+usan. 52builddir=$here/build-fuzzers-libfuzzer 53mkdir -p $builddir 54cd $builddir 55CXX=$CLANG \ 56CXXFLAGS="$CXXFLAGSALL -fsanitize=fuzzer-no-link,address,undefined" cmake \ 57cmake $CMAKEFLAGSALL \ 58-DFMT_FUZZ_LINKMAIN=Off \ 59-DFMT_FUZZ_LDFLAGS="-fsanitize=fuzzer" 60 61cmake --build $builddir 62 63# Builds a fast fuzzer for making coverage fast. 64builddir=$here/build-fuzzers-fast 65mkdir -p $builddir 66cd $builddir 67CXX=$CLANG \ 68CXXFLAGS="$CXXFLAGSALL -fsanitize=fuzzer-no-link -O3" cmake \ 69cmake $CMAKEFLAGSALL \ 70-DFMT_FUZZ_LINKMAIN=Off \ 71-DFMT_FUZZ_LDFLAGS="-fsanitize=fuzzer" \ 72 -DCMAKE_BUILD_TYPE=Release 73 74cmake --build $builddir 75 76 77# Builds fuzzers for local fuzzing with afl. 78builddir=$here/build-fuzzers-afl 79mkdir -p $builddir 80cd $builddir 81CXX="afl-g++" \ 82CXXFLAGS="$CXXFLAGSALL -fsanitize=address,undefined" \ 83cmake $CMAKEFLAGSALL \ 84-DFMT_FUZZ_LINKMAIN=On 85 86cmake --build $builddir 87 88 89echo $me: all good 90 91