|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -e |
| 3 | + |
| 4 | +# Runs Gradle with address sanitizer enabled. Arguments are passed directly to Gradle. |
| 5 | +# If no arguments are specified runs the test task. |
| 6 | +# The ASAN detection is known to work with the buildenv-core image or Ubuntu 22.04 with a clang setup. |
| 7 | + |
| 8 | +if [ -z "$ASAN_LIB_SO" ]; then # If not supplied (e.g. by CI script), try to locate the lib: |
| 9 | + ASAN_ARCH=$(uname -m) # x86_64 or aarch64 |
| 10 | + echo "No ASAN_LIB_SO defined, trying to locate dynamically..." |
| 11 | + # Approach via https://stackoverflow.com/a/54386573/551269 |
| 12 | + ASAN_LIB_SO_GCC=$(gcc -print-file-name=libasan.so || true) |
| 13 | + ASAN_LIB_SO_CLANG=$(clang -print-file-name=libclang_rt.asan-${ASAN_ARCH}.so || true) |
| 14 | + # Find in the typical llvm directory (using `tail` for latest version; `head` would be oldest") |
| 15 | + ASAN_LIB_SO_CLANG_LATEST=$(find /usr/lib/llvm-*/ -name libclang_rt.asan-${ASAN_ARCH}.so | tail -1) |
| 16 | + echo " gcc asan lib: ${ASAN_LIB_SO_GCC}" |
| 17 | + echo " clang asan lib: ${ASAN_LIB_SO_CLANG}" |
| 18 | + echo "clang latest asan lib: ${ASAN_LIB_SO_CLANG_LATEST}" |
| 19 | + if [ -f "${ASAN_LIB_SO_CLANG_LATEST}" ]; then # prefer this so version matches with llvm-symbolizer below |
| 20 | + export ASAN_LIB_SO="${ASAN_LIB_SO_CLANG_LATEST}" |
| 21 | + elif [ -f "${ASAN_LIB_SO_CLANG}" ]; then |
| 22 | + export ASAN_LIB_SO="${ASAN_LIB_SO_CLANG}" |
| 23 | + elif [ -f "${ASAN_LIB_SO_GCC}" ]; then |
| 24 | + export ASAN_LIB_SO="${ASAN_LIB_SO_GCC}" |
| 25 | + else |
| 26 | + echo "No asan lib found; please specify via ASAN_LIB_SO" |
| 27 | + exit 1 |
| 28 | + fi |
| 29 | +fi |
| 30 | + |
| 31 | +if [ -z "$ASAN_SYMBOLIZER_PATH" ]; then |
| 32 | + ## TODO what to look for when using gcc's lib? |
| 33 | + export ASAN_SYMBOLIZER_PATH="$(find /usr/lib/llvm-*/ -name llvm-symbolizer | tail -1)" |
| 34 | +fi |
| 35 | + |
| 36 | +if [ -z "$ASAN_OPTIONS" ]; then |
| 37 | + export ASAN_OPTIONS="detect_leaks=0" |
| 38 | +fi |
| 39 | + |
| 40 | +echo "ASAN_LIB_SO: $ASAN_LIB_SO" |
| 41 | +echo "ASAN_SYMBOLIZER_PATH: $ASAN_SYMBOLIZER_PATH" |
| 42 | +echo "ASAN_OPTIONS: $ASAN_OPTIONS" |
| 43 | +ls -l $ASAN_LIB_SO |
| 44 | +ls -l $ASAN_SYMBOLIZER_PATH |
| 45 | + |
| 46 | +if [[ $# -eq 0 ]] ; then |
| 47 | + args=test |
| 48 | +else |
| 49 | + args=$@ |
| 50 | +fi |
| 51 | +echo "Starting Gradle for target(s) \"$args\"..." |
| 52 | +pwd |
| 53 | + |
| 54 | +LD_PRELOAD=${ASAN_LIB_SO} ./gradlew ${args} |
0 commit comments