12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- #!/usr/bin/env bash
- # This file is used by build.sh to setup sanitizers.
- sanitizer_flags=""
- sanitizers=()
- # This tracks what sanitizers are enabled so they don't get enabled twice. This
- # means that doing things that enable the same sanitizer twice (such as enabling
- # both --asan and --fuzz) is order-dependent: only the first is used.
- enable_sanitizer()
- {
- local san="$1"
- for i in "${sanitizers[@]}"; do
- [ "$san" = "$i" ] && return
- done
- sanitizers+=("$san")
- if [ -z "$sanitizer_flags" ]; then
- gyp_params+=(-Dno_zdefs=1)
- fi
- local cflags=$(python $cwd/coreconf/sanitizers.py "$@")
- sanitizer_flags="$sanitizer_flags $cflags"
- }
- enable_sancov()
- {
- local clang_version=$($CC --version | grep -oE '([0-9]{1,}\.)+[0-9]{1,}')
- if [[ ${clang_version:0:1} -lt 4 && ${clang_version:0:1} -eq 3 && ${clang_version:2:1} -lt 9 ]]; then
- echo "Need at least clang-3.9 (better 4.0) for sancov." 1>&2
- exit 1
- fi
- local sancov
- if [ -n "$1" ]; then
- sancov="$1"
- elif [ "${clang_version:0:3}" = "3.9" ]; then
- sancov=edge,indirect-calls,8bit-counters
- else
- sancov=trace-pc-guard,trace-cmp
- fi
- enable_sanitizer sancov "$sancov"
- }
- enable_ubsan()
- {
- local ubsan
- if [ -n "$1" ]; then
- ubsan="$1"
- else
- ubsan=bool,signed-integer-overflow,shift,vptr
- fi
- enable_sanitizer ubsan "$ubsan"
- }
- # Not strictly a sanitizer, but the pattern fits
- scanbuild=()
- enable_scanbuild()
- {
- [ "${#scanbuild[@]}" -gt 0 ] && return
- scanbuild=(scan-build)
- if [ -n "$1" ]; then
- scanbuild+=(-o "$1")
- fi
- # pass on CC and CCC to scanbuild
- if [ -n "$CC" ]; then
- scanbuild+=(--use-cc="$CC")
- fi
- if [ -n "$CCC" ]; then
- scanbuild+=(--use-c++="$CCC")
- fi
- }
- run_scanbuild()
- {
- "${scanbuild[@]}" "$@"
- }
|