Merge branch 'jk/build-with-asan'
authorJunio C Hamano <gitster@pobox.com>
Thu, 13 Jul 2017 23:14:54 +0000 (16:14 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 13 Jul 2017 23:14:54 +0000 (16:14 -0700)
The build procedure has been improved to allow building and testing
Git with address sanitizer more easily.

* jk/build-with-asan:
Makefile: disable unaligned loads with UBSan
Makefile: turn off -fomit-frame-pointer with sanitizers
Makefile: add helper for compiling with -fsanitize
test-lib: turn on ASan abort_on_error by default
test-lib: set ASAN_OPTIONS variable before we run git

1  2 
Makefile
t/test-lib.sh
diff --combined Makefile
index bfa5b3a4ca7885787241eb99dffcf2216e05cdaf,852dedc25c57b61e5f3747d1c1efb533329fb543..ba4359ef8dceb294fba6da3037c976d8b9d2cbad
+++ b/Makefile
@@@ -19,34 -19,16 +19,34 @@@ all:
  # have been written to the final string if enough space had been available.
  #
  # Define FREAD_READS_DIRECTORIES if you are on a system which succeeds
 -# when attempting to read from an fopen'ed directory.
 +# when attempting to read from an fopen'ed directory (or even to fopen
 +# it at all).
  #
  # Define NO_OPENSSL environment variable if you do not have OpenSSL.
  # This also implies BLK_SHA1.
  #
 -# Define USE_LIBPCRE if you have and want to use libpcre. git-grep will be
 -# able to use Perl-compatible regular expressions.
 -#
 -# Define LIBPCREDIR=/foo/bar if your libpcre header and library files are in
 -# /foo/bar/include and /foo/bar/lib directories.
 +# Define USE_LIBPCRE if you have and want to use libpcre. Various
 +# commands such as log and grep offer runtime options to use
 +# Perl-compatible regular expressions instead of standard or extended
 +# POSIX regular expressions.
 +#
 +# Currently USE_LIBPCRE is a synonym for USE_LIBPCRE1, define
 +# USE_LIBPCRE2 instead if you'd like to use version 2 of the PCRE
 +# library. The USE_LIBPCRE flag will likely be changed to mean v2 by
 +# default in future releases.
 +#
 +# When using USE_LIBPCRE1, define NO_LIBPCRE1_JIT if the PCRE v1
 +# library is compiled without --enable-jit. We will auto-detect
 +# whether the version of the PCRE v1 library in use has JIT support at
 +# all, but we unfortunately can't auto-detect whether JIT support
 +# hasn't been compiled in in an otherwise JIT-supporting version. If
 +# you have link-time errors about a missing `pcre_jit_exec` define
 +# this, or recompile PCRE v1 with --enable-jit.
 +#
 +# Define LIBPCREDIR=/foo/bar if your PCRE header and library files are
 +# in /foo/bar/include and /foo/bar/lib directories. Which version of
 +# PCRE this points to determined by the USE_LIBPCRE1 and USE_LIBPCRE2
 +# variables.
  #
  # Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
  #
  # algorithm. This is slower, but may detect attempted collision attacks.
  # Takes priority over other *_SHA1 knobs.
  #
 +# Define DC_SHA1_SUBMODULE in addition to DC_SHA1 to use the
 +# sha1collisiondetection shipped as a submodule instead of the
 +# non-submodule copy in sha1dc/. This is an experimental option used
 +# by the git project to migrate to using sha1collisiondetection as a
 +# submodule.
 +#
  # Define OPENSSL_SHA1 environment variable when running make to link
  # with the SHA1 routine from openssl library.
  #
@@@ -742,7 -718,6 +742,7 @@@ LIB_OBJS += argv-array.
  LIB_OBJS += attr.o
  LIB_OBJS += base85.o
  LIB_OBJS += bisect.o
 +LIB_OBJS += blame.o
  LIB_OBJS += blob.o
  LIB_OBJS += branch.o
  LIB_OBJS += bulk-checkin.o
@@@ -846,7 -821,6 +846,7 @@@ LIB_OBJS += refs/ref-cache.
  LIB_OBJS += ref-filter.o
  LIB_OBJS += remote.o
  LIB_OBJS += replace_object.o
 +LIB_OBJS += repository.o
  LIB_OBJS += rerere.o
  LIB_OBJS += resolve-undo.o
  LIB_OBJS += revision.o
@@@ -868,7 -842,6 +868,7 @@@ LIB_OBJS += streaming.
  LIB_OBJS += string-list.o
  LIB_OBJS += submodule.o
  LIB_OBJS += submodule-config.o
 +LIB_OBJS += sub-process.o
  LIB_OBJS += symlinks.o
  LIB_OBJS += tag.o
  LIB_OBJS += tempfile.o
@@@ -1010,10 -983,6 +1010,10 @@@ EXTLIBS 
  
  GIT_USER_AGENT = git/$(GIT_VERSION)
  
 +ifeq ($(wildcard sha1collisiondetection/lib/sha1.h),sha1collisiondetection/lib/sha1.h)
 +DC_SHA1_SUBMODULE = auto
 +endif
 +
  include config.mak.uname
  -include config.mak.autogen
  -include config.mak
@@@ -1022,6 -991,14 +1022,14 @@@ ifdef DEVELOPE
  CFLAGS += $(DEVELOPER_CFLAGS)
  endif
  
+ ifdef SANITIZE
+ BASIC_CFLAGS += -fsanitize=$(SANITIZE) -fno-sanitize-recover=$(SANITIZE)
+ BASIC_CFLAGS += -fno-omit-frame-pointer
+ ifeq ($(SANITIZE),undefined)
+ BASIC_CFLAGS += -DNO_UNALIGNED_LOADS
+ endif
+ endif
  ifndef sysconfdir
  ifeq ($(prefix),/usr)
  sysconfdir = /etc
@@@ -1116,29 -1093,13 +1124,29 @@@ ifdef NO_LIBGEN_
        COMPAT_OBJS += compat/basename.o
  endif
  
 -ifdef USE_LIBPCRE
 -      BASIC_CFLAGS += -DUSE_LIBPCRE
 -      ifdef LIBPCREDIR
 -              BASIC_CFLAGS += -I$(LIBPCREDIR)/include
 -              EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
 +USE_LIBPCRE1 ?= $(USE_LIBPCRE)
 +
 +ifneq (,$(USE_LIBPCRE1))
 +      ifdef USE_LIBPCRE2
 +$(error Only set USE_LIBPCRE1 (or its alias USE_LIBPCRE) or USE_LIBPCRE2, not both!)
        endif
 +
 +      BASIC_CFLAGS += -DUSE_LIBPCRE1
        EXTLIBS += -lpcre
 +
 +ifdef NO_LIBPCRE1_JIT
 +      BASIC_CFLAGS += -DNO_LIBPCRE1_JIT
 +endif
 +endif
 +
 +ifdef USE_LIBPCRE2
 +      BASIC_CFLAGS += -DUSE_LIBPCRE2
 +      EXTLIBS += -lpcre2-8
 +endif
 +
 +ifdef LIBPCREDIR
 +      BASIC_CFLAGS += -I$(LIBPCREDIR)/include
 +      EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
  endif
  
  ifdef HAVE_ALLOCA_H
@@@ -1459,14 -1420,8 +1467,14 @@@ ifdef APPLE_COMMON_CRYPT
        BASIC_CFLAGS += -DSHA1_APPLE
  else
        DC_SHA1 := YesPlease
 +ifdef DC_SHA1_SUBMODULE
 +      LIB_OBJS += sha1collisiondetection/lib/sha1.o
 +      LIB_OBJS += sha1collisiondetection/lib/ubc_check.o
 +      BASIC_CFLAGS += -DDC_SHA1_SUBMODULE
 +else
        LIB_OBJS += sha1dc/sha1.o
        LIB_OBJS += sha1dc/ubc_check.o
 +endif
        BASIC_CFLAGS += \
                -DSHA1_DC \
                -DSHA1DC_NO_STANDARD_INCLUDES \
@@@ -2298,11 -2253,8 +2306,11 @@@ GIT-BUILD-OPTIONS: FORC
        @echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@+
        @echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@+
        @echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
 -      @echo USE_LIBPCRE=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE)))'\' >>$@+
 +      @echo USE_LIBPCRE1=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE1)))'\' >>$@+
 +      @echo USE_LIBPCRE2=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE2)))'\' >>$@+
 +      @echo NO_LIBPCRE1_JIT=\''$(subst ','\'',$(subst ','\'',$(NO_LIBPCRE1_JIT)))'\' >>$@+
        @echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
 +      @echo NO_PTHREADS=\''$(subst ','\'',$(subst ','\'',$(NO_PTHREADS)))'\' >>$@+
        @echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
        @echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
        @echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
