]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
enable thread sanitizer if the builder wants it
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 8 Mar 2018 20:15:43 +0000 (12:15 -0800)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 8 Aug 2018 15:16:15 +0000 (11:16 -0400)
Enable the gcc/clang thread data corruption sanitizer if the builder
requests it and it's available.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
MCONFIG.in
configure
configure.ac
debian/rules

index 1344511e687a220b5901645342510bade67e9271..c3b3740e5532191b9b8d3496431313ec4bbc9b00 100644 (file)
@@ -81,8 +81,8 @@ SYSTEMD_SYSTEM_UNIT_DIR = @systemd_system_unit_dir@
 @ifNotGNUmake@ CHECK_CMD=true
 @ifNotGNUmake@ CPPCHECK_CMD=true
 
-SANITIZER_CFLAGS = @lto_cflags@ @ubsan_cflags@ @addrsan_cflags@
-SANITIZER_LDFLAGS = @lto_ldflags@ @ubsan_ldflags@ @addrsan_ldflags@
+SANITIZER_CFLAGS = @lto_cflags@ @ubsan_cflags@ @addrsan_cflags@ @threadsan_cflags@
+SANITIZER_LDFLAGS = @lto_ldflags@ @ubsan_ldflags@ @addrsan_ldflags@ @threadsan_ldflags@
 
 CC = @CC@
 BUILD_CC = @BUILD_CC@
index e1599f33163da10bd22a0f3e8f085b4318c56781..1493e152779752075f49dcbeffae82603b370e19 100755 (executable)
--- a/configure
+++ b/configure
@@ -653,6 +653,9 @@ E2SCRUB_CMT
 UNIX_CMT
 CYGWIN_CMT
 LINUX_CMT
+threadsan_ldflags
+threadsan_cflags
+have_threadsan
 addrsan_ldflags
 addrsan_cflags
 have_addrsan
@@ -917,6 +920,7 @@ enable_fuse2fs
 enable_lto
 enable_ubsan
 enable_addrsan
+enable_threadsan
 with_multiarch
 with_udev_rules_dir
 with_crond_dir
@@ -1598,6 +1602,7 @@ Optional Features:
   --enable-lto           enable link time optimization
   --enable-ubsan         enable undefined behavior sanitizer
   --enable-addrsan       enable address sanitizer
+  --enable-threadsan     enable thread sanitizer
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
 if test "$enable_addrsan" = "yes" && test "$have_addrsan" != "yes"; then
        as_fn_error $? "ADDRSAN not supported by compiler." "$LINENO" 5
 fi
+# Check whether --enable-threadsan was given.
+if test "${enable_threadsan+set}" = set; then :
+  enableval=$enable_threadsan;
+else
+  enable_threadsan=no
+fi
+
+if test "$enable_threadsan" = "yes" || test "$enable_threadsan" = "probe"; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking if C compiler supports THREADSAN" >&5
+$as_echo_n "checking if C compiler supports THREADSAN... " >&6; }
+       OLD_CFLAGS="$CFLAGS"
+       OLD_LDFLAGS="$LDFLAGS"
+       THREADSAN_FLAGS="-fsanitize=thread"
+       CFLAGS="$CFLAGS $THREADSAN_FLAGS"
+       LDFLAGS="$LDFLAGS $THREADSAN_FLAGS"
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+               threadsan_cflags=$THREADSAN_FLAGS
+               threadsan_ldflags=$THREADSAN_FLAGS
+               have_threadsan=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+       CFLAGS="${OLD_CFLAGS}"
+       LDFLAGS="${OLD_LDFLAGS}"
+
+
+
+fi
+if test "$enable_threadsan" = "yes" && test "$have_threadsan" != "yes"; then
+       as_fn_error $? "THREADSAN not supported by compiler." "$LINENO" 5
+fi
+if test "$have_threadsan" = "yes" && test "$have_addrsan" = "yes"; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ADDRSAN and THREADSAN are not known to work together." >&5
+$as_echo "$as_me: WARNING: ADDRSAN and THREADSAN are not known to work together." >&2;}
+fi
 LINUX_CMT="#"
 CYGWIN_CMT="#"
 UNIX_CMT=
index 62581f6b0138e9ea3ceefa71b123d4f513f8b6e6..fe717d0901403ac1efbebaf77da3bca63e4decf0 100644 (file)
@@ -1386,6 +1386,37 @@ if test "$enable_addrsan" = "yes" && test "$have_addrsan" != "yes"; then
        AC_MSG_ERROR([ADDRSAN not supported by compiler.])
 fi
 dnl
+dnl Enable THREADSAN for all packages
+dnl
+AC_ARG_ENABLE([threadsan],
+[  --enable-threadsan    enable thread sanitizer],,
+enable_threadsan=no)
+if test "$enable_threadsan" = "yes" || test "$enable_threadsan" = "probe"; then
+       AC_MSG_CHECKING([if C compiler supports THREADSAN])
+       OLD_CFLAGS="$CFLAGS"
+       OLD_LDFLAGS="$LDFLAGS"
+       THREADSAN_FLAGS="-fsanitize=thread"
+       CFLAGS="$CFLAGS $THREADSAN_FLAGS"
+       LDFLAGS="$LDFLAGS $THREADSAN_FLAGS"
+       AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
+               [AC_MSG_RESULT([yes])]
+               [threadsan_cflags=$THREADSAN_FLAGS]
+               [threadsan_ldflags=$THREADSAN_FLAGS]
+               [have_threadsan=yes],
+               [AC_MSG_RESULT([no])])
+       CFLAGS="${OLD_CFLAGS}"
+       LDFLAGS="${OLD_LDFLAGS}"
+       AC_SUBST(have_threadsan)
+       AC_SUBST(threadsan_cflags)
+       AC_SUBST(threadsan_ldflags)
+fi
+if test "$enable_threadsan" = "yes" && test "$have_threadsan" != "yes"; then
+       AC_MSG_ERROR([THREADSAN not supported by compiler.])
+fi
+if test "$have_threadsan" = "yes" && test "$have_addrsan" = "yes"; then
+       AC_MSG_WARN([ADDRSAN and THREADSAN are not known to work together.])
+fi
+dnl
 dnl OS-specific uncomment control
 dnl
 LINUX_CMT="#"
index 7491f39251e36fda8eb582491620cd27ded3a315..9167a40fc4f132051fd2007cfaba988405594be4 100755 (executable)
@@ -165,7 +165,7 @@ endif
 BACKTRACE_CONF_FLAGS ?= $(shell if ${debdir}/scripts/test-backtrace ; then echo --disable-backtrace ; fi)
 
 COMMON_CONF_FLAGS = --enable-lto --disable-ubsan --disable-addrsan \
-       --disable-e2initrd-helper \
+       --disable-threadsan --disable-e2initrd-helper \
        --infodir=/usr/share/info  --enable-symlink-install \
        --with-multiarch=$(DEB_HOST_MULTIARCH) \
        $(BACKTRACE_CONF_FLAGS) $(UTIL_CONF_FLAGS)