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