| ##### fuzzer: | ##### fuzzer: | ||||
| # When OSS-Fuzz [https://github.com/google/oss-fuzz] runs our fuzzer, it sets | |||||
| # LIB_FUZZING_ENGINE to libFuzzer [http://llvm.org/docs/LibFuzzer.html]. | |||||
| # When running outside OSS-Fuzz, we link against our own stub fuzzrunner. | |||||
| LIB_FUZZING_ENGINE ?= tests/libfuzzrunner.la | |||||
| if !HAVE_LIBFUZZER | |||||
| # libfuzzrunner is a stub implementation of libFuzzer that calls the | |||||
| # LLVMFuzzerTestOneInput with the files passed to the fuzzer program. | |||||
| lib_LTLIBRARIES += tests/libfuzzrunner.la | lib_LTLIBRARIES += tests/libfuzzrunner.la | ||||
| tests_libfuzzrunner_la_CFLAGS = -Isrc/libespeak-ng ${AM_CFLAGS} | tests_libfuzzrunner_la_CFLAGS = -Isrc/libespeak-ng ${AM_CFLAGS} | ||||
| tests_libfuzzrunner_la_SOURCES = tests/fuzzrunner.c | tests_libfuzzrunner_la_SOURCES = tests/fuzzrunner.c | ||||
| endif | |||||
| noinst_bin_PROGRAMS += tests/ssml-fuzzer.test | noinst_bin_PROGRAMS += tests/ssml-fuzzer.test | ||||
| tests_ssml_fuzzer_test_LDADD = src/libespeak-ng.la ${LIB_FUZZING_ENGINE} | |||||
| tests_ssml_fuzzer_test_LDADD = src/libespeak-ng.la | |||||
| tests_ssml_fuzzer_test_SOURCES = tests/ssml-fuzzer.c | tests_ssml_fuzzer_test_SOURCES = tests/ssml-fuzzer.c | ||||
| tests_ssml_fuzzer_test_DEPENDENCIES = src/libespeak-ng.la tests/libfuzzrunner.la | |||||
| if HAVE_LIBFUZZER | |||||
| tests_ssml_fuzzer_test_CFLAGS = -fsanitize=fuzzer | |||||
| tests_ssml_fuzzer_test_LDFLAGS = -fsanitize=fuzzer | |||||
| else | |||||
| tests_ssml_fuzzer_test_LDADD += tests/libfuzzrunner.la | |||||
| endif | |||||
| tests/ssml-fuzzer.check: tests/ssml-fuzzer.test | tests/ssml-fuzzer.check: tests/ssml-fuzzer.test | ||||
| @echo " TEST $<" | @echo " TEST $<" |
| - [Dependencies](#dependencies) | - [Dependencies](#dependencies) | ||||
| - [Building](#building-1) | - [Building](#building-1) | ||||
| - [Cross Compilation](#cross-compilation) | - [Cross Compilation](#cross-compilation) | ||||
| - [Sanitizer](#sanitizer) | |||||
| - [Sanitizer Flag Configuration](#sanitizer-flag-configuration) | |||||
| - [LLVM Fuzzer Support](#llvm-fuzzer-support) | |||||
| - [eSpeak NG Feature Configuration](#espeak-ng-feature-configuration) | - [eSpeak NG Feature Configuration](#espeak-ng-feature-configuration) | ||||
| - [Extended Dictionary Configuration](#extended-dictionary-configuration) | - [Extended Dictionary Configuration](#extended-dictionary-configuration) | ||||
| - [Testing](#testing) | - [Testing](#testing) | ||||
| ./configure --build=... --host=... --target=... | ./configure --build=... --host=... --target=... | ||||
| make -B src/espeak-ng src/speak-ng | make -B src/espeak-ng src/speak-ng | ||||
| #### Sanitizer | |||||
| #### Sanitizer Flag Configuration | |||||
| It is possible to build eSpeak NG with the gcc or clang sanitizer by passing | It is possible to build eSpeak NG with the gcc or clang sanitizer by passing | ||||
| the appropriate `CFLAGS` and `LDFLAGS` options to `configure`. For example: | the appropriate `CFLAGS` and `LDFLAGS` options to `configure`. For example: | ||||
| make | make | ||||
| make check | make check | ||||
| __NOTE:__ The `-fsanitize=fuzzer` option does not work when using the above | |||||
| configuration method. This is because `clang` will use the `libFuzzer` library | |||||
| which defines its own `main` and requires `LLVMFuzzerTestOneInput` to be | |||||
| defined. This breaks the autoconf check to see if the C compiler works. | |||||
| #### LLVM Fuzzer Support | |||||
| To enable libFuzzer support you need clang 6.0 or later. It is enabled with | |||||
| the following: | |||||
| CC=clang-6.0 ./configure --with-libfuzzer=yes | |||||
| make | |||||
| make check | |||||
| #### eSpeak NG Feature Configuration | #### eSpeak NG Feature Configuration | ||||
| The following `configure` options control which eSpeak NG features are enabled: | The following `configure` options control which eSpeak NG features are enabled: |
| dnl ================================================================ | dnl ================================================================ | ||||
| dnl FreeBSD check. | dnl FreeBSD check. | ||||
| dnl ================================================================ | dnl ================================================================ | ||||
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ | AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ | ||||
| #if ! defined(__FreeBSD__) | #if ! defined(__FreeBSD__) | ||||
| #error macro not defined | #error macro not defined | ||||
| AX_CHECK_COMPILE_FLAG([-Wunused], [CFLAGS="-Wunused $CFLAGS"]) | AX_CHECK_COMPILE_FLAG([-Wunused], [CFLAGS="-Wunused $CFLAGS"]) | ||||
| AX_CHECK_COMPILE_FLAG([-Wunused-parameter], [CFLAGS="-Wunused-parameter $CFLAGS"]) | AX_CHECK_COMPILE_FLAG([-Wunused-parameter], [CFLAGS="-Wunused-parameter $CFLAGS"]) | ||||
| dnl ================================================================ | |||||
| dnl libFuzzer checks. | |||||
| dnl ================================================================ | |||||
| AC_ARG_WITH([libfuzzer], | |||||
| [AS_HELP_STRING([--with-libfuzzer], [enable libFuzzer in the fuzzer tests @<:@default=no@:>@])], | |||||
| []) | |||||
| if test "$with_libfuzzer" = "yes" ; then | |||||
| have_libfuzzer=yes | |||||
| else | |||||
| have_libfuzzer=no | |||||
| fi | |||||
| AM_CONDITIONAL(HAVE_LIBFUZZER, [test x"$have_libfuzzer" = xyes]) | |||||
| dnl ================================================================ | dnl ================================================================ | ||||
| dnl Generate output. | dnl Generate output. | ||||
| dnl ================================================================ | dnl ================================================================ |