1AC_DEFUN([PDNS_ENABLE_SANITIZERS], [
2  PDNS_ENABLE_ASAN
3  PDNS_ENABLE_MSAN
4  PDNS_ENABLE_TSAN
5  PDNS_ENABLE_LSAN
6  PDNS_ENABLE_UBSAN
7
8  AS_IF([test "x$enable_asan" != "xno" -a "x$enable_tsan" != "xno"],[
9    AC_MSG_ERROR([Address Sanitizer is not compatible with Thread Sanitizer])
10  ])
11
12  AS_IF([test "x$enable_msan" != "xno" -a "x$enable_asan" != "xno"],[
13    AC_MSG_ERROR([Memory Sanitizer is not compatible with Address Sanitizer])
14  ])
15
16  AS_IF([test "x$enable_msan" != "xno" -a "x$enable_lsan" != "xno"],[
17    AC_MSG_ERROR([Memory Sanitizer is not compatible with Leak Sanitizer])
18  ])
19
20  AS_IF([test "x$enable_msan" != "xno" -a "x$enable_tsan" != "xno"],[
21    AC_MSG_ERROR([Memory Sanitizer is not compatible with Thread Sanitizer])
22  ])
23
24  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"], [
25    gl_WARN_ADD([-fno-omit-frame-pointer])
26  ])
27])
28
29AC_DEFUN([PDNS_ENABLE_ASAN], [
30  AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS])
31  AC_MSG_CHECKING([whether to enable AddressSanitizer])
32  AC_ARG_ENABLE([asan],
33    AS_HELP_STRING([--enable-asan],
34      [enable AddressSanitizer @<:@default=no@:>@]),
35    [enable_asan=$enableval],
36    [enable_asan=no]
37  )
38  AC_MSG_RESULT([$enable_asan])
39
40  AS_IF([test "x$enable_asan" != "xno"], [
41    gl_COMPILER_OPTION_IF([-fsanitize=address],
42      [
43        [SANITIZER_FLAGS="-fsanitize=address $SANITIZER_FLAGS"]
44        AC_CHECK_HEADERS([sanitizer/common_interface_defs.h], asan_headers=yes, asan_headers=no)
45        AS_IF([test x"$asan_headers" = "xyes" ],
46          [AC_CHECK_DECL(__sanitizer_start_switch_fiber,
47            [
48              AC_MSG_CHECKING([for the exact signature of __sanitizer_finish_switch_fiber])
49              AC_COMPILE_IFELSE([
50                AC_LANG_PROGRAM(
51                  [#include <sanitizer/common_interface_defs.h>],
52                  [
53                    __sanitizer_finish_switch_fiber(nullptr);
54                  ])
55              ], [
56                AC_MSG_RESULT([a single pointer])
57                AC_DEFINE([HAVE_FIBER_SANITIZER], [1], [Define if ASAN fiber annotation interface is available.])
58                AC_DEFINE(HAVE_SANITIZER_FINISH_SWITCH_FIBER_SINGLE_PTR, [1], [Define to 1 if __sanitizer_finish_switch_fiber takes only a pointer])
59              ], [
60                AC_COMPILE_IFELSE([
61                  AC_LANG_PROGRAM(
62                    [#include <sanitizer/common_interface_defs.h>],
63                    [
64                      __sanitizer_finish_switch_fiber(nullptr, nullptr, nullptr);
65                    ])
66                ], [
67                  AC_MSG_RESULT([three pointers])
68                  AC_DEFINE([HAVE_FIBER_SANITIZER], [1], [Define if ASAN fiber annotation interface is available.])
69                  AC_DEFINE(HAVE_SANITIZER_FINISH_SWITCH_FIBER_THREE_PTRS, [1], [Define to 1 if __sanitizer_finish_switch_fiber takes three pointers])
70                ], [
71                  AC_MSG_RESULT([unknown])
72                  AC_MSG_NOTICE([ASAN fiber switching is not available due to an unknown API version])
73                ])
74              ])
75            ], [
76              AC_MSG_NOTICE([ASAN fiber switching is not available])
77            ],
78            [#include <sanitizer/common_interface_defs.h>]
79          )]
80        )
81      ],
82      [AC_MSG_ERROR([Cannot enable AddressSanitizer])]
83    )
84  ])
85  AC_SUBST([SANITIZER_FLAGS])
86])
87
88AC_DEFUN([PDNS_ENABLE_TSAN], [
89  AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS])
90  AC_MSG_CHECKING([whether to enable ThreadSanitizer])
91  AC_ARG_ENABLE([tsan],
92    AS_HELP_STRING([--enable-tsan],
93      [enable ThreadSanitizer @<:@default=no@:>@]),
94    [enable_tsan=$enableval],
95    [enable_tsan=no]
96  )
97  AC_MSG_RESULT([$enable_tsan])
98
99  AS_IF([test "x$enable_tsan" != "xno"], [
100    gl_COMPILER_OPTION_IF([-fsanitize=thread],
101      [SANITIZER_FLAGS="-fsanitize=thread $SANITIZER_FLAGS"],
102      [AC_MSG_ERROR([Cannot enable ThreadSanitizer])]
103    )
104  ])
105  AC_SUBST([SANITIZER_FLAGS])
106])
107
108AC_DEFUN([PDNS_ENABLE_LSAN], [
109  AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS])
110  AC_MSG_CHECKING([whether to enable LeakSanitizer])
111  AC_ARG_ENABLE([lsan],
112    AS_HELP_STRING([--enable-lsan],
113      [enable LeakSanitizer @<:@default=no@:>@]),
114    [enable_lsan=$enableval],
115    [enable_lsan=no]
116  )
117  AC_MSG_RESULT([$enable_lsan])
118
119  AS_IF([test "x$enable_lsan" != "xno"], [
120    gl_COMPILER_OPTION_IF([-fsanitize=leak],
121      [SANITIZER_FLAGS="-fsanitize=leak $SANITIZER_FLAGS"],
122      [AC_MSG_ERROR([Cannot enable LeakSanitizer])]
123    )
124  ])
125  AC_SUBST([SANITIZER_FLAGS])
126])
127
128AC_DEFUN([PDNS_ENABLE_UBSAN], [
129  AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS])
130  AC_MSG_CHECKING([whether to enable Undefined Behaviour Sanitizer])
131  AC_ARG_ENABLE([ubsan],
132    AS_HELP_STRING([--enable-ubsan],
133      [enable Undefined Behaviour Sanitizer @<:@default=no@:>@]),
134    [enable_ubsan=$enableval],
135    [enable_ubsan=no]
136  )
137  AC_MSG_RESULT([$enable_ubsan])
138
139  AS_IF([test "x$enable_ubsan" != "xno"], [
140    gl_COMPILER_OPTION_IF([-fsanitize=undefined],
141      [SANITIZER_FLAGS="-fsanitize=undefined $SANITIZER_FLAGS"],
142      [AC_MSG_ERROR([Cannot enable Undefined Behaviour Sanitizer])]
143    )
144  ])
145  AC_SUBST([SANITIZER_FLAGS])
146])
147
148AC_DEFUN([PDNS_ENABLE_MSAN], [
149  AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS])
150  AC_MSG_CHECKING([whether to enable MemorySanitizer])
151  AC_ARG_ENABLE([msan],
152    AS_HELP_STRING([--enable-msan],
153      [enable MemorySanitizer @<:@default=no@:>@]),
154    [enable_msan=$enableval],
155    [enable_msan=no]
156  )
157  AC_MSG_RESULT([$enable_msan])
158
159  AS_IF([test "x$enable_msan" != "xno"], [
160    gl_COMPILER_OPTION_IF([-fsanitize=memory],
161      [SANITIZER_FLAGS="-fsanitize=memory $SANITIZER_FLAGS"],
162      [AC_MSG_ERROR([Cannot enable MemorySanitizer])]
163    )
164  ])
165  AC_SUBST([SANITIZER_FLAGS])
166])
167
168