9 read -r -a AVAILABLE_TARGETS < <(echo */fuzz.c | sed 's@/fuzz.c@@g')
14 Usage: $0 [OPTION]... FUZZ_TARGET
16 Fuzz wimlib with LLVM's libFuzzer.
19 --asan Enable AddressSanitizer
20 --input=INPUT Test a single input file only
21 --msan Enable MemorySanitizer
22 --time=SECONDS Stop after the given time has passed
23 --ubsan Enable UndefinedBehaviorSanitizer
25 Available fuzz targets: ${AVAILABLE_TARGETS[*]}
53 longopts=$(echo "${longopts_array[@]}" | tr ' ' ',')
55 if ! options=$(getopt -o "" -l "$longopts" -- "$@"); then
59 eval set -- "$options"
63 EXTRA_SANITIZERS+=",address"
74 EXTRA_FUZZER_ARGS+=("-max_total_time=$2")
78 EXTRA_SANITIZERS+=",memory"
81 EXTRA_SANITIZERS+=",undefined"
88 echo 1>&2 "Invalid option '$1'"
95 if (( $# != 1 )); then
96 echo 1>&2 "No fuzz target specified!"
101 if [ ! -e "$TARGET/fuzz.c" ]; then
102 echo 1>&2 "'$TARGET' is not a valid fuzz target!"
107 cflags="-g -O1 -Wall -Werror"
108 cflags+=" -fsanitize=fuzzer-no-link$EXTRA_SANITIZERS"
109 if [ -n "$EXTRA_SANITIZERS" ]; then
110 cflags+=" -fno-sanitize-recover=${EXTRA_SANITIZERS#,}"
112 if ! [ -e config.log ] || ! grep -q -- "'CFLAGS=$cflags'" config.log; then
113 run_cmd ./configure --enable-test-support --without-fuse --without-ntfs-3g \
114 CC=clang CFLAGS="$cflags"
116 run_cmd make "-j$(getconf _NPROCESSORS_ONLN)"
118 if [ -n "$INPUT" ]; then
119 run_cmd clang -g -O1 -fsanitize=fuzzer-no-link$EXTRA_SANITIZERS -Wall -Werror \
120 -I "$TOPDIR/include" "$TARGET/fuzz.c" test-one-input.c fault-injection.c \
121 "$TOPDIR/.libs/libwim.a" -o test-one-input
122 run_cmd ./test-one-input "$INPUT"
124 run_cmd clang -g -O1 -fsanitize=fuzzer$EXTRA_SANITIZERS -Wall -Werror \
125 -I "$TOPDIR/include" "$TARGET/fuzz.c" fault-injection.c \
126 "$TOPDIR/.libs/libwim.a" -o "$TARGET/fuzz"
127 run_cmd "$TARGET/fuzz" "${EXTRA_FUZZER_ARGS[@]}" "$TARGET/corpus"