diff --git a/.bazelrc b/.bazelrc index bdb2bfc..54cfe97 100644 --- a/.bazelrc +++ b/.bazelrc @@ -13,3 +13,5 @@ build --features=per_object_debug_info # Enable header processing, required for layering checks with parse_header. build --process_headers_in_dependencies + +import %workspace%/tools/bazel.rc diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel new file mode 100644 index 0000000..65eee96 --- /dev/null +++ b/tools/BUILD.bazel @@ -0,0 +1,5 @@ +sh_binary( + name = "asan", + srcs = ["asan.sh"], + data = ["asan.supp"], +) diff --git a/tools/asan.sh b/tools/asan.sh new file mode 100755 index 0000000..130b669 --- /dev/null +++ b/tools/asan.sh @@ -0,0 +1,10 @@ +#!/bin/bash +me=$(python3 -c 'import os; print(os.path.realpath("'"$0"'"))') +mydir=$(dirname "$me") +export ASAN_OPTIONS="$ASAN_OPTIONS:check_initialization_order=1:detect_container_overflow=0:detect_invalid_pointer_pairs=1:detect_stack_use_after_return=1:strict_init_order=1:strict_string_checks=1:strip_path_prefix=/proc/self/cwd/:suppressions=$mydir/asan.supp" +# LSan is run with ASan by default, ASAN_OPTIONS can't be used to suppress LSan +# errors +export LSAN_OPTIONS="$LSAN_OPTIONS:strip_path_prefix=/proc/self/cwd/:suppressions=$mydir/lsan.supp" +# Ensure executable named llvm-symbolizer is on the PATH. +export PATH="$PATH:/usr/lib/llvm-14/bin:/usr/lib/llvm-12/bin:/usr/local/opt/llvm/bin" +"$@" diff --git a/tools/asan.supp b/tools/asan.supp new file mode 100644 index 0000000..e69de29 diff --git a/tools/bazel.rc b/tools/bazel.rc new file mode 100644 index 0000000..f4eaee2 --- /dev/null +++ b/tools/bazel.rc @@ -0,0 +1,36 @@ +common:clang --repo_env=CC=clang-15 +common:clang --repo_env=CXX=clang++-15 +build:clang --action_env=CC=clang-15 +build:clang --action_env=CXX=clang++-15 +build:clang --host_action_env=CC=clang-15 +build:clang --host_action_env=CXX=clang++-15 + +### ASan build. Clang only. ### +build:asan --build_tests_only +build:asan --copt=-g +# https://github.com/google/sanitizers/wiki/AddressSanitizer#faq +build:asan --copt=-fno-common +build:asan --copt=-fsanitize=address +build:asan --copt=-fsanitize-address-use-after-scope +build:asan --copt=-fstandalone-debug +build:asan --copt=-O0 +build:asan --copt=-fno-omit-frame-pointer +build:asan --linkopt=-fsanitize=address +build:asan --linkopt=-fsanitize-address-use-after-scope +build:asan --run_under=//tools:asan +build:asan --test_env=ASAN_OPTIONS +build:asan --test_env=LSAN_OPTIONS +build:asan --test_env=ASAN_SYMBOLIZER_PATH +build:asan --test_env=LSAN_SYMBOLIZER_PATH +# LSan is run with ASan by default +build:asan --test_tag_filters=-gurobi,-mosek,-snopt,-no_asan,-no_lsan +build:asan --test_lang_filters=-sh,-py +# Typical slowdown introduced by AddressSanitizer is 2x. +# See https://clang.llvm.org/docs/AddressSanitizer.html +build:asan --test_timeout=150,750,2250,9000 # 2.5x +build:asan --define=USING_SANITIZER=ON +# Due to https://sourceware.org/bugzilla/show_bug.cgi?id=25975, we see ... +# ld.gold: warning: Cannot export local symbol __asan_extra_spill_area +# ... spammed millions of times in ASan builds. The only way to silence that +# warning is to silence ALL WARNINGS AT ALL EVER in ASan builds. +build:asan --auto_output_filter=all