@@@ -2333,9 -2285,6 +2341,9 @@@ endi
  ifdef GIT_PERF_MAKE_OPTS
        @echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
  endif
 +ifdef GIT_PERF_MAKE_COMMAND
 +      @echo GIT_PERF_MAKE_COMMAND=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_COMMAND)))'\' >>$@+
 +endif
  ifdef GIT_INTEROP_MAKE_OPTS
        @echo GIT_INTEROP_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_INTEROP_MAKE_OPTS)))'\' >>$@+
  endif
diff --combined t/test-lib.sh
index 2306574dc9bacbfbb69469d95563b429a4cbb893,fc3bc1989c8f0687af40b84690cac0ac498f5c3f..1b6e53f78aef40673354e5f1911d78808ae8ef4d
@@@ -36,6 -36,14 +36,14 @@@ the
  fi
  GIT_BUILD_DIR="$TEST_DIRECTORY"/..
  
+ # If we were built with ASAN, it may complain about leaks
+ # of program-lifetime variables. Disable it by default to lower
+ # the noise level. This needs to happen at the start of the script,
+ # before we even do our "did we build git yet" check (since we don't
+ # want that one to complain to stderr).
+ : ${ASAN_OPTIONS=detect_leaks=0:abort_on_error=1}
+ export ASAN_OPTIONS
  ################################################################
  # It appears that people try to run tests without building...
  "$GIT_BUILD_DIR/git" >/dev/null
