]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add support for various sanitizers 2180/head
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Tue, 3 Feb 2015 21:53:48 +0000 (22:53 +0100)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Fri, 20 Feb 2015 19:49:20 +0000 (20:49 +0100)
- AddressSanitizer
- ThreadSanitizer
- LeakSanitizer
- MemorySanitizer
- Undefined Behavious Sanitizer

configure.ac
m4/pdns_enable_sanitizers.m4 [new file with mode: 0644]

index 1a092853714a613adf8a451d7aaeae2b80c0939f..f9fa81da27523d55b00b31175dfc2cd0654b41ae 100644 (file)
@@ -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 (file)
index 0000000..339c258
--- /dev/null
@@ -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])
+])
+