sanitizers.sh 1.8 KB

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