diff --git a/configure.ac b/configure.ac index 9691bfe2aba8d506ddc0788d77262424915cc7ea..8c5d98e50380bc2ac53cbc00acea0a90bf8ea999 100644 --- a/configure.ac +++ b/configure.ac @@ -452,6 +452,9 @@ gl_VISIBILITY() # Add code coverage macro AX_CODE_COVERAGE +AX_SANITIZER +AS_IF([test -n "$sanitize_CFLAGS"], [CFLAGS="$CFLAGS $sanitize_CFLAGS"]) + AS_IF([test "$enable_documentation" = "yes"],[ AC_PATH_PROGS([SPHINXBUILD], [sphinx-build sphinx-build-3], [false]) @@ -499,6 +502,8 @@ AC_MSG_RESULT([ Jansson: ${jansson_LIBS} ${jansson_CFLAGS} LMDB: ${enable_lmdb} ${lmdb_LIBS} ${lmdb_CFLAGS} + Sanitizer: ${sanitize_CFLAGS} + Prefix: ${prefix} Run dir: ${run_dir} Storage dir: ${storage_dir} diff --git a/m4/sanitizer.m4 b/m4/sanitizer.m4 new file mode 100644 index 0000000000000000000000000000000000000000..2888cd42af254611bed321092acb464a2e0eaa7e --- /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