@@@ -148,9 -156,6 +156,6 @@@ els
        }
  fi
  
- : ${ASAN_OPTIONS=detect_leaks=0}
- export ASAN_OPTIONS
  # Protect ourselves from common misconfiguration to export
  # CDPATH into the environment
  unset CDPATH
@@@ -766,15 -771,10 +771,15 @@@ test_done () 
                        esac
                fi
  
 -              test -d "$remove_trash" &&
 -              cd "$(dirname "$remove_trash")" &&
 -              rm -rf "$(basename "$remove_trash")"
 +              if test -z "$debug"
 +              then
 +                      test -d "$TRASH_DIRECTORY" ||
 +                      error "Tests passed but trash directory already removed before test cleanup; aborting"
  
 +                      cd "$TRASH_DIRECTORY/.." &&
 +                      rm -fr "$TRASH_DIRECTORY" ||
 +                      error "Tests passed but test cleanup failed; aborting"
 +              fi
                test_at_end_hook_
  
                exit 0 ;;
@@@ -929,6 -929,7 +934,6 @@@ case "$TRASH_DIRECTORY" i
  /*) ;; # absolute path is good
   *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;;
  esac
 -test ! -z "$debug" || remove_trash=$TRASH_DIRECTORY
  rm -fr "$TRASH_DIRECTORY" || {
        GIT_EXIT_OK=t
        echo >&5 "FATAL: Cannot prepare test area"
@@@ -1018,9 -1019,8 +1023,9 @@@ esa
  
  ( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_1
  test -z "$NO_PERL" && test_set_prereq PERL
 +test -z "$NO_PTHREADS" && test_set_prereq PTHREADS
  test -z "$NO_PYTHON" && test_set_prereq PYTHON
 -test -n "$USE_LIBPCRE" && test_set_prereq LIBPCRE
 +test -n "$USE_LIBPCRE1$USE_LIBPCRE2" && test_set_prereq PCRE
  test -z "$NO_GETTEXT" && test_set_prereq GETTEXT
  
  # Can we rely on git's output in the C locale?
@@@ -1174,6 -1174,3 +1179,6 @@@ build_option () 
  test_lazy_prereq LONG_IS_64BIT '
        test 8 -le "$(build_option sizeof-long)"
  '
 +
 +test_lazy_prereq TIME_IS_64BIT 'test-date is64bit'
 +test_lazy_prereq TIME_T_IS_64BIT 'test-date time_t-is64bit'