summaryrefslogtreecommitdiffstats
path: root/m4/pdns_enable_sanitizers.m4
diff options
context:
space:
mode:
Diffstat (limited to 'm4/pdns_enable_sanitizers.m4')
-rw-r--r--m4/pdns_enable_sanitizers.m4167
1 files changed, 167 insertions, 0 deletions
diff --git a/m4/pdns_enable_sanitizers.m4 b/m4/pdns_enable_sanitizers.m4
new file mode 100644
index 0000000..6773e1a
--- /dev/null
+++ b/m4/pdns_enable_sanitizers.m4
@@ -0,0 +1,167 @@
+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_CHECK_HEADERS([sanitizer/common_interface_defs.h], asan_headers=yes, asan_headers=no)
+ AS_IF([test x"$asan_headers" = "xyes" ],
+ [AC_CHECK_DECL(__sanitizer_start_switch_fiber,
+ [
+ AC_MSG_CHECKING([for the exact signature of __sanitizer_finish_switch_fiber])
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM(
+ [#include <sanitizer/common_interface_defs.h>],
+ [
+ __sanitizer_finish_switch_fiber(nullptr);
+ ])
+ ], [
+ AC_MSG_RESULT([a single pointer])
+ AC_DEFINE([HAVE_FIBER_SANITIZER], [1], [Define if ASAN fiber annotation interface is available.])
+ AC_DEFINE(HAVE_SANITIZER_FINISH_SWITCH_FIBER_SINGLE_PTR, [1], [Define to 1 if __sanitizer_finish_switch_fiber takes only a pointer])
+ ], [
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM(
+ [#include <sanitizer/common_interface_defs.h>],
+ [
+ __sanitizer_finish_switch_fiber(nullptr, nullptr, nullptr);
+ ])
+ ], [
+ AC_MSG_RESULT([three pointers])
+ AC_DEFINE([HAVE_FIBER_SANITIZER], [1], [Define if ASAN fiber annotation interface is available.])
+ AC_DEFINE(HAVE_SANITIZER_FINISH_SWITCH_FIBER_THREE_PTRS, [1], [Define to 1 if __sanitizer_finish_switch_fiber takes three pointers])
+ ], [
+ AC_MSG_RESULT([unknown])
+ AC_MSG_NOTICE([ASAN fiber switching is not available due to an unknown API version])
+ ])
+ ])
+ ], [
+ AC_MSG_NOTICE([ASAN fiber switching is not available])
+ ],
+ [#include <sanitizer/common_interface_defs.h>]
+ )]
+ )
+ ],
+ [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])
+])
+