From 052a228be7186a513b1e894add4ba4db814681da Mon Sep 17 00:00:00 2001 From: djcb Date: Sat, 3 Nov 2018 15:47:39 +0200 Subject: [PATCH] add optional support for building with asan --- configure.ac | 11 +++++++++++ guile/Makefile.am | 8 +++++--- guile/tests/Makefile.am | 33 +++++++++++++++++---------------- lib/Makefile.am | 9 +++++++-- lib/parser/Makefile.am | 2 ++ lib/tests/Makefile.am | 11 +++++++++-- mu/Makefile.am | 5 +++++ mu/tests/Makefile.am | 12 ++++++++++-- 8 files changed, 66 insertions(+), 25 deletions(-) diff --git a/configure.ac b/configure.ac index 15227a20..87575d59 100644 --- a/configure.ac +++ b/configure.ac @@ -53,6 +53,7 @@ AX_CXX_COMPILE_STDCXX_14 m4_ifdef([AX_COMPILER_FLAGS],[AX_COMPILER_FLAGS(,,[yes],${extra_flags})]) AX_VALGRIND_CHECK + # for now, use AM_PROG_LIBTOOL, as we don't want to require # a too new setup for autotools/libtool AM_PROG_LIBTOOL @@ -66,6 +67,16 @@ AC_CHECK_HEADERS([wordexp.h]) # use the 64-bit versions AC_SYS_LARGEFILE +# asan is somewhat similar to valgrind, but has low enough overhead so it +# can be used during normal operation. +AC_ARG_ENABLE([asan],[AS_HELP_STRING([--enable-asan], + [Enable Address Sanitizer])], [use_asan=$enableval], [use_asan=no]) +AS_IF([test "x$use_asan" = "xyes"],[ + AC_SUBST(ASAN_CFLAGS, "-fsanitize=address -static-libasan -fno-omit-frame-pointer") + AC_SUBST(ASAN_CXXFLAGS,"-fsanitize=address -static-libasan -fno-omit-frame-pointer") + AC_SUBST(ASAN_LDFLAGS, "-fsanitize=address -static-libasan -fno-omit-frame-pointer") +]) + # check for makeinfo AC_CHECK_PROG(have_makeinfo,makeinfo,yes,no) AM_CONDITIONAL(HAVE_MAKEINFO,test "x$have_makeinfo" = "xyes") diff --git a/guile/Makefile.am b/guile/Makefile.am index 15ca95cb..22d89b51 100644 --- a/guile/Makefile.am +++ b/guile/Makefile.am @@ -28,8 +28,8 @@ AM_CPPFLAGS= \ # don't use -Werror, as it might break on other compilers # use -Wno-unused-parameters, because some callbacks may not # really need all the params they get -AM_CFLAGS=${WARN_CFLAGS} -AM_CXXFLAGS=${WARN_CXXFLAGS} +AM_CFLAGS=$(ASAN_CFLAGS) ${WARN_CFLAGS} +AM_CXXFLAGS=$(ASAN_CXXFLAGS) ${WARN_CXXFLAGS} lib_LTLIBRARIES= \ libguile-mu.la @@ -44,7 +44,9 @@ libguile_mu_la_LIBADD= \ ${top_builddir}/lib/libmu.la \ ${GUILE_LIBS} -libguile_mu_la_LDFLAGS= -export-dynamic +libguile_mu_la_LDFLAGS= \ + $(ASAN_LDFLAGS) + -export-dynamic XFILES= \ mu-guile.x \ diff --git a/guile/tests/Makefile.am b/guile/tests/Makefile.am index 60c0552f..e65d1f5b 100644 --- a/guile/tests/Makefile.am +++ b/guile/tests/Makefile.am @@ -16,26 +16,27 @@ include $(top_srcdir)/gtest.mk -AM_CPPFLAGS=$(XAPIAN_CXXFLAGS) \ - $(GMIME_CFLAGS) \ - $(GLIB_CFLAGS) \ - -I ${top_srcdir} \ - -I ${top_srcdir}/lib \ - -I ${top_srcdir}/lib/tests \ - -DMU_TESTMAILDIR=\"${top_srcdir}/lib/tests/testdir\" \ - -DMU_TESTMAILDIR2=\"${top_srcdir}/lib/tests/testdir2\" \ - -DMU_TESTMAILDIR3=\"${top_srcdir}/lib/tests/testdir3\" \ - -DMU_PROGRAM=\"${abs_top_builddir}/mu/mu\" \ - -DMU_GUILE_MODULE_PATH=\"${abs_top_srcdir}/guile/\" \ - -DMU_GUILE_LIBRARY_PATH=\"${abs_top_builddir}/guile/.libs\" \ - -DABS_CURDIR=\"${abs_builddir}\" \ +AM_CPPFLAGS=$(XAPIAN_CXXFLAGS) \ + $(GMIME_CFLAGS) \ + $(GLIB_CFLAGS) \ + -I ${top_srcdir} \ + -I ${top_srcdir}/lib \ + -I ${top_srcdir}/lib/tests \ + -DMU_TESTMAILDIR=\"${top_srcdir}/lib/tests/testdir\" \ + -DMU_TESTMAILDIR2=\"${top_srcdir}/lib/tests/testdir2\" \ + -DMU_TESTMAILDIR3=\"${top_srcdir}/lib/tests/testdir3\" \ + -DMU_PROGRAM=\"${abs_top_builddir}/mu/mu\" \ + -DMU_GUILE_MODULE_PATH=\"${abs_top_srcdir}/guile/\" \ + -DMU_GUILE_LIBRARY_PATH=\"${abs_top_builddir}/guile/.libs\" \ + -DABS_CURDIR=\"${abs_builddir}\" \ -DABS_SRCDIR=\"${abs_srcdir}\" # don't use -Werror, as it might break on other compilers # use -Wno-unused-parameters, because some callbacks may not # really need all the params they get -AM_CFLAGS=-Wall -Wextra -Wno-unused-parameter -Wdeclaration-after-statement -AM_CXXFLAGS=-Wall -Wextra -Wno-unused-parameter +AM_CFLAGS=$(ASAN_CFLAGS) ${WARN_CFLAGS} +AM_CXXFLAGS=$(ASAN_CXXFLAGS) ${WARN_CXXFLAGS} +AM_LDFLAGS=$(ASAN_LDFLAGS) noinst_PROGRAMS= $(TEST_PROGS) @@ -44,7 +45,7 @@ test_mu_guile_SOURCES= test-mu-guile.c dummy.cc test_mu_guile_LDADD=${top_builddir}/lib/tests/libtestmucommon.la # we need to use dummy.cc to enforce c++ linking... -BUILT_SOURCES= \ +BUILT_SOURCES= \ dummy.cc dummy.cc: touch dummy.cc diff --git a/lib/Makefile.am b/lib/Makefile.am index ca690155..be8d6db5 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -25,19 +25,20 @@ AM_CFLAGS= \ $(GMIME_CFLAGS) \ $(GLIB_CFLAGS) \ $(GUILE_CFLAGS) \ + $(ASAN_CFLAGS) \ -Wno-format-nonliteral \ -Wno-switch-enum \ -Wno-suggest-attribute=format \ -Wno-deprecated-declarations \ -Wno-inline - AM_CXXFLAGS= \ $(WARN_CXXFLAGS) \ $(GMIME_CFLAGS) \ $(GLIB_CFLAGS) \ $(XAPIAN_CXXFLAGS) \ - $(GUILE_CFLAGS) + $(GUILE_CFLAGS) \ + $(ASAN_CXXFLAGS) # don't use -Werror, as it might break on other compilers # use -Wno-unused-parameters, because some callbacks may not @@ -109,6 +110,10 @@ libmu_la_LIBADD= \ $(GUILE_LIBS) \ ${builddir}/parser/libmuxparser.la +libmu_la_LDFLAGS= \ + $(ASAN_LDFLAGS) + + EXTRA_DIST= \ mu-msg-crypto.c \ doxyfile.in diff --git a/lib/parser/Makefile.am b/lib/parser/Makefile.am index 6894f8b4..b5acfb54 100644 --- a/lib/parser/Makefile.am +++ b/lib/parser/Makefile.am @@ -25,6 +25,7 @@ AM_CXXFLAGS= \ $(XAPIAN_CXXFLAGS) \ $(WARN_CXXFLAGS) \ $(GCOV_CFLAGS) \ + $(ASAN_CXXFLAGS) \ -Wno-inline \ -Wno-switch-enum @@ -32,6 +33,7 @@ AM_CPPFLAGS= \ $(GCOV_CFLAGS) AM_LDFLAGS= \ + $(ASAN_LDFLAGS) \ $(WARN_LDFLAGS) \ $(GCOV_LDADD) diff --git a/lib/tests/Makefile.am b/lib/tests/Makefile.am index eb468da7..6170d25e 100644 --- a/lib/tests/Makefile.am +++ b/lib/tests/Makefile.am @@ -31,8 +31,15 @@ AM_CPPFLAGS=$(XAPIAN_CXXFLAGS) \ # don't use -Werror, as it might break on other compilers # use -Wno-unused-parameters, because some callbacks may not # really need all the params they get -AM_CFLAGS=-Wall -Wextra -Wno-unused-parameter -Wdeclaration-after-statement -AM_CXXFLAGS=-Wall -Wextra -Wno-unused-parameter +AM_CFLAGS= \ + $(WARN_CFLAGS) \ + $(ASAN_CFLAGS) +AM_CXXFLAGS= \ + $(WARN_CXXFLAGS) \ + $(ASAN_CXXFLAGS) + +AM_LDFLAGS= \ + $(ASAN_LDFLAGS) noinst_PROGRAMS= $(TEST_PROGS) diff --git a/mu/Makefile.am b/mu/Makefile.am index bd948548..a35e7ec1 100644 --- a/mu/Makefile.am +++ b/mu/Makefile.am @@ -26,13 +26,18 @@ AM_CPPFLAGS=-I${top_srcdir}/lib $(GLIB_CFLAGS) # use -Wno-unused-parameters, because some callbacks may not # really need all the params they get AM_CFLAGS= \ + $(ASAN_CFLAGS) \ $(WARN_CFLAGS) \ -Wno-switch-enum \ -DMU_SCRIPTS_DIR="\"$(pkgdatadir)/scripts/\"" AM_CXXFLAGS= \ + $(ASAN_CXXCFLAGS) \ $(WARN_CXXFLAGS) +AM_LDFLAGS= \ + $(ASAN_LDFLAGS) + bin_PROGRAMS= \ mu diff --git a/mu/tests/Makefile.am b/mu/tests/Makefile.am index 565f4703..d95b2bcc 100644 --- a/mu/tests/Makefile.am +++ b/mu/tests/Makefile.am @@ -33,8 +33,16 @@ AM_CPPFLAGS=$(XAPIAN_CXXFLAGS) \ # don't use -Werror, as it might break on other compilers # use -Wno-unused-parameters, because some callbacks may not # really need all the params they get -AM_CFLAGS=${WARN_CFLAGS} -AM_CXXFLAGS=${WARN_CXXFLAGS} +AM_CFLAGS= \ + $(ASAN_CFLAGS) \ + ${WARN_CFLAGS} +AM_CXXFLAGS= \ + $(ASAN_CFLAGS) \ + ${WARN_CFLAGS} +${WARN_CXXFLAGS} + +AM_LDFLAGS= \ + $(ASAN_LDFLAGS) noinst_PROGRAMS= $(TEST_PROGS)