THRIFT-5855: cpp fuzzers
Add fuzzers for cpp support, to improve the reliability/robustness of the implementation
diff --git a/lib/cpp/test/fuzz/Makefile.am b/lib/cpp/test/fuzz/Makefile.am
new file mode 100644
index 0000000..b664573
--- /dev/null
+++ b/lib/cpp/test/fuzz/Makefile.am
@@ -0,0 +1,83 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+
+AUTOMAKE_OPTIONS = subdir-objects serial-tests nostdinc
+
+# Generate FuzzTest code
+BUILT_SOURCES = gen-cpp/FuzzTest_types.h
+
+noinst_LTLIBRARIES = libfuzztest_gen.la
+
+nodist_libfuzztest_gen_la_SOURCES = \
+ gen-cpp/FuzzTest_types.cpp \
+ gen-cpp/FuzzTest_types.h
+
+libfuzztest_gen_la_LIBADD = $(top_builddir)/lib/cpp/libthrift.la
+
+# Common fuzzing headers
+noinst_HEADERS = FuzzCommon.tcc
+
+# Fuzzing executables
+AM_CPPFLAGS = -I$(top_srcdir)/lib/cpp/src -I$(top_srcdir)/lib/cpp/src/thrift -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I.
+
+check_PROGRAMS = FuzzParseCompact FuzzParseBinary FuzzRoundtripCompact FuzzRoundtripBinary FuzzParseJson FuzzRoundtripJson
+
+FuzzParseCompact_SOURCES = FuzzParseCompact.cpp FuzzCommon.tcc
+FuzzParseCompact_LDADD = libfuzztest_gen.la $(top_builddir)/lib/cpp/libthrift.la
+FuzzParseCompact_CXXFLAGS = $(AM_CXXFLAGS) $(AM_CPPFLAGS) -g
+if USING_CLANG
+FuzzParseCompact_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
+endif
+
+FuzzRoundtripCompact_SOURCES = FuzzRoundtripCompact.cpp FuzzCommon.tcc
+FuzzRoundtripCompact_LDADD = libfuzztest_gen.la $(top_builddir)/lib/cpp/libthrift.la
+FuzzRoundtripCompact_CXXFLAGS = $(AM_CXXFLAGS) $(AM_CPPFLAGS) -g
+if USING_CLANG
+FuzzRoundtripCompact_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
+endif
+
+FuzzParseBinary_SOURCES = FuzzParseBinary.cpp FuzzCommon.tcc
+FuzzParseBinary_LDADD = libfuzztest_gen.la $(top_builddir)/lib/cpp/libthrift.la
+FuzzParseBinary_CXXFLAGS = $(AM_CXXFLAGS) $(AM_CPPFLAGS) -g
+if USING_CLANG
+FuzzParseBinary_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
+endif
+
+FuzzRoundtripBinary_SOURCES = FuzzRoundtripBinary.cpp FuzzCommon.tcc
+FuzzRoundtripBinary_LDADD = libfuzztest_gen.la $(top_builddir)/lib/cpp/libthrift.la
+FuzzRoundtripBinary_CXXFLAGS = $(AM_CXXFLAGS) $(AM_CPPFLAGS) -g
+if USING_CLANG
+FuzzRoundtripBinary_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
+endif
+
+FuzzParseJson_SOURCES = FuzzParseJson.cpp FuzzCommon.tcc
+FuzzParseJson_LDADD = libfuzztest_gen.la $(top_builddir)/lib/cpp/libthrift.la
+FuzzParseJson_CXXFLAGS = $(AM_CXXFLAGS) $(AM_CPPFLAGS) -g
+if USING_CLANG
+FuzzParseJson_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
+endif
+
+FuzzRoundtripJson_SOURCES = FuzzRoundtripJson.cpp FuzzCommon.tcc
+FuzzRoundtripJson_LDADD = libfuzztest_gen.la $(top_builddir)/lib/cpp/libthrift.la
+FuzzRoundtripJson_CXXFLAGS = $(AM_CXXFLAGS) $(AM_CPPFLAGS) -g
+if USING_CLANG
+FuzzRoundtripJson_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
+endif
+
+# Generate thrift files
+gen-cpp/FuzzTest_types.cpp gen-cpp/FuzzTest_types.h: $(top_srcdir)/test/FuzzTest.thrift
+ $(THRIFT) --gen cpp $<
+
+# Clean target
+clean-local:
+ $(RM) -rf gen-cpp
+ $(RM) -f $(check_PROGRAMS)
+ $(RM) -f *.o *.lo *.la
+ $(RM) -rf .libs
+
+CLEANFILES = gen-cpp/*
+
+EXTRA_DIST = CMakeLists.txt FuzzParseCompact.cpp FuzzParseBinary.cpp FuzzRoundtripCompact.cpp FuzzRoundtripBinary.cpp FuzzParseJson.cpp FuzzRoundtripJson.cpp
\ No newline at end of file