public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] configure: Add --enable-sanitize-address
@ 2021-12-05  1:39 Mark Wielaard
  2021-12-08 23:50 ` Mark Wielaard
  0 siblings, 1 reply; 2+ messages in thread
From: Mark Wielaard @ 2021-12-05  1:39 UTC (permalink / raw)
  To: elfutils-devel; +Cc: Mark Wielaard

--enable-sanitize-address makes sure that all code is compiled with
-fsanitizer=address and all tests run against libasan.

It can be combined with --enable-sanitize-undefined, but not with
--enable-valgrind.

In maintainer mode there is one program that causes leaks, i386_gendis,
so disable leak detection for that program.

One testcase, test_nlist, needs special linker flags, make sure it also
uses -fsanitizer=address when using the address sanitizer.

Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 ChangeLog          |  4 ++++
 configure.ac       | 25 +++++++++++++++++++++++++
 libcpu/ChangeLog   |  5 +++++
 libcpu/Makefile.am | 10 +++++++++-
 tests/ChangeLog    |  6 ++++++
 tests/Makefile.am  | 10 ++++++++--
 6 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d61b21c7..f00db17b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2021-12-04  Mark Wielaard  <mark@klomp.org>
+
+	* configure.ac: Add --enable-sanitize-address.
+
 2021-11-10  Mark Wielaard  <mark@klomp.org>
 
 	* configure.ac (AC_INIT): Set version to 0.186.
diff --git a/configure.ac b/configure.ac
index ff9581d2..48071165 100644
--- a/configure.ac
+++ b/configure.ac
@@ -307,10 +307,34 @@ esac
 AC_DEFINE_UNQUOTED(CHECK_UNDEFINED, $check_undefined_val,
 		   [Building with -fsanitize=undefined or not])
 
+AC_ARG_ENABLE([sanitize-address],
+              AS_HELP_STRING([--enable-sanitize-address],
+                             [Use gcc address sanitizer]),
+                             [use_address=$enableval], [use_address=no])
+if test "$use_address" = yes; then
+  old_CFLAGS="$CFLAGS"
+  old_CXXFLAGS="$CXXFLAGS"
+  old_LDFLAGS="$LDFLAGS"
+  # We want to fail immediately on first error, don't try to recover.
+  CFLAGS="$CFLAGS -fsanitize=address -fno-sanitize-recover"
+  CXXFLAGS="$CXXFLAGS -fsanitize=address -fno-sanitize-recover"
+  # Some compilers don't handle -fsanatize=address correctly with --no-undefined
+  LDFLAGS="-Wl,-z,defs -shared"
+  AC_LINK_IFELSE([AC_LANG_SOURCE([int main (int argc, char **argv) { return 0; }])], use_address=yes, use_address=no)
+  AS_IF([test "x$use_address" != xyes],
+        AC_MSG_WARN([gcc address sanitizer not available])
+        CFLAGS="$old_CFLAGS" CXXFLAGS="$old_CXXFLAGS")
+  LDFLAGS="$old_LDFLAGS"
+fi
+AM_CONDITIONAL(USE_ADDRESS_SANITIZER, test "$use_address" = yes)
+
 AC_ARG_ENABLE([valgrind],
 AS_HELP_STRING([--enable-valgrind],[run all tests under valgrind]),
 [use_valgrind=$enableval], [use_valgrind=no])
 if test "$use_valgrind" = yes; then
+  if test "$use_address" = yes; then
+    AC_MSG_ERROR([cannot enable valgrind and sanitize address together])
+  fi
   AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
   if test "$HAVE_VALGRIND" = "no"; then
     AC_MSG_ERROR([valgrind not found])
@@ -809,6 +833,7 @@ AC_MSG_NOTICE([
     gcov support                       : ${use_gcov}
     run all tests under valgrind       : ${use_valgrind}
     gcc undefined behaviour sanitizer  : ${use_undefined}
+    gcc address sanitizer              : ${use_address}
     use rpath in tests                 : ${tests_use_rpath}
     test biarch                        : ${utrace_cv_cc_biarch}
 ])
diff --git a/libcpu/ChangeLog b/libcpu/ChangeLog
index 7cca9419..48fbba19 100644
--- a/libcpu/ChangeLog
+++ b/libcpu/ChangeLog
@@ -1,3 +1,8 @@
+2021-12-04  Mark Wielaard  <mark@klomp.org>
+
+	* Makefile.am (GENDIS_ENV): New variable, depends on
+	USE_ADDRESS_SANITIZER.
+
 2020-12-20  Dmitry V. Levin  <ldv@altlinux.org>
 
 	* .gitignore: New file.
diff --git a/libcpu/Makefile.am b/libcpu/Makefile.am
index 43844ecf..57d0a164 100644
--- a/libcpu/Makefile.am
+++ b/libcpu/Makefile.am
@@ -61,8 +61,16 @@ noinst_HEADERS += memory-access.h i386_parse.h i386_data.h
 
 noinst_PROGRAMS = i386_gendis$(EXEEXT)
 
+# i386_gendis doesn't clean up, ignore leaks.
+# It is just a build tool to generate source in maintainer mode.
+if USE_ADDRESS_SANITIZER
+GENDIS_ENV=env ASAN_OPTIONS=detect_leaks=0
+else
+GENDIS_ENV=
+endif
+
 $(srcdir)/%_dis.h: %_defs i386_gendis$(EXEEXT)
-	$(AM_V_GEN)./i386_gendis$(EXEEXT) $< > $@T
+	$(AM_V_GEN) $(GENDIS_ENV) ./i386_gendis$(EXEEXT) $< > $@T
 	$(AM_V_at)mv -f $@T $@
 
 else
diff --git a/tests/ChangeLog b/tests/ChangeLog
index a5673f18..76cb974a 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,9 @@
+2021-12-04  Mark Wielaard  <mark@klomp.org>
+
+	* Makefile.am (EXTRA_NLIST_CFLAGS): New variable depends on
+	USE_ADDRESS_SANITIZER.
+	(test_nlist_CFLAGS): Add EXTRA_NLIST_CFLAGS.
+
 2021-12-04  Mark Wielaard  <mark@klomp.org>
 
 	* varlocs.c (dwarf_encoding_string): Return "<unknown encoding>" instead
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2298a5ae..8acaeaf2 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -87,7 +87,13 @@ endif
 
 # test_nlist checks its own symbol table, and expects various symbols
 # to be in the order as specified in the source file. Explicitly set
-# minimal CFLAGS
+# minimal CFLAGS. But add address sanitizer if in use.
+if USE_ADDRESS_SANITIZER
+EXTRA_NLIST_CFLAGS=-fsanitize=address
+else
+EXTRA_NLIST_CFLAGS=
+endif
+
 test-nlist$(EXEEXT): test-nlist.c
 	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	  $(AM_CPPFLAGS) $(CPPFLAGS) \
@@ -635,7 +641,7 @@ scnnames_LDADD = $(libelf)
 sectiondump_LDADD = $(libelf)
 showptable_LDADD = $(libelf)
 hash_LDADD = $(libelf)
-test_nlist_CFLAGS =-g -O0
+test_nlist_CFLAGS =-g -O0 $(EXTRA_NLIST_CFLAGS)
 test_nlist_LDADD = $(libelf)
 msg_tst_LDADD = $(libelf)
 newscn_LDADD = $(libelf)
-- 
2.30.2


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] configure: Add --enable-sanitize-address
  2021-12-05  1:39 [PATCH] configure: Add --enable-sanitize-address Mark Wielaard
@ 2021-12-08 23:50 ` Mark Wielaard
  0 siblings, 0 replies; 2+ messages in thread
From: Mark Wielaard @ 2021-12-08 23:50 UTC (permalink / raw)
  To: elfutils-devel

Hi,

On Sun, Dec 05, 2021 at 02:39:25AM +0100, Mark Wielaard wrote:
> --enable-sanitize-address makes sure that all code is compiled with
> -fsanitizer=address and all tests run against libasan.
> 
> It can be combined with --enable-sanitize-undefined, but not with
> --enable-valgrind.
> 
> In maintainer mode there is one program that causes leaks, i386_gendis,
> so disable leak detection for that program.
> 
> One testcase, test_nlist, needs special linker flags, make sure it also
> uses -fsanitizer=address when using the address sanitizer.

I pushed this. I'll also add --enable-sanitize-address to some of the
buildbot CI workers.

Cheers,

Mark


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-12-08 23:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-05  1:39 [PATCH] configure: Add --enable-sanitize-address Mark Wielaard
2021-12-08 23:50 ` Mark Wielaard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).