From: Ruben Kerkhof Date: Tue, 3 Feb 2015 21:53:48 +0000 (+0100) Subject: Add support for various sanitizers X-Git-Tag: dnsdist-1.0.0-alpha1~248^2~114^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F2180%2Fhead;p=thirdparty%2Fpdns.git Add support for various sanitizers - AddressSanitizer - ThreadSanitizer - LeakSanitizer - MemorySanitizer - Undefined Behavious Sanitizer --- diff --git a/configure.ac b/configure.ac index 1a09285371..f9fa81da27 100644 --- a/configure.ac +++ b/configure.ac @@ -327,6 +327,7 @@ AS_IF([test "x$static" != "xyes"], [ AC_SUBST([PROGRAM_LDFLAGS]) PDNS_ENABLE_COVERAGE +PDNS_ENABLE_SANITIZERS AC_SUBST(LIBS) @@ -337,6 +338,8 @@ AC_SUBST([AM_CPPFLAGS], AC_SUBST([YAHTTP_CFLAGS], ['-I$(top_srcdir)/pdns/ext/yahttp']) AC_SUBST([YAHTTP_LIBS], ['-L$(top_builddir)/pdns/ext/yahttp/yahttp -lyahttp']) +CXXFLAGS="$SANITIZER_FLAGS $CXXFLAGS" + export moduledirs moduleobjects modulelibs AC_CONFIG_FILES([ diff --git a/m4/pdns_enable_sanitizers.m4 b/m4/pdns_enable_sanitizers.m4 new file mode 100644 index 0000000000..339c258306 --- /dev/null +++ b/m4/pdns_enable_sanitizers.m4 @@ -0,0 +1,128 @@ +AC_DEFUN([PDNS_ENABLE_SANITIZERS], [ + PDNS_ENABLE_ASAN + PDNS_ENABLE_MSAN + PDNS_ENABLE_TSAN + PDNS_ENABLE_LSAN + PDNS_ENABLE_UBSAN + + AS_IF([test "x$enable_asan" != "xno" -a "x$enable_tsan" != "xno"],[ + AC_MSG_ERROR([Address Sanitizer is not compatible with Thread Sanitizer]) + ]) + + AS_IF([test "x$enable_msan" != "xno" -a "x$enable_asan" != "xno"],[ + AC_MSG_ERROR([Memory Sanitizer is not compatible with Address Sanitizer]) + ]) + + AS_IF([test "x$enable_msan" != "xno" -a "x$enable_lsan" != "xno"],[ + AC_MSG_ERROR([Memory Sanitizer is not compatible with Leak Sanitizer]) + ]) + + AS_IF([test "x$enable_msan" != "xno" -a "x$enable_tsan" != "xno"],[ + AC_MSG_ERROR([Memory Sanitizer is not compatible with Thread Sanitizer]) + ]) + + AS_IF([test "x$enable_asan" != "xno" -o "x$enable_tsan" != "xno" -o "x$enable_lsan" != "xno" -o "x$enable_ubsan" != "xno" -o "x$enable_msan" != "xno"], [ + gl_WARN_ADD([-fno-omit-frame-pointer]) + ]) +]) + +AC_DEFUN([PDNS_ENABLE_ASAN], [ + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + AC_MSG_CHECKING([whether to enable AddressSanitizer]) + AC_ARG_ENABLE([asan], + AS_HELP_STRING([--enable-asan], + [enable AddressSanitizer @<:@default=no@:>@]), + [enable_asan=$enableval], + [enable_asan=no] + ) + AC_MSG_RESULT([$enable_asan]) + + AS_IF([test "x$enable_asan" != "xno"], [ + gl_COMPILER_OPTION_IF([-fsanitize=address], + [SANITIZER_FLAGS="-fsanitize=address $SANITIZER_FLAGS"], + [AC_MSG_ERROR([Cannot enable AddressSanitizer])] + ) + ]) + AC_SUBST([SANITIZER_FLAGS]) +]) + +AC_DEFUN([PDNS_ENABLE_TSAN], [ + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + AC_MSG_CHECKING([whether to enable ThreadSanitizer]) + AC_ARG_ENABLE([tsan], + AS_HELP_STRING([--enable-tsan], + [enable ThreadSanitizer @<:@default=no@:>@]), + [enable_tsan=$enableval], + [enable_tsan=no] + ) + AC_MSG_RESULT([$enable_tsan]) + + AS_IF([test "x$enable_tsan" != "xno"], [ + gl_COMPILER_OPTION_IF([-fsanitize=thread], + [SANITIZER_FLAGS="-fsanitize=thread $SANITIZER_FLAGS"], + [AC_MSG_ERROR([Cannot enable ThreadSanitizer])] + ) + ]) + AC_SUBST([SANITIZER_FLAGS]) +]) + +AC_DEFUN([PDNS_ENABLE_LSAN], [ + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + AC_MSG_CHECKING([whether to enable LeakSanitizer]) + AC_ARG_ENABLE([lsan], + AS_HELP_STRING([--enable-lsan], + [enable LeakSanitizer @<:@default=no@:>@]), + [enable_lsan=$enableval], + [enable_lsan=no] + ) + AC_MSG_RESULT([$enable_lsan]) + + AS_IF([test "x$enable_lsan" != "xno"], [ + gl_COMPILER_OPTION_IF([-fsanitize=leak], + [SANITIZER_FLAGS="-fsanitize=leak $SANITIZER_FLAGS"], + [AC_MSG_ERROR([Cannot enable LeakSanitizer])] + ) + ]) + AC_SUBST([SANITIZER_FLAGS]) +]) + +AC_DEFUN([PDNS_ENABLE_UBSAN], [ + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + AC_MSG_CHECKING([whether to enable Undefined Behaviour Sanitizer]) + AC_ARG_ENABLE([ubsan], + AS_HELP_STRING([--enable-ubsan], + [enable Undefined Behaviour Sanitizer @<:@default=no@:>@]), + [enable_ubsan=$enableval], + [enable_ubsan=no] + ) + AC_MSG_RESULT([$enable_ubsan]) + + AS_IF([test "x$enable_ubsan" != "xno"], [ + gl_COMPILER_OPTION_IF([-fsanitize=undefined], + [SANITIZER_FLAGS="-fsanitize=undefined $SANITIZER_FLAGS"], + [AC_MSG_ERROR([Cannot enable Undefined Behaviour Sanitizer])] + ) + ]) + AC_SUBST([SANITIZER_FLAGS]) +]) + +AC_DEFUN([PDNS_ENABLE_MSAN], [ + AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) + AC_MSG_CHECKING([whether to enable MemorySanitizer]) + AC_ARG_ENABLE([msan], + AS_HELP_STRING([--enable-msan], + [enable MemorySanitizer @<:@default=no@:>@]), + [enable_msan=$enableval], + [enable_msan=no] + ) + AC_MSG_RESULT([$enable_msan]) + + AS_IF([test "x$enable_msan" != "xno"], [ + gl_COMPILER_OPTION_IF([-fsanitize=memory], + [SANITIZER_FLAGS="-fsanitize=memory $SANITIZER_FLAGS"], + [AC_MSG_ERROR([Cannot enable MemorySanitizer])] + ) + ]) + AC_SUBST([SANITIZER_FLAGS]) +]) +