summaryrefslogtreecommitdiffstats
path: root/m4
diff options
context:
space:
mode:
authorJan Vcelak <jan.vcelak@nic.cz>2015-11-23 17:25:24 +0100
committerJan Vcelak <jan.vcelak@nic.cz>2015-11-23 17:27:52 +0100
commite48f309fb49fd77cf1108bdf8c5f794c70575d62 (patch)
treeb671c243894ab6e28e6a0723416f0a06ad836149 /m4
parenttests/confio: fix buffer overflow and memory leaks (diff)
downloadknot-e48f309fb49fd77cf1108bdf8c5f794c70575d62.tar.xz
knot-e48f309fb49fd77cf1108bdf8c5f794c70575d62.zip
configure: support for address sanitizer
Diffstat (limited to 'm4')
-rw-r--r--m4/sanitizer.m471
1 files changed, 71 insertions, 0 deletions
diff --git a/m4/sanitizer.m4 b/m4/sanitizer.m4
new file mode 100644
index 000000000..2888cd42a
--- /dev/null
+++ b/m4/sanitizer.m4
@@ -0,0 +1,71 @@
+# Copyright 2015 CZ.NIC, z.s.p.o.
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 3, as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranties of
+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#
+# Processes --with-sanitize= and --with-sanitize-coverage= flags, checks
+# if the options are supported by the compiler, and sets the following
+# variables accordingly:
+#
+# - sanitize_enabled yes|no
+# - sanitize_coverage_enabled yes|no
+# - sanitize_CFLAGS -fsanitize=... -fsanitize-coverage=...
+#
+AC_DEFUN([AX_SANITIZER], [
+
+ # Configure options
+ AC_ARG_WITH([sanitize],
+ [AS_HELP_STRING([--with-sanitize], [Compile with sanitizer [default=no]])],
+ [],
+ [with_sanitize=no]
+ )
+ AC_ARG_WITH([sanitize-coverage],
+ [AS_HELP_STRING([--with-sanitize-coverage], [Compile with sanitizer coverage [default=no]])],
+ [],
+ [with_sanitize_coverage=no]
+ )
+
+ # Default values
+ AS_IF([test "$with_sanitize" = "yes"], [ with_sanitize=address ])
+ AS_IF([test "$with_sanitize_coverage" = "yes"], [ with_sanitize_coverage=edge,indirect-calls,8bit-counters ])
+
+ # Construct output variables
+ sanitize_enabled=no
+ sanitize_coverage_enabled=no
+ AS_IF([test "$with_sanitize" != "no"], [
+ sanitize_CFLAGS="-fsanitize=${with_sanitize}"
+ sanitize_enabled=yes
+ AS_IF([test "$with_sanitize_coverage" != "no"], [
+ sanitize_CFLAGS="$sanitize_CFLAGS -fsanitize-coverage=${with_sanitize_coverage}"
+ sanitize_coverage_enabled=yes
+ ])
+ ], [
+ sanitize_CFLAGS=
+ AS_IF([test "$with_sanitize_coverage" != "no"], [
+ AC_MSG_WARN([--with-sanitize-coverage cannot be used without --with-sanitize])
+ ])
+ ])
+
+ # Test compiler support
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $sanitize_CFLAGS"
+ AC_MSG_CHECKING([whether compiler accepts '${sanitize_CFLAGS}' options])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [
+ AC_MSG_RESULT([yes])
+ ], [
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([Sanitizer options are not supported.])
+ ])
+ CFLAGS="$save_CFLAGS"
+
+]) # AX_SANITIZER