Skip to contentSkip to conversation

t: support clang/gcc AddressSanitizer

PATCH New Jeff King 1 participant 1 message Jun 15, 2016

lore
Share & tools
lore

Jeff King

author
#0 lore raw

PATCH 1/1 t: support clang/gcc AddressSanitizer

When git is compiled with "-fsanitize=address" (using clang or gcc >= 4.8), all invocations of git will check for buffer overflows. This is similar to running with valgrind, except that it is more thorough (because of the compiler support, function-local buffers can be checked, too) and runs much faster (making it much less painful to run the whole test suite with the checks turned on).

Unlike valgrind, the magic happens at compile-time, so we don't need the same infrastructure in the test suite that we did to support --valgrind. But there are two things we can help with:

1. On some platforms, the leak-detector is on by default, and causes every invocation of "git init" (and thus every test script) to fail. Since running git with the leak detector is pointless, let's shut it off automatically in the tests, unless the user has already configured it.

2. When apache runs a CGI, it clears the environment of unknown variables. This means that the $ASAN_OPTIONS config doesn't make it to git-http-backend, and it dies due to the leak detector. Let's mark the variable as OK for apache to pass.

With these two changes, running

make CC=clang CFLAGS=-fsanitize=address test

works out of the box.

---
This is actually how I found the fsck bug I posted a few hours ago, but I followed up with "./t5032-* --valgrind-only=32" because valgrind seems to produce better output.

We could get fancier with $ASAN_OPTIONS, like appending "detect_leaks=0" if it is already set. But I figured that people who are setting $ASAN_OPTIONS already know what they are doing, and they can deal with configuring the leak detector themselves.

We could also provide a "make sanitize-test" target, but given how simple the make command above is, I don't see much point.

 t/lib-httpd/apache.conf | 1 +
 t/test-lib.sh           | 3 +++
 2 files changed, 4 insertions(+)
t/lib-httpd/apache.conf +1 -0
index 7713dd2..03a4c2e 100644
@@ -69,6 +69,7 @@ LockFile accept.lock
 PassEnv GIT_VALGRIND
 PassEnv GIT_VALGRIND_OPTIONS
 PassEnv GNUPGHOME
+PassEnv ASAN_OPTIONS
 
 Alias /dumb/ www/
 Alias /auth/dumb/ www/auth/dumb/
t/test-lib.sh +3 -0
index cf19339..3177298 100644
@@ -140,6 +140,9 @@ else
 	}
 fi
 
+: ${ASAN_OPTIONS=detect_leaks=0}
+export ASAN_OPTIONS
+
 # Protect ourselves from common misconfiguration to export
 # CDPATH into the environment
 unset CDPATH
Signature · 1 line
2.2.0.390.gf60752d