view contrib/fuzz/Makefile @ 43813:5a9e2ae9899b

fuzz: use a more standard approach to allow local builds of fuzzers This is taken from the (improved since we started fuzzing) guide on ideal integrations. Rather than have our own wonky targets for building outside the fuzzer universe, we have a driver program we carry along and use when we're not using LibFuzzer. This will let us jettison a fair amount of goo. contrib/fuzz/standalone_fuzz_target_runner.cc is https://github.com/google/oss-fuzz/ file projects/example/my-api-repo/standalone from git revision c4579d9358a73ea5dbcc99cb985de1f2bf76dcf7, reformatted with out clang-format settings and a no-check-code comment added. It allows running a single test input through a fuzzer, rather than performing ongoing fuzzing as libfuzzer would. contrib/fuzz/FuzzedDataProvider.h is https://github.com/llvm/llvm-project/ file /compiler-rt/include/fuzzer/FuzzedDataProvider.h from git revision a44ef027ebca1598892ea9b104d6189aeb3bc2f0, reformatted with our clang-format settings and a no-check-code comment added. We can discard this if we instead want to add an hghave check for a new enough llvm that includes FuzzedDataProvder.h in the fuzzer headers. Differential Revision: https://phab.mercurial-scm.org/D7564
author Augie Fackler <augie@google.com>
date Fri, 06 Dec 2019 15:19:47 -0500
parents bf0453866c80
children 19da643dc10c
line wrap: on
line source

CC = clang
CXX = clang++

# By default, use our own standalone_fuzz_target_runner.
# This runner does no fuzzing, but simply executes the inputs
# provided via parameters.
# Run e.g. "make all LIB_FUZZING_ENGINE=/path/to/libFuzzer.a"
# to link the fuzzer(s) against a real fuzzing engine.
#
# OSS-Fuzz will define its own value for LIB_FUZZING_ENGINE.
LIB_FUZZING_ENGINE ?= standalone_fuzz_target_runner.o

PYTHON_CONFIG ?= $$OUT/sanpy/bin/python-config

CXXFLAGS += -Wno-deprecated-register

all: bdiff mpatch xdiff

standalone_fuzz_target_runner.o: standalone_fuzz_target_runner.cc

pyutil.o: pyutil.cc pyutil.h
	$(CXX) $(CXXFLAGS) -g -O1 \
	  `$(PYTHON_CONFIG) --cflags` \
	  -I../../mercurial -c -o pyutil.o pyutil.cc

bdiff.o: ../../mercurial/bdiff.c
	$(CC) $(CFLAGS) -fsanitize=fuzzer-no-link,address -c -o bdiff.o \
	  ../../mercurial/bdiff.c

bdiff: bdiff.cc bdiff.o 
	$(CXX) $(CXXFLAGS) -DHG_FUZZER_INCLUDE_MAIN=1 -g -O1 -fsanitize=fuzzer-no-link,address \
	  -std=c++17 \
	  -I../../mercurial bdiff.cc bdiff.o -o bdiff

bdiff-oss-fuzz.o: ../../mercurial/bdiff.c
	$(CC) $(CFLAGS) -c -o bdiff-oss-fuzz.o ../../mercurial/bdiff.c

