1# ################################################################ 2# Copyright (c) 2016-2020, Facebook, Inc. 3# All rights reserved. 4# 5# This source code is licensed under both the BSD-style license (found in the 6# LICENSE file in the root directory of this source tree) and the GPLv2 (found 7# in the COPYING file in the root directory of this source tree). 8# You may select, at your option, one of the above-listed licenses. 9# ################################################################ 10 11# Optionally user defined flags 12CFLAGS ?= -O3 13CXXFLAGS ?= -O3 14CPPFLAGS ?= 15LDFLAGS ?= 16ARFLAGS ?= 17LIB_FUZZING_ENGINE ?= libregression.a 18PYTHON ?= python 19ifeq ($(shell uname), Darwin) 20 DOWNLOAD?=curl -L -o 21else 22 DOWNLOAD?=wget -O 23endif 24CORPORA_URL_PREFIX:=https://github.com/facebook/zstd/releases/download/fuzz-corpora/ 25 26ZSTDDIR = ../../lib 27PRGDIR = ../../programs 28 29FUZZ_CPPFLAGS := -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(ZSTDDIR)/compress \ 30 -I$(ZSTDDIR)/dictBuilder -I$(ZSTDDIR)/deprecated -I$(ZSTDDIR)/legacy \ 31 -I$(PRGDIR) -DZSTD_MULTITHREAD -DZSTD_LEGACY_SUPPORT=1 $(CPPFLAGS) 32FUZZ_EXTRA_FLAGS := -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ 33 -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ 34 -Wstrict-prototypes -Wundef \ 35 -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ 36 -Wredundant-decls \ 37 -g -fno-omit-frame-pointer 38FUZZ_CFLAGS := $(FUZZ_EXTRA_FLAGS) $(CFLAGS) 39FUZZ_CXXFLAGS := $(FUZZ_EXTRA_FLAGS) -std=c++11 $(CXXFLAGS) 40FUZZ_LDFLAGS := -pthread $(LDFLAGS) 41FUZZ_ARFLAGS := $(ARFLAGS) 42FUZZ_TARGET_FLAGS = $(FUZZ_CPPFLAGS) $(FUZZ_CXXFLAGS) $(FUZZ_LDFLAGS) 43 44FUZZ_ROUND_TRIP_FLAGS := -DFUZZING_ASSERT_VALID_SEQUENCE 45 46FUZZ_HEADERS := fuzz_helpers.h fuzz.h zstd_helpers.h fuzz_data_producer.h 47FUZZ_SRC := $(PRGDIR)/util.c ./fuzz_helpers.c ./zstd_helpers.c ./fuzz_data_producer.c 48 49ZSTDCOMMON_SRC := $(ZSTDDIR)/common/*.c 50ZSTDCOMP_SRC := $(ZSTDDIR)/compress/*.c 51ZSTDDECOMP_SRC := $(ZSTDDIR)/decompress/*.c 52ZSTDDICT_SRC := $(ZSTDDIR)/dictBuilder/*.c 53ZSTDLEGACY_SRC := $(ZSTDDIR)/legacy/*.c 54FUZZ_SRC := \ 55 $(FUZZ_SRC) \ 56 $(ZSTDDECOMP_SRC) \ 57 $(ZSTDCOMMON_SRC) \ 58 $(ZSTDCOMP_SRC) \ 59 $(ZSTDDICT_SRC) \ 60 $(ZSTDLEGACY_SRC) 61FUZZ_SRC := $(wildcard $(FUZZ_SRC)) 62 63FUZZ_D_OBJ1 := $(subst $(ZSTDDIR)/common/,d_lib_common_,$(FUZZ_SRC)) 64FUZZ_D_OBJ2 := $(subst $(ZSTDDIR)/compress/,d_lib_compress_,$(FUZZ_D_OBJ1)) 65FUZZ_D_OBJ3 := $(subst $(ZSTDDIR)/decompress/,d_lib_decompress_,$(FUZZ_D_OBJ2)) 66FUZZ_D_OBJ4 := $(subst $(ZSTDDIR)/dictBuilder/,d_lib_dictBuilder_,$(FUZZ_D_OBJ3)) 67FUZZ_D_OBJ5 := $(subst $(ZSTDDIR)/legacy/,d_lib_legacy_,$(FUZZ_D_OBJ4)) 68FUZZ_D_OBJ6 := $(subst $(PRGDIR)/,d_prg_,$(FUZZ_D_OBJ5)) 69FUZZ_D_OBJ7 := $(subst $\./,d_fuzz_,$(FUZZ_D_OBJ6)) 70FUZZ_DECOMPRESS_OBJ := $(FUZZ_D_OBJ7:.c=.o) 71 72FUZZ_RT_OBJ1 := $(subst $(ZSTDDIR)/common/,rt_lib_common_,$(FUZZ_SRC)) 73FUZZ_RT_OBJ2 := $(subst $(ZSTDDIR)/compress/,rt_lib_compress_,$(FUZZ_RT_OBJ1)) 74FUZZ_RT_OBJ3 := $(subst $(ZSTDDIR)/decompress/,rt_lib_decompress_,$(FUZZ_RT_OBJ2)) 75FUZZ_RT_OBJ4 := $(subst $(ZSTDDIR)/dictBuilder/,rt_lib_dictBuilder_,$(FUZZ_RT_OBJ3)) 76FUZZ_RT_OBJ5 := $(subst $(ZSTDDIR)/legacy/,rt_lib_legacy_,$(FUZZ_RT_OBJ4)) 77FUZZ_RT_OBJ6 := $(subst $(PRGDIR)/,rt_prg_,$(FUZZ_RT_OBJ5)) 78FUZZ_RT_OBJ7 := $(subst $\./,rt_fuzz_,$(FUZZ_RT_OBJ6)) 79FUZZ_ROUND_TRIP_OBJ := $(FUZZ_RT_OBJ7:.c=.o) 80 81.PHONY: default all clean cleanall 82 83default: all 84 85FUZZ_TARGETS := \ 86 simple_round_trip \ 87 stream_round_trip \ 88 block_round_trip \ 89 simple_decompress \ 90 stream_decompress \ 91 block_decompress \ 92 dictionary_round_trip \ 93 dictionary_decompress \ 94 zstd_frame_info \ 95 simple_compress \ 96 dictionary_loader \ 97 raw_dictionary_round_trip \ 98 dictionary_stream_round_trip \ 99 decompress_dstSize_tooSmall \ 100 fse_read_ncount \ 101 sequence_compression_api 102 103all: libregression.a $(FUZZ_TARGETS) 104 105rt_lib_common_%.o: $(ZSTDDIR)/common/%.c 106 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 107 108rt_lib_compress_%.o: $(ZSTDDIR)/compress/%.c 109 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 110 111rt_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.c 112 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 113 114rt_lib_dictBuilder_%.o: $(ZSTDDIR)/dictBuilder/%.c 115 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 116 117rt_lib_legacy_%.o: $(ZSTDDIR)/legacy/%.c 118 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 119 120rt_prg_%.o: $(PRGDIR)/%.c 121 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 122 123rt_fuzz_%.o: %.c 124 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 125 126d_lib_common_%.o: $(ZSTDDIR)/common/%.c 127 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 128 129d_lib_compress_%.o: $(ZSTDDIR)/compress/%.c 130 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 131 132d_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.c 133 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 134 135d_lib_dictBuilder_%.o: $(ZSTDDIR)/dictBuilder/%.c 136 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 137 138d_lib_legacy_%.o: $(ZSTDDIR)/legacy/%.c 139 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 140 141d_prg_%.o: $(PRGDIR)/%.c 142 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 143 144d_fuzz_%.o: %.c 145 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 146 147simple_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_round_trip.o 148 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 149 150stream_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_stream_round_trip.o 151 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_stream_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 152 153block_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_block_round_trip.o 154 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_block_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 155 156simple_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_simple_decompress.o 157 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_simple_decompress.o $(LIB_FUZZING_ENGINE) -o $@ 158 159stream_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_stream_decompress.o 160 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_stream_decompress.o $(LIB_FUZZING_ENGINE) -o $@ 161 162block_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_block_decompress.o 163 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_block_decompress.o $(LIB_FUZZING_ENGINE) -o $@ 164 165dictionary_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_round_trip.o 166 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 167 168raw_dictionary_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_raw_dictionary_round_trip.o 169 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_raw_dictionary_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 170 171dictionary_stream_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_stream_round_trip.o 172 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_stream_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 173 174dictionary_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_dictionary_decompress.o 175 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_dictionary_decompress.o $(LIB_FUZZING_ENGINE) -o $@ 176 177simple_compress: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_compress.o 178 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_compress.o $(LIB_FUZZING_ENGINE) -o $@ 179 180zstd_frame_info: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_zstd_frame_info.o 181 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_zstd_frame_info.o $(LIB_FUZZING_ENGINE) -o $@ 182 183dictionary_loader: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_loader.o 184 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_loader.o $(LIB_FUZZING_ENGINE) -o $@ 185 186decompress_dstSize_tooSmall: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_decompress_dstSize_tooSmall.o 187 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_decompress_dstSize_tooSmall.o $(LIB_FUZZING_ENGINE) -o $@ 188 189fse_read_ncount: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_fse_read_ncount.o 190 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_fse_read_ncount.o $(LIB_FUZZING_ENGINE) -o $@ 191 192sequence_compression_api: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_sequence_compression_api.o 193 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_sequence_compression_api.o $(LIB_FUZZING_ENGINE) -o $@ 194 195libregression.a: $(FUZZ_HEADERS) $(PRGDIR)/util.h $(PRGDIR)/util.c d_fuzz_regression_driver.o 196 $(AR) $(FUZZ_ARFLAGS) $@ d_fuzz_regression_driver.o 197 198corpora/%_seed_corpus.zip: 199 @mkdir -p corpora 200 $(DOWNLOAD) $@ $(CORPORA_URL_PREFIX)$*_seed_corpus.zip 201 202corpora/%: corpora/%_seed_corpus.zip 203 unzip -q $^ -d $@ 204 205.PHONY: corpora 206corpora: $(patsubst %,corpora/%,$(FUZZ_TARGETS)) 207 208.PHONY: seedcorpora 209seedcorpora: $(patsubst %,corpora/%_seed_corpus.zip,$(FUZZ_TARGETS)) 210 211regressiontest: corpora 212 CC="$(CC)" CXX="$(CXX)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" $(PYTHON) ./fuzz.py build all 213 $(PYTHON) ./fuzz.py regression all 214 215clean: 216 @$(RM) *.a *.o $(FUZZ_TARGETS) 217 @echo Cleaning completed 218 219cleanall: 220 @$(RM) -r Fuzzer 221 @$(RM) -r corpora 222 @echo Cleaning completed 223