fuzzing_include_am.py (3981B)
1 #!/usr/bin/env python 2 3 # Future imports for Python 2.7, mandatory in 3.0 4 from __future__ import division 5 from __future__ import print_function 6 from __future__ import unicode_literals 7 8 FUZZERS = """ 9 address 10 addressPTR 11 consensus 12 descriptor 13 diff 14 diff-apply 15 extrainfo 16 hsdescv3 17 hsdescv3-inner 18 hsdescv3-middle 19 http 20 http-connect 21 microdesc 22 socks 23 strops 24 vrs 25 """ 26 27 28 PREAMBLE = r""" 29 FUZZING_CPPFLAGS = \ 30 $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) 31 FUZZING_CFLAGS = \ 32 $(AM_CFLAGS) $(TEST_CFLAGS) 33 FUZZING_LDFLAG = \ 34 @TOR_LDFLAGS_zlib@ $(TOR_LDFLAGS_CRYPTLIB) @TOR_LDFLAGS_libevent@ 35 FUZZING_LIBS = \ 36 src/test/libtor-testing.a \ 37 @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ 38 @TOR_LIBEVENT_LIBS@ $(TOR_LIBS_CRYPTLIB) \ 39 @TOR_LIB_WS32@ @TOR_LIB_IPHLPAPI@ @TOR_LIB_SHLWAPI@ @TOR_LIB_GDI@ @TOR_LIB_USERENV@ @CURVE25519_LIBS@ \ 40 @TOR_SYSTEMD_LIBS@ \ 41 @TOR_LZMA_LIBS@ \ 42 @TOR_ZSTD_LIBS@ \ 43 @TOR_TRACE_LIBS@ 44 45 oss-fuzz-prereqs: \ 46 src/test/libtor-testing.a 47 48 noinst_HEADERS += \ 49 src/test/fuzz/fuzzing.h 50 51 LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ 52 LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) 53 LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) -fsanitize=fuzzer,float-divide-by-zero 54 LIBFUZZER_LIBS = $(FUZZING_LIBS) -lstdc++ 55 56 LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ 57 LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) 58 """ 59 60 POSTAMBLE = r""" 61 noinst_PROGRAMS += $(FUZZERS) $(LIBFUZZER_FUZZERS) 62 noinst_LIBRARIES += $(OSS_FUZZ_FUZZERS) 63 oss-fuzz-fuzzers: oss-fuzz-prereqs $(OSS_FUZZ_FUZZERS) 64 fuzzers: $(FUZZERS) $(LIBFUZZER_FUZZERS) 65 66 test-fuzz-corpora: $(FUZZERS) 67 $(top_srcdir)/src/test/fuzz_static_testcases.sh 68 """ 69 70 ########### No user serviceable parts will follow. 71 72 PREAMBLE = PREAMBLE.strip() 73 POSTAMBLE = POSTAMBLE.strip() # If I use it, it's a word! 74 FUZZERS = FUZZERS.split() 75 FUZZERS.sort() 76 77 WARNING = """ 78 # This file was generated by fuzzing_include_am.py; do not hand-edit unless 79 # you enjoy having your changes erased. 80 """.strip() 81 82 print(WARNING) 83 84 print(PREAMBLE) 85 86 print("\n# ===== AFL fuzzers") 87 88 def get_id_name(s): 89 return s.replace("-", "_") 90 91 for fuzzer in FUZZERS: 92 idname = get_id_name(fuzzer) 93 print("""\ 94 if UNITTESTS_ENABLED 95 src_test_fuzz_fuzz_{name}_SOURCES = \\ 96 src/test/fuzz/fuzzing_common.c \\ 97 src/test/fuzz/fuzz_{name}.c 98 src_test_fuzz_fuzz_{name}_CPPFLAGS = $(FUZZING_CPPFLAGS) 99 src_test_fuzz_fuzz_{name}_CFLAGS = $(FUZZING_CFLAGS) 100 src_test_fuzz_fuzz_{name}_LDFLAGS = $(FUZZING_LDFLAG) 101 src_test_fuzz_fuzz_{name}_LDADD = $(FUZZING_LIBS) 102 endif 103 """.format(name=idname)) 104 105 print("if UNITTESTS_ENABLED") 106 print("FUZZERS = \\") 107 print(" \\\n".join("\tsrc/test/fuzz/fuzz-{name}".format(name=fuzzer) 108 for fuzzer in FUZZERS)) 109 print("endif") 110 111 print("\n# ===== libfuzzer") 112 print("\nif LIBFUZZER_ENABLED") 113 114 for fuzzer in FUZZERS: 115 idname = get_id_name(fuzzer) 116 print("""\ 117 if UNITTESTS_ENABLED 118 src_test_fuzz_lf_fuzz_{name}_SOURCES = \\ 119 $(src_test_fuzz_fuzz_{name}_SOURCES) 120 src_test_fuzz_lf_fuzz_{name}_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) 121 src_test_fuzz_lf_fuzz_{name}_CFLAGS = $(LIBFUZZER_CFLAGS) 122 src_test_fuzz_lf_fuzz_{name}_LDFLAGS = $(LIBFUZZER_LDFLAG) 123 src_test_fuzz_lf_fuzz_{name}_LDADD = $(LIBFUZZER_LIBS) 124 endif 125 """.format(name=idname)) 126 127 print("LIBFUZZER_FUZZERS = \\") 128 print(" \\\n".join("\tsrc/test/fuzz/lf-fuzz-{name}".format(name=fuzzer) 129 for fuzzer in FUZZERS)) 130 131 print(""" 132 else 133 LIBFUZZER_FUZZERS = 134 endif""") 135 136 print("\n# ===== oss-fuzz\n") 137 print("if OSS_FUZZ_ENABLED") 138 139 for fuzzer in FUZZERS: 140 idname = get_id_name(fuzzer) 141 print("""\ 142 if UNITTESTS_ENABLED 143 src_test_fuzz_liboss_fuzz_{name}_a_SOURCES = \\ 144 $(src_test_fuzz_fuzz_{name}_SOURCES) 145 src_test_fuzz_liboss_fuzz_{name}_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) 146 src_test_fuzz_liboss_fuzz_{name}_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) 147 endif 148 """.format(name=idname)) 149 150 print("OSS_FUZZ_FUZZERS = \\") 151 print(" \\\n".join("\tsrc/test/fuzz/liboss-fuzz-{name}.a".format(name=fuzzer) 152 for fuzzer in FUZZERS)) 153 154 print(""" 155 else 156 OSS_FUZZ_FUZZERS = 157 endif""") 158 159 print("") 160 161 print(POSTAMBLE)