Skip to content
Snippets Groups Projects
sanitize.sh 1.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • hluk's avatar
    hluk committed
    #!/bin/bash
    set -e
    
    # file:///usr/share/doc/clang/html/UsersManual.html#controlling-code-generation
    sanitize=${sanitize:-memory}
    sanitize_other="bounds,bool,enum,null"
    compiler_flags=""
    
    build_dir=build-clang-$sanitize
    utils_dir=$(dirname $(readlink -f "$0"))
    src_dir=$utils_dir/..
    steps=(
        clean
        cmake
        make
        run
        )
    
    if [ -n "$CLANG_ROOT" ]; then
        export PATH=$CLANG_ROOT:$PATH
    fi
    CXX=${CXX:-clang++}
    
    if [ "$sanitize" == "address" ]; then
        sanitize_other="$sanitize_other,address-full,init-order"
    
        export ASAN_SYMBOLIZER_PATH=${ASAN_SYMBOLIZER_PATH:-$(which llvm-symbolizer)}
        export ASAN_OPTIONS=${ASAN_OPTIONS:-"detect_stack_use_after_return=1 print_stats=1"}
    elif [ "$sanitize" == "memory" ]; then
        compiler_flags="$compiler_flags -fsanitize-memory-track-origins"
    
        # from https://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/msan/msan.cc
        export MSAN_SYMBOLIZER_PATH=${MSAN_SYMBOLIZER_PATH:-$(which llvm-symbolizer)}
        export MSAN_OPTIONS=${MSAN_OPTIONS:-"keep_going=1 halt_on_error=0 report_umrs=0"}
    elif [ "$sanitize" == "thread" ]; then
        echo
    fi
    
    echo "=== Using $sanitize sanitizer (directory \"$build_dir\") ==="
    
    step=2
    if [ -d "$build_dir" ]; then
        echo "Select starting point:"
        select step in "${steps[@]}"; do step=$REPLY; break; done
    fi
    
    has_step () {
        [[ $step -le $1 ]]
    }
    
    has_step "${#steps[*]}"
    
    if has_step 1; then
        rm -r "$build_dir" || exit 1
    fi
    
    mkdir -p "$build_dir"
    cd "$build_dir"
    
    if has_step 2; then
        cmake \
            -DCMAKE_INSTALL_PREFIX="$PWD/install" \
            -DCMAKE_CXX_COMPILER="$CXX" \
            -DCMAKE_CXX_FLAGS="-fsanitize=$sanitize,$sanitize_other $compiler_flags -fno-omit-frame-pointer" \
            -DCMAKE_BUILD_TYPE=Debug \
            "$src_dir"
    fi
    
    if has_step 3; then
        make -j4 install
    fi
    
    if has_step 4; then
        ./copyq -s test1 "$@"
    fi