summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2021-12-05 02:22:26 +0100
committerMark Wielaard <[email protected]>2021-12-09 00:29:48 +0100
commit5ba884a576afb0ec22660678790621b2a1c4a8e1 (patch)
tree6d4782418b13256c4b7337bf802f46340a9cada7
parentb947f95c2ce7520bf439386209c95454f1add69e (diff)
configure: Add --enable-sanitize-address
--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 <[email protected]>
-rw-r--r--ChangeLog4
-rw-r--r--configure.ac25
-rw-r--r--libcpu/ChangeLog5
-rw-r--r--libcpu/Makefile.am10
-rw-r--r--tests/ChangeLog6
-rw-r--r--tests/Makefile.am10
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 <[email protected]>
+
+ * configure.ac: Add --enable-sanitize-address.
+
2021-11-10 Mark Wielaard <[email protected]>
* 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 <[email protected]>
+
+ * Makefile.am (GENDIS_ENV): New variable, depends on
+ USE_ADDRESS_SANITIZER.
+
2020-12-20 Dmitry V. Levin <[email protected]>
* .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,5 +1,11 @@
2021-12-04 Mark Wielaard <[email protected]>
+ * Makefile.am (EXTRA_NLIST_CFLAGS): New variable depends on
+ USE_ADDRESS_SANITIZER.
+ (test_nlist_CFLAGS): Add EXTRA_NLIST_CFLAGS.
+
+2021-12-04 Mark Wielaard <[email protected]>
+
* varlocs.c (dwarf_encoding_string): Return "<unknown encoding>" instead
of NULL.
(dwarf_tag_string): Return "<unknown tag>" instead of NULL.
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)