blob: 8ee0c4fe5aa6d0f37c69f63cc894225413da74e1 [file] [log] [blame]
## Copyright (c) 2018 The WebM project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license
## that can be found in the LICENSE file in the root of the source
## tree. An additional intellectual property rights grant can be found
## in the file PATENTS. All contributing project authors may
## be found in the AUTHORS file in the root of the source tree.
##
## Sourcing this file sets environment variables to simplify setting up
## sanitizer builds and testing.
sanitizer="${1}"
case "${sanitizer}" in
address) ;;
cfi) ;;
integer) ;;
memory) ;;
thread) ;;
undefined) ;;
clear)
echo "Clearing environment:"
set -x
unset CC CXX LD AR
unset CFLAGS CXXFLAGS LDFLAGS
unset ASAN_OPTIONS MSAN_OPTIONS TSAN_OPTIONS UBSAN_OPTIONS
set +x
return
;;
*)
echo "Usage: source set_analyzer_env.sh [<sanitizer>|clear]"
echo " Supported sanitizers:"
echo " address cfi integer memory thread undefined"
return 1
;;
esac
if [ ! $(which clang) ]; then
# TODO(johannkoenig): Support gcc analyzers.
echo "ERROR: 'clang' must be in your PATH"
return 1
fi
# Warnings.
if [ "${sanitizer}" = "undefined" -o "${sanitizer}" = "integer" ]; then
echo "WARNING: When building the ${sanitizer} sanitizer for 32 bit targets"
echo "you must run:"
echo "export LDFLAGS=\"\${LDFLAGS} --rtlib=compiler-rt -lgcc_s\""
echo "See http://llvm.org/bugs/show_bug.cgi?id=17693 for details."
fi
if [ "${sanitizer}" = "undefined" ]; then
major_version=$(clang --version | head -n 1 \
| grep -o -E "[[:digit:]]\.[[:digit:]]\.[[:digit:]]" | cut -f1 -d.)
if [ ${major_version} -eq 5 ]; then
echo "WARNING: clang v5 has a problem with vp9 x86_64 high bit depth"
echo "configurations. It can take ~40 minutes to compile"
echo "vpx_dsp/x86/fwd_txfm_sse2.c"
echo "clang v4 did not have this issue."
fi
fi
echo "It is recommended to configure with '--enable-debug' to improve stack"
echo "traces. On mac builds, run 'dysmutil' on the output binaries (vpxenc,"
echo "test_libvpx, etc) to link the stack traces to source code lines."
# Build configuration.
cflags="-fsanitize=${sanitizer}"
ldflags="-fsanitize=${sanitizer}"
# http://code.google.com/p/webm/issues/detail?id=570
cflags="${cflags} -fno-strict-aliasing"
# Useful backtraces.
cflags="${cflags} -fno-omit-frame-pointer"
# Exact backtraces.
cflags="${cflags} -fno-optimize-sibling-calls"
if [ "${sanitizer}" = "cfi" ]; then
# https://clang.llvm.org/docs/ControlFlowIntegrity.html
cflags="${cflags} -fno-sanitize-trap=cfi -flto -fvisibility=hidden"
ldflags="${ldflags} -fno-sanitize-trap=cfi -flto -fuse-ld=gold"
export AR="llvm-ar"
fi
set -x
export CC="clang"
export CXX="clang++"
export LD="clang++"
export CFLAGS="${cflags}"
export CXXFLAGS="${cflags}"
export LDFLAGS="${ldflags}"
set +x
# Execution configuration.
sanitizer_options=""
sanitizer_options="${sanitizer_options}:handle_segv=1"
sanitizer_options="${sanitizer_options}:handle_abort=1"
sanitizer_options="${sanitizer_options}:handle_sigfpe=1"
sanitizer_options="${sanitizer_options}:fast_unwind_on_fatal=1"
sanitizer_options="${sanitizer_options}:allocator_may_return_null=1"
case "${sanitizer}" in
address)
sanitizer_options="${sanitizer_options}:detect_stack_use_after_return=1"
sanitizer_options="${sanitizer_options}:max_uar_stack_size_log=17"
set -x
export ASAN_OPTIONS="${sanitizer_options}"
set +x
;;
cfi)
# No environment settings
;;
memory)
set -x
export MSAN_OPTIONS="${sanitizer_options}"
set +x
;;
thread)
# The thread sanitizer uses an entirely independent set of options.
set -x
export TSAN_OPTIONS="halt_on_error=1"
set +x
;;
undefined|integer)
sanitizer_options="${sanitizer_options}:print_stacktrace=1"
set -x
export UBSAN_OPTIONS="${sanitizer_options}"
set +x
;;
esac