Re: [PATCH] tests: make SANITIZE=address imply TEST_NO_MALLOC_CHECK
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Apr 11, 2022, 21:50 UTC
- Message-ID
- <220411.86bkx7i8qi.gmgdl@evledraar.gmail.com>
- In-Reply-To
- <pull.1210.git.1649507317350.gitgitgadget@gmail.com>
On Sat, Apr 09 2022, Phillip Wood via GitGitGadget wrote:
Show 28 quoted lines
> From: Phillip Wood <phillip.wood@dunelm.org.uk>
>
> As the address sanitizer checks for a superset of the issues detected
> by setting MALLOC_CHECK_ (which tries to detect things like double
> frees and off-by-one errors) there is no need to set the latter when
> compiling with -fsanitize=address.
>
> This fixes a regression introduced by 131b94a10a ("test-lib.sh: Use
> GLIBC_TUNABLES instead of MALLOC_CHECK_ on glibc >= 2.34", 2022-03-04)
> which causes all the tests to fail with the message
>
> ASan runtime does not come first in initial library list;
> you should either link runtime to your application or
> manually preload it with LD_PRELOAD.
>
> when git is compiled with SANITIZE=address on systems with glibc >=
> 2.34. I have tested SANITIZE=leak and SANITIZE=undefined and they do
> not suffer from this regression so the fix in this patch should be
> sufficient.
>
> Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
> ---
> tests: make SANITIZE=address imply TEST_NO_MALLOC_CHECK
>
> I'm submitting this now as it fixes a regression introduced in the
> current cycle. Having said that there is an easy workaround (once one
> has discovered GIT_TEST_NO_MALLOC_CHECK) so I'd be happy to wait until
> the start of the next cycle given I've just missed -rc1.I wonder why we have to justify that we'll only turn on TEST_NO_MALLOC_CHECK if it's SANITIZE=address.
I.e. we also have SANITIZE=undefined, wouldn't it be more future-proof to just say that these analysis options are mutually exclusive by default?
That would have the bonus of e.g. making SANITIZE=leak faster, it's already slow enough without the extra help of glibc's instrumentation.
Show 36 quoted lines
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1210%2Fphillipwood%2Fwip%2Ftest-malloc-asan-v1 > Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1210/phillipwood/wip/test-malloc-asan-v1 > Pull-Request: https://github.com/gitgitgadget/git/pull/1210 > > Makefile | 5 ++++- > t/test-lib.sh | 5 +++-- > 2 files changed, 7 insertions(+), 3 deletions(-) > > diff --git a/Makefile b/Makefile > index 91738485626..76d187991d2 100644 > --- a/Makefile > +++ b/Makefile > @@ -1267,8 +1267,9 @@ PTHREAD_CFLAGS = > SPARSE_FLAGS ?= -std=gnu99 > SP_EXTRA_FLAGS = -Wno-universal-initializer > > -# For informing GIT-BUILD-OPTIONS of the SANITIZE=leak target > +# For informing GIT-BUILD-OPTIONS of the SANITIZE=leak,address targets > SANITIZE_LEAK = > +SANITIZE_ADDRESS = > > # For the 'coccicheck' target; setting SPATCH_BATCH_SIZE higher will > # usually result in less CPU usage at the cost of higher peak memory. > @@ -1314,6 +1315,7 @@ SANITIZE_LEAK = YesCompiledWithIt > endif > ifneq ($(filter address,$(SANITIZERS)),) > NO_REGEX = NeededForASAN > +SANITIZE_ADDRESS = YesCompiledWithIt > endif > endif > > @@ -2861,6 +2863,7 @@ GIT-BUILD-OPTIONS: FORCE > @echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+ > @echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+ > @echo SANITIZE_LEAK=\''$(subst ','\'',$(subst ','\'',$(SANITIZE_LEAK)))'\' >>$@+ > + @echo SANITIZE_ADDRESS=\''$(subst ','\'',$(subst ','\'',$(SANITIZE_ADDRESS)))'\' >>$@+
Then this could just add SANITIZERS=$(SANITIZERS), we still need SANITIZE_LEAK as we care about that specifically, but This mostly sounds sensible, but for this:
Show 9 quoted lines
> -# Add libc MALLOC and MALLOC_PERTURB test
> -# only if we are not executing the test with valgrind
> +# Add libc MALLOC and MALLOC_PERTURB test only if we are not executing
> +# the test with valgrind and have not compiled with SANITIZE=address.
> if test -n "$valgrind" ||
> + test -n "$SANITIZE_ADDRESS" ||
> test -n "$TEST_NO_MALLOC_CHECK"
> then
> setup_malloc_check () {We could check $SANITIZERS here instead.