sanitizers.sh (1992B)
1 #!/usr/bin/env bash 2 # This file is used by build.sh to setup sanitizers. 3 4 sanitizer_flags="" 5 sanitizers=() 6 7 # This tracks what sanitizers are enabled so they don't get enabled twice. This 8 # means that doing things that enable the same sanitizer twice (such as enabling 9 # both --asan and --fuzz) is order-dependent: only the first is used. 10 enable_sanitizer() 11 { 12 local san="$1" 13 for i in "${sanitizers[@]}"; do 14 [ "$san" = "$i" ] && return 15 done 16 sanitizers+=("$san") 17 18 if [ -z "$sanitizer_flags" ]; then 19 gyp_params+=(-Dno_zdefs=1) 20 fi 21 22 local cflags 23 cflags=$(${python:-python3} "${cwd}/coreconf/sanitizers.py" "$@") 24 if [ $? -ne 0 ]; then 25 exit 1 26 fi 27 sanitizer_flags="$sanitizer_flags $cflags" 28 } 29 30 enable_sancov() 31 { 32 local clang_version 33 clang_version=$($CC --version | grep -oE '([0-9]{1,}\.)+[0-9]{1,}') 34 if [[ ${clang_version:0:1} -lt 4 && ${clang_version:0:1} -eq 3 && ${clang_version:2:1} -lt 9 ]]; then 35 echo "Need at least clang-3.9 (better 4.0) for sancov." 1>&2 36 exit 1 37 fi 38 39 local sancov 40 if [ -n "$1" ]; then 41 sancov="$1" 42 elif [ "${clang_version:0:3}" = "3.9" ]; then 43 sancov=edge,indirect-calls,8bit-counters 44 else 45 sancov=trace-pc-guard,trace-cmp 46 fi 47 enable_sanitizer sancov "$sancov" 48 } 49 50 enable_sourcecov() 51 { 52 enable_sanitizer sourcecov 53 } 54 55 enable_ubsan() 56 { 57 local ubsan 58 if [ -n "$1" ]; then 59 ubsan="$1" 60 else 61 ubsan=undefined,local-bounds 62 fi 63 enable_sanitizer ubsan "$ubsan" 64 } 65 66 # Not strictly a sanitizer, but the pattern fits 67 scanbuild=() 68 enable_scanbuild() 69 { 70 [ "${#scanbuild[@]}" -gt 0 ] && return 71 72 scanbuild=(scan-build) 73 if [ -n "$1" ]; then 74 scanbuild+=(-o "$1") 75 fi 76 # pass on CC and CCC to scanbuild 77 if [ -n "$CC" ]; then 78 scanbuild+=(--use-cc="$CC") 79 fi 80 if [ -n "$CCC" ]; then 81 scanbuild+=(--use-c++="$CCC") 82 fi 83 } 84 85 run_scanbuild() 86 { 87 "${scanbuild[@]}" "$@" 88 }