| ## 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 |