| @@ -261,19 +261,24 @@ check: tests/encoding.check \ | |||
| ##### 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 | |||
| tests_libfuzzrunner_la_CFLAGS = -Isrc/libespeak-ng ${AM_CFLAGS} | |||
| tests_libfuzzrunner_la_SOURCES = tests/fuzzrunner.c | |||
| endif | |||
| 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_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 | |||
| @echo " TEST $<" | |||
| @@ -7,7 +7,8 @@ | |||
| - [Dependencies](#dependencies) | |||
| - [Building](#building-1) | |||
| - [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) | |||
| - [Extended Dictionary Configuration](#extended-dictionary-configuration) | |||
| - [Testing](#testing) | |||
| @@ -177,7 +178,7 @@ built it locally you can perform the cross compilation using: | |||
| ./configure --build=... --host=... --target=... | |||
| 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 | |||
| the appropriate `CFLAGS` and `LDFLAGS` options to `configure`. For example: | |||
| @@ -188,6 +189,20 @@ the appropriate `CFLAGS` and `LDFLAGS` options to `configure`. For example: | |||
| make | |||
| 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 | |||
| The following `configure` options control which eSpeak NG features are enabled: | |||
| @@ -86,6 +86,7 @@ fi | |||
| dnl ================================================================ | |||
| dnl FreeBSD check. | |||
| dnl ================================================================ | |||
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ | |||
| #if ! defined(__FreeBSD__) | |||
| #error macro not defined | |||
| @@ -282,6 +283,22 @@ AX_CHECK_COMPILE_FLAG([-Wuninitialized], [CFLAGS="-Wuninitialized $CFLAG | |||
| AX_CHECK_COMPILE_FLAG([-Wunused], [CFLAGS="-Wunused $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 Generate output. | |||
| dnl ================================================================ | |||