bdiff_fuzzer: bdiff.cc bdiff-oss-fuzz.o
	$(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial bdiff.cc \
	  bdiff-oss-fuzz.o $(LIB_FUZZING_ENGINE) -o \
	  $$OUT/bdiff_fuzzer

mpatch.o: ../../mercurial/mpatch.c
	$(CC) -g -O1 -fsanitize=fuzzer-no-link,address -c -o mpatch.o \
	  ../../mercurial/mpatch.c

mpatch: CXXFLAGS += -std=c++17
mpatch: mpatch.cc mpatch.o
	$(CXX) $(CXXFLAGS) -DHG_FUZZER_INCLUDE_MAIN=1 -g -O1 -fsanitize=fuzzer-no-link,address \
	  -I../../mercurial mpatch.cc mpatch.o -o mpatch

mpatch-oss-fuzz.o: ../../mercurial/mpatch.c
	$(CC) $(CFLAGS) -c -o mpatch-oss-fuzz.o ../../mercurial/mpatch.c

mpatch_fuzzer: mpatch.cc mpatch-oss-fuzz.o 
	$(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial mpatch.cc \
	  mpatch-oss-fuzz.o $(LIB_FUZZING_ENGINE) -o \
	  $$OUT/mpatch_fuzzer

mpatch_corpus.zip:
	python mpatch_corpus.py $$OUT/mpatch_fuzzer_seed_corpus.zip

x%.o: ../../mercurial/thirdparty/xdiff/x%.c ../../mercurial/thirdparty/xdiff/*.h
	$(CC) -g -O1 -fsanitize=fuzzer-no-link,address -c \
	  -o $@ \
	  $<

xdiff: CXXFLAGS += -std=c++17
xdiff: xdiff.cc xdiffi.o xprepare.o xutils.o 
	$(CXX) $(CXXFLAGS) -DHG_FUZZER_INCLUDE_MAIN=1 -g -O1 -fsanitize=fuzzer-no-link,address \
	  -I../../mercurial xdiff.cc \
	  xdiffi.o xprepare.o xutils.o -o xdiff

fuzz-x%.o: ../../mercurial/thirdparty/xdiff/x%.c ../../mercurial/thirdparty/xdiff/*.h
	$(CC) $(CFLAGS) -c \
	  -o $@ \
	  $<

xdiff_fuzzer: xdiff.cc fuzz-xdiffi.o fuzz-xprepare.o fuzz-xutils.o 
	$(CXX) $(CXXFLAGS) -std=c++17 -I../../mercurial xdiff.cc \
	  fuzz-xdiffi.o fuzz-xprepare.o fuzz-xutils.o \
	  $(LIB_FUZZING_ENGINE) -o $$OUT/xdiff_fuzzer

manifest.o: ../../mercurial/cext/manifest.c
	$(CC) $(CFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -I../../mercurial \
	  -c -o manifest.o ../../mercurial/cext/manifest.c

charencode.o: ../../mercurial/cext/charencode.c
	$(CC) $(CFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -I../../mercurial \
	  -c -o charencode.o ../../mercurial/cext/charencode.c

parsers.o: ../../mercurial/cext/parsers.c
	$(CC) $(CFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -I../../mercurial \
	  -c -o parsers.o ../../mercurial/cext/parsers.c

dirs.o: ../../mercurial/cext/dirs.c
	$(CC) $(CFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -I../../mercurial \
	  -c -o dirs.o ../../mercurial/cext/dirs.c

pathencode.o: ../../mercurial/cext/pathencode.c
	$(CC) $(CFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -I../../mercurial \
	  -c -o pathencode.o ../../mercurial/cext/pathencode.c

revlog.o: ../../mercurial/cext/revlog.c
	$(CC) $(CFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -I../../mercurial \
	  -c -o revlog.o ../../mercurial/cext/revlog.c

dirs_fuzzer: dirs.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
	$(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -Wno-register -Wno-macro-redefined \
	  -I../../mercurial dirs.cc \
	  manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
	  $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) --ldflags` \
	  -o $$OUT/dirs_fuzzer

fncache_fuzzer: fncache.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
	$(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -Wno-register -Wno-macro-redefined \
	  -I../../mercurial fncache.cc \
	  manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
	  $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) --ldflags` \
	  -o $$OUT/fncache_fuzzer

jsonescapeu8fast_fuzzer: jsonescapeu8fast.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
	$(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -Wno-register -Wno-macro-redefined \
	  -I../../mercurial jsonescapeu8fast.cc \
	  manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
	  $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) --ldflags` \
	  -o $$OUT/jsonescapeu8fast_fuzzer

manifest_corpus.zip:
	python manifest_corpus.py $$OUT/manifest_fuzzer_seed_corpus.zip

manifest_fuzzer: manifest.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
	$(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -Wno-register -Wno-macro-redefined \
	  -I../../mercurial manifest.cc \
	  manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
	  $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) --ldflags` \
	  -o $$OUT/manifest_fuzzer

revlog_fuzzer: revlog.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
	$(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -Wno-register -Wno-macro-redefined \
	  -I../../mercurial revlog.cc \
	  manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
	  $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) --ldflags` \
	  -o $$OUT/revlog_fuzzer

revlog_corpus.zip:
	python revlog_corpus.py $$OUT/revlog_fuzzer_seed_corpus.zip

dirstate_fuzzer: dirstate.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
	$(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -Wno-register -Wno-macro-redefined \
	  -I../../mercurial dirstate.cc \
	  manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
	  $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) --ldflags` \
	  -o $$OUT/dirstate_fuzzer

dirstate_corpus.zip:
	python dirstate_corpus.py $$OUT/dirstate_fuzzer_seed_corpus.zip

fm1readmarkers_fuzzer: fm1readmarkers.cc manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o
	$(CXX) $(CXXFLAGS) `$(PYTHON_CONFIG) --cflags` \
	  -Wno-register -Wno-macro-redefined \
	  -I../../mercurial fm1readmarkers.cc \
	  manifest.o charencode.o parsers.o dirs.o pathencode.o revlog.o pyutil.o \
	  $(LIB_FUZZING_ENGINE) `$(PYTHON_CONFIG) --ldflags` \
	  -o $$OUT/fm1readmarkers_fuzzer

fm1readmarkers_corpus.zip:
	python fm1readmarkers_corpus.py $$OUT/fm1readmarkers_fuzzer_seed_corpus.zip

clean:
	$(RM) *.o *_fuzzer \
	  bdiff \
	  mpatch \
	  xdiff

oss-fuzz: bdiff_fuzzer mpatch_fuzzer mpatch_corpus.zip xdiff_fuzzer dirs_fuzzer fncache_fuzzer jsonescapeu8fast_fuzzer manifest_fuzzer manifest_corpus.zip revlog_fuzzer revlog_corpus.zip dirstate_fuzzer dirstate_corpus.zip fm1readmarkers_fuzzer fm1readmarkers_corpus.zip

.PHONY: all clean oss-fuzz