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