0afec5d1ee5687cc413b343f73251d147e7bfb47
[platform/upstream/coreclr.git] / enablesanitizers.sh
1 #!/usr/bin/env bash
2
3 if [ $# -eq 0 ]; then
4     echo "Script for enabling CLang sanitizers for debug builds."
5     echo "*Only tested on Ubuntu x64."
6     echo "*This script must be 'sourced' (via dot+space) so that changes to environment variables are preserved. Run like this:"    
7     if [ "$(dirname $0)" = "." ]; then
8         echo " . enablesanitizers.sh [options]"
9     else
10         echo " cd $(dirname $0);. enablesanitizers.sh [options]; cd -"
11     fi
12     echo "Usage: [asan] [ubsan] [lsan] [all] [off] [clangx.y]"
13     echo "asan: optional argument to enable Address Sanitizer."
14     echo "ubsan: optional argument to enable Undefined Behavior Sanitizer."
15     echo "lsan - optional argument to enable memory Leak Sanitizer."
16     echo "all - optional argument to enable asan, ubsan and lsan."
17     echo "off - optional argument to turn off all sanitizers."
18     echo "clangx.y - optional argument to specify clang version x.y. which is used to resolve stack traces."
19 else
20     __ClangMajorVersion=3
21     __ClangMinorVersion=5
22     __EnableASan=0
23     __EnableUBSan=0
24     __EnableLSan=0
25     __TurnOff=0
26     __Options=
27
28     for i in "$@"
29         do
30             lowerI="$(echo $i | awk '{print tolower($0)}')"
31             case $lowerI in
32             asan)
33                 __EnableASan=1
34                 ;;
35             ubsan)
36                 __EnableUBSan=1
37                 ;;
38             lsan)
39                 __EnableASan=1
40                 __EnableLSan=1
41                 ;;
42             all)
43                 __EnableASan=1
44                 __EnableUBSan=1
45                 __EnableLSan=1
46                 ;;
47             off)
48                 __TurnOff=1
49                 ;;
50             clang3.5)
51                 __ClangMajorVersion=3
52                 __ClangMinorVersion=5
53                 ;;
54             clang3.6)
55                 __ClangMajorVersion=3
56                 __ClangMinorVersion=6
57                 ;;
58             clang3.7)
59                 __ClangMajorVersion=3
60                 __ClangMinorVersion=7
61                 ;;
62             *)
63                 echo "Unknown arg: $i"
64                 return 1
65         esac
66     done
67
68     if [ $__TurnOff == 1 ]; then
69         unset DEBUG_SANITIZERS
70         echo "Setting DEBUG_SANITIZERS="
71     else
72         ASAN_OPTIONS="symbolize=1"
73
74         if [ $__EnableASan == 1 ]; then
75             __Options="$__Options asan"
76         fi
77         if [ $__EnableUBSan == 1 ]; then
78             __Options="$__Options ubsan"
79         fi
80         if [ $__EnableLSan == 1 ]; then
81             ASAN_OPTIONS="$ASAN_OPTIONS detect_leaks"
82         fi
83
84         # passed to build.sh
85         DEBUG_SANITIZERS="$__Options"
86         export DEBUG_SANITIZERS
87         echo "Setting DEBUG_SANITIZERS=$DEBUG_SANITIZERS"
88
89         # used by ASan at run-time
90         ASAN_OPTIONS="\"$ASAN_OPTIONS\""
91         export ASAN_OPTIONS
92         echo "Setting ASAN_OPTIONS=$ASAN_OPTIONS"
93
94         # used by ASan at run-time
95         ASAN_SYMBOLIZER_PATH="/usr/bin/llvm-symbolizer-$__ClangMajorVersion.$__ClangMinorVersion"
96         export ASAN_SYMBOLIZER_PATH
97         echo "Setting ASAN_SYMBOLIZER_PATH=$ASAN_SYMBOLIZER_PATH"
98     fi
99
100     unset __ClangMajorVersion
101     unset __ClangMinorVersion
102     unset __EnableASan
103     unset __EnableUBSan
104     unset __EnableLSan
105     unset __TurnOff
106     unset __Options
107 fi