diff options
Diffstat (limited to 'build/autoconf/sanitize.m4')
-rw-r--r-- | build/autoconf/sanitize.m4 | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/build/autoconf/sanitize.m4 b/build/autoconf/sanitize.m4 new file mode 100644 index 0000000000..11fc6caebb --- /dev/null +++ b/build/autoconf/sanitize.m4 @@ -0,0 +1,135 @@ +dnl This Source Code Form is subject to the terms of the Mozilla Public +dnl License, v. 2.0. If a copy of the MPL was not distributed with this +dnl file, You can obtain one at http://mozilla.org/MPL/2.0/. + +AC_DEFUN([MOZ_CONFIG_SANITIZE], [ + +dnl ======================================================== +dnl = Use Address Sanitizer +dnl ======================================================== +if test -n "$MOZ_ASAN"; then + if test -n "$CLANG_CL"; then + # Look for the ASan runtime binary + if test "$CPU_ARCH" = "x86_64"; then + MOZ_CLANG_RT_ASAN_LIB=clang_rt.asan_dynamic-x86_64.dll + else + MOZ_CLANG_RT_ASAN_LIB=clang_rt.asan_dynamic-i386.dll + fi + # We use MOZ_PATH_PROG in order to get a Windows style path. + MOZ_PATH_PROG(MOZ_CLANG_RT_ASAN_LIB_PATH, $MOZ_CLANG_RT_ASAN_LIB) + if test -z "$MOZ_CLANG_RT_ASAN_LIB_PATH"; then + AC_MSG_ERROR([Couldn't find $MOZ_CLANG_RT_ASAN_LIB. It should be available in the same location as clang-cl.]) + fi + AC_SUBST(MOZ_CLANG_RT_ASAN_LIB_PATH) + # Suppressing errors in recompiled code. + if test "$OS_ARCH" = "WINNT"; then + CFLAGS="-fsanitize-blacklist=$_topsrcdir/build/sanitizers/asan_blacklist_win.txt $CFLAGS" + CXXFLAGS="-fsanitize-blacklist=$_topsrcdir/build/sanitizers/asan_blacklist_win.txt $CXXFLAGS" + fi + fi + CFLAGS="-fsanitize=address $CFLAGS" + CXXFLAGS="-fsanitize=address $CXXFLAGS" + if test -z "$CLANG_CL"; then + LDFLAGS="-fsanitize=address -rdynamic $LDFLAGS" + fi + AC_DEFINE(MOZ_ASAN) + MOZ_PATH_PROG(LLVM_SYMBOLIZER, llvm-symbolizer) +fi +AC_SUBST(MOZ_ASAN) + +dnl ======================================================== +dnl = Use Memory Sanitizer +dnl ======================================================== +if test -n "$MOZ_MSAN"; then + CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins $CFLAGS" + CXXFLAGS="-fsanitize=memory -fsanitize-memory-track-origins $CXXFLAGS" + if test -z "$CLANG_CL"; then + LDFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -rdynamic $LDFLAGS" + fi + AC_DEFINE(MOZ_MSAN) + MOZ_PATH_PROG(LLVM_SYMBOLIZER, llvm-symbolizer) +fi +AC_SUBST(MOZ_MSAN) + +dnl ======================================================== +dnl = Use Thread Sanitizer +dnl ======================================================== +if test -n "$MOZ_TSAN"; then + CFLAGS="-fsanitize=thread $CFLAGS" + CXXFLAGS="-fsanitize=thread $CXXFLAGS" + if test -z "$CLANG_CL"; then + LDFLAGS="-fsanitize=thread -rdynamic $LDFLAGS" + fi + AC_DEFINE(MOZ_TSAN) + MOZ_PATH_PROG(LLVM_SYMBOLIZER, llvm-symbolizer) +fi +AC_SUBST(MOZ_TSAN) + +dnl ======================================================== +dnl = Use UndefinedBehavior Sanitizer (with custom checks) +dnl ======================================================== +if test -n "$MOZ_UBSAN_CHECKS"; then + MOZ_UBSAN=1 + UBSAN_TXT="$_objdir/ubsan_blacklist.txt" + cat $_topsrcdir/build/sanitizers/ubsan_*_blacklist.txt > $UBSAN_TXT + UBSAN_FLAGS="-fsanitize=$MOZ_UBSAN_CHECKS -fno-sanitize-recover=$MOZ_UBSAN_CHECKS -fsanitize-blacklist=$UBSAN_TXT" + CFLAGS="$UBSAN_FLAGS $CFLAGS" + CXXFLAGS="$UBSAN_FLAGS $CXXFLAGS" + if test -z "$CLANG_CL"; then + LDFLAGS="-fsanitize=undefined -rdynamic $LDFLAGS" + fi + AC_DEFINE(MOZ_UBSAN) + MOZ_PATH_PROG(LLVM_SYMBOLIZER, llvm-symbolizer) +fi +AC_SUBST(MOZ_UBSAN) + +dnl ======================================================== +dnl = Use UndefinedBehavior Sanitizer to find integer overflows +dnl ======================================================== +if test -n "$MOZ_SIGNED_OVERFLOW_SANITIZE$MOZ_UNSIGNED_OVERFLOW_SANITIZE"; then + MOZ_UBSAN=1 + SANITIZER_BLACKLISTS="" + if test -n "$MOZ_SIGNED_OVERFLOW_SANITIZE"; then + SANITIZER_BLACKLISTS="-fsanitize-blacklist=$_topsrcdir/build/sanitizers/ubsan_signed_overflow_blacklist.txt $SANITIZER_BLACKLISTS" + CFLAGS="-fsanitize=signed-integer-overflow $CFLAGS" + CXXFLAGS="-fsanitize=signed-integer-overflow $CXXFLAGS" + if test -z "$CLANG_CL"; then + LDFLAGS="-fsanitize=signed-integer-overflow -rdynamic $LDFLAGS" + fi + AC_DEFINE(MOZ_SIGNED_OVERFLOW_SANITIZE) + fi + if test -n "$MOZ_UNSIGNED_OVERFLOW_SANITIZE"; then + SANITIZER_BLACKLISTS="-fsanitize-blacklist=$_topsrcdir/build/sanitizers/ubsan_unsigned_overflow_blacklist.txt $SANITIZER_BLACKLISTS" + CFLAGS="-fsanitize=unsigned-integer-overflow $CFLAGS" + CXXFLAGS="-fsanitize=unsigned-integer-overflow $CXXFLAGS" + if test -z "$CLANG_CL"; then + LDFLAGS="-fsanitize=unsigned-integer-overflow -rdynamic $LDFLAGS" + fi + AC_DEFINE(MOZ_UNSIGNED_OVERFLOW_SANITIZE) + fi + CFLAGS="$SANITIZER_BLACKLISTS $CFLAGS" + CXXFLAGS="$SANITIZER_BLACKLISTS $CXXFLAGS" + AC_DEFINE(MOZ_UBSAN) + MOZ_PATH_PROG(LLVM_SYMBOLIZER, llvm-symbolizer) +fi +AC_SUBST(MOZ_SIGNED_OVERFLOW_SANITIZE) +AC_SUBST(MOZ_UNSIGNED_OVERFLOW_SANITIZE) +AC_SUBST(MOZ_UBSAN) + +dnl ======================================================= +dnl = Required for stand-alone (sanitizer-less) libFuzzer. +dnl ======================================================= +if test -n "$LIBFUZZER"; then + LDFLAGS="$LIBFUZZER_FLAGS -rdynamic $LDFLAGS" +fi + +# The LLVM symbolizer is used by all sanitizers +AC_SUBST(LLVM_SYMBOLIZER) + +dnl ======================================================== +dnl = Test for whether the compiler is compatible with the +dnl = given sanitize options. +dnl ======================================================== +AC_TRY_LINK(,,,AC_MSG_ERROR([compiler is incompatible with sanitize options])) + +]) |