##### 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 ================================================================ |