1# ################################################################ 2# Copyright (c) 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 26LIBZSTD = ../../lib 27DEBUGLEVEL ?= 2 28ZSTD_LEGACY_SUPPORT ?= 1 29 30include $(LIBZSTD)/libzstd.mk 31 32ZSTDDIR = ../../lib 33PRGDIR = ../../programs 34CONTRIBDIR = ../../contrib 35 36FUZZ_CPPFLAGS := -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(ZSTDDIR)/compress \ 37 -I$(ZSTDDIR)/dictBuilder -I$(ZSTDDIR)/deprecated -I$(ZSTDDIR)/legacy \ 38 -I$(CONTRIBDIR)/seekable_format -I$(PRGDIR) -DZSTD_MULTITHREAD -DZSTD_LEGACY_SUPPORT=1 $(CPPFLAGS) 39FUZZ_EXTRA_FLAGS := -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ 40 -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \ 41 -Wstrict-prototypes -Wundef \ 42 -Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \ 43 -Wredundant-decls -Wno-deprecated-declarations \ 44 -g -fno-omit-frame-pointer 45FUZZ_CFLAGS := $(FUZZ_EXTRA_FLAGS) $(CFLAGS) 46FUZZ_CXXFLAGS := $(FUZZ_EXTRA_FLAGS) -std=c++11 $(CXXFLAGS) 47FUZZ_LDFLAGS := -pthread $(LDFLAGS) 48FUZZ_ARFLAGS := $(ARFLAGS) 49FUZZ_TARGET_FLAGS = $(FUZZ_CPPFLAGS) $(FUZZ_CXXFLAGS) $(FUZZ_LDFLAGS) 50 51FUZZ_ROUND_TRIP_FLAGS := -DFUZZING_ASSERT_VALID_SEQUENCE 52 53FUZZ_HEADERS := fuzz_helpers.h fuzz.h zstd_helpers.h fuzz_data_producer.h 54FUZZ_SRC := $(PRGDIR)/util.c ./fuzz_helpers.c ./zstd_helpers.c ./fuzz_data_producer.c 55 56SEEKABLE_HEADERS = $(CONTRIBDIR)/seekable_format/zstd_seekable.h 57SEEKABLE_OBJS = $(CONTRIBDIR)/seekable_format/zstdseek_compress.c $(CONTRIBDIR)/seekable_format/zstdseek_decompress.c 58 59ZSTDCOMMON_SRC := $(ZSTD_COMMON_FILES) 60ZSTDCOMP_SRC := $(ZSTD_COMPRESS_FILES) 61ZSTDDECOMP_SRC := $(ZSTD_DECOMPRESS_FILES) 62ZSTDDICT_SRC := $(ZSTD_DICTBUILDER_FILES) 63ZSTDLEGACY_SRC := $(ZSTD_LEGACY_FILES) 64FUZZ_SRC := \ 65 $(FUZZ_SRC) \ 66 $(ZSTDDECOMP_SRC) \ 67 $(ZSTDCOMMON_SRC) \ 68 $(ZSTDCOMP_SRC) \ 69 $(ZSTDDICT_SRC) \ 70 $(ZSTDLEGACY_SRC) 71FUZZ_SRC := $(sort $(wildcard $(FUZZ_SRC))) 72 73FUZZ_D_OBJ1 := $(subst $(ZSTDDIR)/common/,d_lib_common_,$(FUZZ_SRC)) 74FUZZ_D_OBJ2 := $(subst $(ZSTDDIR)/compress/,d_lib_compress_,$(FUZZ_D_OBJ1)) 75FUZZ_D_OBJ3 := $(subst $(ZSTDDIR)/decompress/,d_lib_decompress_,$(FUZZ_D_OBJ2)) 76FUZZ_D_OBJ4 := $(subst $(ZSTDDIR)/dictBuilder/,d_lib_dictBuilder_,$(FUZZ_D_OBJ3)) 77FUZZ_D_OBJ5 := $(subst $(ZSTDDIR)/legacy/,d_lib_legacy_,$(FUZZ_D_OBJ4)) 78FUZZ_D_OBJ6 := $(subst $(PRGDIR)/,d_prg_,$(FUZZ_D_OBJ5)) 79FUZZ_D_OBJ7 := $(subst $\./,d_fuzz_,$(FUZZ_D_OBJ6)) 80FUZZ_D_OBJ8 := $(FUZZ_D_OBJ7:.c=.o) 81FUZZ_DECOMPRESS_OBJ := $(FUZZ_D_OBJ8:.S=.o) 82 83FUZZ_RT_OBJ1 := $(subst $(ZSTDDIR)/common/,rt_lib_common_,$(FUZZ_SRC)) 84FUZZ_RT_OBJ2 := $(subst $(ZSTDDIR)/compress/,rt_lib_compress_,$(FUZZ_RT_OBJ1)) 85FUZZ_RT_OBJ3 := $(subst $(ZSTDDIR)/decompress/,rt_lib_decompress_,$(FUZZ_RT_OBJ2)) 86FUZZ_RT_OBJ4 := $(subst $(ZSTDDIR)/dictBuilder/,rt_lib_dictBuilder_,$(FUZZ_RT_OBJ3)) 87FUZZ_RT_OBJ5 := $(subst $(ZSTDDIR)/legacy/,rt_lib_legacy_,$(FUZZ_RT_OBJ4)) 88FUZZ_RT_OBJ6 := $(subst $(PRGDIR)/,rt_prg_,$(FUZZ_RT_OBJ5)) 89FUZZ_RT_OBJ7 := $(subst $\./,rt_fuzz_,$(FUZZ_RT_OBJ6)) 90FUZZ_RT_OBJ8 := $(FUZZ_RT_OBJ7:.c=.o) 91FUZZ_ROUND_TRIP_OBJ := $(FUZZ_RT_OBJ8:.S=.o) 92 93.PHONY: default all clean cleanall 94 95default: all 96 97FUZZ_TARGETS := \ 98 simple_round_trip \ 99 stream_round_trip \ 100 block_round_trip \ 101 simple_decompress \ 102 stream_decompress \ 103 block_decompress \ 104 dictionary_round_trip \ 105 dictionary_decompress \ 106 zstd_frame_info \ 107 simple_compress \ 108 dictionary_loader \ 109 raw_dictionary_round_trip \ 110 dictionary_stream_round_trip \ 111 decompress_dstSize_tooSmall \ 112 fse_read_ncount \ 113 sequence_compression_api \ 114 seekable_roundtrip \ 115 huf_round_trip \ 116 huf_decompress 117 118all: libregression.a $(FUZZ_TARGETS) 119 120rt_lib_common_%.o: $(ZSTDDIR)/common/%.c 121 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 122 123rt_lib_compress_%.o: $(ZSTDDIR)/compress/%.c 124 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 125 126rt_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.c 127 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 128 129rt_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.S 130 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 131 132rt_lib_dictBuilder_%.o: $(ZSTDDIR)/dictBuilder/%.c 133 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 134 135rt_lib_legacy_%.o: $(ZSTDDIR)/legacy/%.c 136 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 137 138rt_prg_%.o: $(PRGDIR)/%.c 139 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 140 141rt_fuzz_%.o: %.c 142 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $(FUZZ_ROUND_TRIP_FLAGS) $< -c -o $@ 143 144d_lib_common_%.o: $(ZSTDDIR)/common/%.c 145 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 146 147d_lib_compress_%.o: $(ZSTDDIR)/compress/%.c 148 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 149 150d_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.c 151 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 152 153d_lib_decompress_%.o: $(ZSTDDIR)/decompress/%.S 154 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 155 156d_lib_dictBuilder_%.o: $(ZSTDDIR)/dictBuilder/%.c 157 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 158 159d_lib_legacy_%.o: $(ZSTDDIR)/legacy/%.c 160 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 161 162d_prg_%.o: $(PRGDIR)/%.c 163 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 164 165d_fuzz_%.o: %.c 166 $(CC) $(FUZZ_CPPFLAGS) $(FUZZ_CFLAGS) $< -c -o $@ 167 168simple_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_round_trip.o 169 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 170 171stream_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_stream_round_trip.o 172 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_stream_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 173 174block_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_block_round_trip.o 175 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_block_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 176 177simple_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_simple_decompress.o 178 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_simple_decompress.o $(LIB_FUZZING_ENGINE) -o $@ 179 180stream_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_stream_decompress.o 181 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_stream_decompress.o $(LIB_FUZZING_ENGINE) -o $@ 182 183block_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_block_decompress.o 184 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_block_decompress.o $(LIB_FUZZING_ENGINE) -o $@ 185 186dictionary_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_round_trip.o 187 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 188 189raw_dictionary_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_raw_dictionary_round_trip.o 190 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_raw_dictionary_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 191 192dictionary_stream_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_stream_round_trip.o 193 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_stream_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 194 195dictionary_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_dictionary_decompress.o 196 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_dictionary_decompress.o $(LIB_FUZZING_ENGINE) -o $@ 197 198simple_compress: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_compress.o 199 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_simple_compress.o $(LIB_FUZZING_ENGINE) -o $@ 200 201zstd_frame_info: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_zstd_frame_info.o 202 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_zstd_frame_info.o $(LIB_FUZZING_ENGINE) -o $@ 203 204dictionary_loader: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_loader.o 205 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_dictionary_loader.o $(LIB_FUZZING_ENGINE) -o $@ 206 207decompress_dstSize_tooSmall: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_decompress_dstSize_tooSmall.o 208 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_decompress_dstSize_tooSmall.o $(LIB_FUZZING_ENGINE) -o $@ 209 210fse_read_ncount: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_fse_read_ncount.o 211 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_fse_read_ncount.o $(LIB_FUZZING_ENGINE) -o $@ 212 213sequence_compression_api: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_sequence_compression_api.o 214 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_sequence_compression_api.o $(LIB_FUZZING_ENGINE) -o $@ 215 216seekable_roundtrip: $(FUZZ_HEADERS) $(SEEKABLE_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) $(SEEKABLE_OBJS) rt_fuzz_seekable_roundtrip.o 217 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) $(SEEKABLE_OBJS) rt_fuzz_seekable_roundtrip.o $(LIB_FUZZING_ENGINE) -o $@ 218 219huf_round_trip: $(FUZZ_HEADERS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_huf_round_trip.o 220 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_ROUND_TRIP_OBJ) rt_fuzz_huf_round_trip.o $(LIB_FUZZING_ENGINE) -o $@ 221 222huf_decompress: $(FUZZ_HEADERS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_huf_decompress.o 223 $(CXX) $(FUZZ_TARGET_FLAGS) $(FUZZ_DECOMPRESS_OBJ) d_fuzz_huf_decompress.o $(LIB_FUZZING_ENGINE) -o $@ 224 225libregression.a: $(FUZZ_HEADERS) $(PRGDIR)/util.h $(PRGDIR)/util.c d_fuzz_regression_driver.o 226 $(AR) $(FUZZ_ARFLAGS) $@ d_fuzz_regression_driver.o 227 228corpora/%_seed_corpus.zip: 229 @mkdir -p corpora 230 $(DOWNLOAD) $@ $(CORPORA_URL_PREFIX)$*_seed_corpus.zip 231 232corpora/%: corpora/%_seed_corpus.zip 233 unzip -q $^ -d $@ 234 235.PHONY: corpora 236corpora: $(patsubst %,corpora/%,$(FUZZ_TARGETS)) 237 238.PHONY: seedcorpora 239seedcorpora: $(patsubst %,corpora/%_seed_corpus.zip,$(FUZZ_TARGETS)) 240 241regressiontest: corpora 242 CC="$(CC)" CXX="$(CXX)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" $(PYTHON) ./fuzz.py build all 243 $(PYTHON) ./fuzz.py regression all 244 245clean: 246 @$(RM) *.a *.o $(FUZZ_TARGETS) 247 @echo Cleaning completed 248 249cleanall: 250 @$(RM) -r Fuzzer 251 @$(RM) -r corpora 252 @echo Cleaning completed 253