From 44617d90af527391f5ddfa47a2f3acf68d4719ce Mon Sep 17 00:00:00 2001 From: DHE Date: Sat, 18 Nov 2017 17:31:22 -0500 Subject: [PATCH] Support -fsanitize=address on ztest Requires minimum of gcc version 4.8. Only available to ztest right now, but easily added to other user applications. For kernel support use the Linux KASAN feature instead. Signed-off-by: DHE --- cmd/zdb/Makefile.am | 2 ++ cmd/ztest/Makefile.am | 1 + config/user-compiler-options.m4 | 62 ++++++++++++++++++++++++++++++++ config/user-frame-larger-than.m4 | 22 ------------ config/user.m4 | 1 + config/zfs-build.m4 | 2 +- lib/libavl/Makefile.am | 2 +- lib/libefi/Makefile.am | 2 +- lib/libicp/Makefile.am | 2 +- lib/libnvpair/Makefile.am | 1 + lib/libspl/Makefile.am | 2 +- lib/libtpool/Makefile.am | 2 +- lib/libunicode/Makefile.am | 2 +- lib/libuutil/Makefile.am | 2 +- lib/libzpool/Makefile.am | 2 +- 15 files changed, 76 insertions(+), 31 deletions(-) create mode 100644 config/user-compiler-options.m4 delete mode 100644 config/user-frame-larger-than.m4 diff --git a/cmd/zdb/Makefile.am b/cmd/zdb/Makefile.am index c1543e86ecdc..028568e1a98b 100644 --- a/cmd/zdb/Makefile.am +++ b/cmd/zdb/Makefile.am @@ -2,6 +2,8 @@ include $(top_srcdir)/config/Rules.am AM_CPPFLAGS += -DDEBUG +AM_CFLAGS += $(FSANITIZE_ADDRESS) + DEFAULT_INCLUDES += \ -I$(top_srcdir)/include \ -I$(top_srcdir)/lib/libspl/include diff --git a/cmd/ztest/Makefile.am b/cmd/ztest/Makefile.am index cbfb95fd3b33..9799f760a105 100644 --- a/cmd/ztest/Makefile.am +++ b/cmd/ztest/Makefile.am @@ -3,6 +3,7 @@ include $(top_srcdir)/config/Rules.am # -Wnoformat-truncation to get rid of compiler warning for unchecked # truncating snprintfs on gcc 7.1.1. AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(NO_FORMAT_TRUNCATION) +AM_CFLAGS += $(FSANITIZE_ADDRESS) AM_CPPFLAGS += -DDEBUG -UNDEBUG DEFAULT_INCLUDES += \ diff --git a/config/user-compiler-options.m4 b/config/user-compiler-options.m4 new file mode 100644 index 000000000000..43bd9181bdaf --- /dev/null +++ b/config/user-compiler-options.m4 @@ -0,0 +1,62 @@ +dnl # +dnl # Check if gcc supports -fsanitize=address. Applies to all libraries, +dnl # ztest and zdb +dnl # +dnl # LDFLAGS needs -fsanitize=address at all times so libraries compiled with +dnl # it will be linked successfully. CFLAGS will vary by binary being built. +dnl # +AC_DEFUN([ZFS_AC_CONFIG_USER_GCC_FSANITIZE], [ + if test "$enable_debug" = "yes" + then + AC_MSG_CHECKING([for -fsanitize=address support]) + + saved_cflags="$CFLAGS" + saved_ldflags="$LDFLAGS" + CFLAGS="$CFLAGS -fsanitize=address" + LDFLAGS="$LDFLAGS -fsanitize=address" + + AC_TRY_LINK( + [ + #include + ],[ + time_t now; + now = time(&now); + ],[ + FSANITIZE_ADDRESS=-fsanitize=address + saved_ldflags="$saved_ldflags -fsanitize=address" + AC_MSG_RESULT(yes) + ],[ + FSANITIZE_ADDRESS="" + AC_MSG_RESULT(no) + ]) + + CFLAGS="$saved_flags" + LDFLAGS="$saved_ldflags" + fi + AC_SUBST([FSANITIZE_ADDRESS]) +]) + + +dnl # +dnl # Check if gcc supports -Wframe-larger-than= option. +dnl # +AC_DEFUN([ZFS_AC_CONFIG_USER_FRAME_LARGER_THAN], [ + AC_MSG_CHECKING([for -Wframe-larger-than= support]) + + saved_flags="$CFLAGS" + CFLAGS="$CFLAGS -Wframe-larger-than=4096" + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], + [ + FRAME_LARGER_THAN=-Wframe-larger-than=4096 + AC_MSG_RESULT([yes]) + ], + [ + FRAME_LARGER_THAN= + AC_MSG_RESULT([no]) + ]) + + CFLAGS="$saved_flags" + AC_SUBST([FRAME_LARGER_THAN]) +]) + diff --git a/config/user-frame-larger-than.m4 b/config/user-frame-larger-than.m4 deleted file mode 100644 index e0828eca079c..000000000000 --- a/config/user-frame-larger-than.m4 +++ /dev/null @@ -1,22 +0,0 @@ -dnl # -dnl # Check if gcc supports -Wframe-larger-than= option. -dnl # -AC_DEFUN([ZFS_AC_CONFIG_USER_FRAME_LARGER_THAN], [ - AC_MSG_CHECKING([for -Wframe-larger-than= support]) - - saved_flags="$CFLAGS" - CFLAGS="$CFLAGS -Wframe-larger-than=1024" - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], - [ - FRAME_LARGER_THAN=-Wframe-larger-than=1024 - AC_MSG_RESULT([yes]) - ], - [ - FRAME_LARGER_THAN= - AC_MSG_RESULT([no]) - ]) - - CFLAGS="$saved_flags" - AC_SUBST([FRAME_LARGER_THAN]) -]) diff --git a/config/user.m4 b/config/user.m4 index 73f6433a2ea7..b88b8adfb3d0 100644 --- a/config/user.m4 +++ b/config/user.m4 @@ -15,6 +15,7 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [ ZFS_AC_CONFIG_USER_LIBUDEV ZFS_AC_CONFIG_USER_LIBSSL ZFS_AC_CONFIG_USER_FRAME_LARGER_THAN + ZFS_AC_CONFIG_USER_GCC_FSANITIZE ZFS_AC_CONFIG_USER_RUNSTATEDIR ZFS_AC_CONFIG_USER_MAKEDEV_IN_SYSMACROS ZFS_AC_CONFIG_USER_MAKEDEV_IN_MKDEV diff --git a/config/zfs-build.m4 b/config/zfs-build.m4 index 17cc80462c76..cd452e715031 100644 --- a/config/zfs-build.m4 +++ b/config/zfs-build.m4 @@ -27,7 +27,7 @@ AC_DEFUN([ZFS_AC_DEBUG], [ AC_MSG_CHECKING([whether assertion support will be enabled]) AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], - [Enable assertion support @<:@default=no@:>@])], + [Enable compiler and code assertions @<:@default=no@:>@])], [], [enable_debug=no]) diff --git a/lib/libavl/Makefile.am b/lib/libavl/Makefile.am index 6a42649b882b..a8be13130c7c 100644 --- a/lib/libavl/Makefile.am +++ b/lib/libavl/Makefile.am @@ -2,7 +2,7 @@ include $(top_srcdir)/config/Rules.am VPATH = $(top_srcdir)/module/avl/ -AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) +AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(FSANITIZE_ADDRESS) DEFAULT_INCLUDES += \ -I$(top_srcdir)/include \ diff --git a/lib/libefi/Makefile.am b/lib/libefi/Makefile.am index f0c05ee6c44c..3b32293b91b5 100644 --- a/lib/libefi/Makefile.am +++ b/lib/libefi/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/config/Rules.am -AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) +AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(FSANITIZE_ADDRESS) DEFAULT_INCLUDES += \ -I$(top_srcdir)/include \ diff --git a/lib/libicp/Makefile.am b/lib/libicp/Makefile.am index e1f08c8dd8e5..f5c3fb2eba35 100644 --- a/lib/libicp/Makefile.am +++ b/lib/libicp/Makefile.am @@ -4,7 +4,7 @@ VPATH = \ $(top_srcdir)/module/icp \ $(top_srcdir)/lib/libicp -AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) +AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(FSANITIZE_ADDRESS) DEFAULT_INCLUDES += \ -I$(top_srcdir)/include \ diff --git a/lib/libnvpair/Makefile.am b/lib/libnvpair/Makefile.am index 6da679fd50fc..83239f257e59 100644 --- a/lib/libnvpair/Makefile.am +++ b/lib/libnvpair/Makefile.am @@ -5,6 +5,7 @@ VPATH = \ $(top_srcdir)/lib/libnvpair AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(LIBTIRPC_CFLAGS) +AM_CFLAGS += $(FSANITIZE_ADDRESS) DEFAULT_INCLUDES += \ -I$(top_srcdir)/include \ diff --git a/lib/libspl/Makefile.am b/lib/libspl/Makefile.am index 395723af395e..552f0b770ed9 100644 --- a/lib/libspl/Makefile.am +++ b/lib/libspl/Makefile.am @@ -4,7 +4,7 @@ VPATH = \ $(top_srcdir)/lib/libspl \ $(top_srcdir)/lib/libspl/$(TARGET_ASM_DIR) -AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) +AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(FSANITIZE_ADDRESS) SUBDIRS = include $(TARGET_ASM_DIR) DIST_SUBDIRS = include asm-generic asm-i386 asm-x86_64 diff --git a/lib/libtpool/Makefile.am b/lib/libtpool/Makefile.am index adbaee6c3dca..66bc5cac974d 100644 --- a/lib/libtpool/Makefile.am +++ b/lib/libtpool/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/config/Rules.am -AM_CFLAGS += $(DEBUG_STACKFLAGS) +AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FSANITIZE_ADDRESS) DEFAULT_INCLUDES += \ -I$(top_srcdir)/include \ diff --git a/lib/libunicode/Makefile.am b/lib/libunicode/Makefile.am index 9bacae25140a..5a98621cf255 100644 --- a/lib/libunicode/Makefile.am +++ b/lib/libunicode/Makefile.am @@ -2,7 +2,7 @@ include $(top_srcdir)/config/Rules.am VPATH = $(top_srcdir)/module/unicode -AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) +AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(FSANITIZE_ADDRESS) DEFAULT_INCLUDES += \ -I$(top_srcdir)/include \ diff --git a/lib/libuutil/Makefile.am b/lib/libuutil/Makefile.am index ed4a30de72bc..408ace242c81 100644 --- a/lib/libuutil/Makefile.am +++ b/lib/libuutil/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/config/Rules.am -AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) +AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(FSANITIZE_ADDRESS) DEFAULT_INCLUDES += \ -I$(top_srcdir)/include \ diff --git a/lib/libzpool/Makefile.am b/lib/libzpool/Makefile.am index 95e2493421a6..7a681244ace0 100644 --- a/lib/libzpool/Makefile.am +++ b/lib/libzpool/Makefile.am @@ -5,7 +5,7 @@ VPATH = \ $(top_srcdir)/module/zcommon \ $(top_srcdir)/lib/libzpool -AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) +AM_CFLAGS += $(DEBUG_STACKFLAGS) $(FRAME_LARGER_THAN) $(FSANITIZE_ADDRESS) DEFAULT_INCLUDES += \ -I$(top_srcdir)/include \