@@ -141,28 +141,58 @@ include (${WAMR_ROOT_DIR}/build-scripts/package.cmake)
141
141
142
142
if (NOT DEFINED WAMR_BUILD_SANITIZER )
143
143
set (WAMR_BUILD_SANITIZER $ENV{WAMR_BUILD_SANITIZER} )
144
- endif ()
144
+ endif ()
145
145
146
- if (NOT DEFINED WAMR_BUILD_SANITIZER )
147
- set (WAMR_BUILD_SANITIZER "" )
148
- elseif (WAMR_BUILD_SANITIZER STREQUAL "ubsan" )
149
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=alignment" )
150
- set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined" )
151
- elseif (WAMR_BUILD_SANITIZER STREQUAL "asan" )
152
- if (NOT WAMR_BUILD_JIT EQUAL 1 )
153
- set (ASAN_OPTIONS "verbosity=2 debug=true " )
154
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=address -fno-sanitize-recover=all" )
155
- set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address" )
146
+ if (NOT WAMR_BUILD_SANITIZER STREQUAL "" )
147
+ set (SUPPORTED_SANITIZERS "ubsan;asan;tsan;posan" )
148
+ string (REPLACE "," ";" SANITIZER_LIST "${WAMR_BUILD_SANITIZER} " )
149
+
150
+ # Check uncompabile sanitizers
151
+ if ("tsan" IN_LIST SANITIZER_LIST AND "asan" IN_LIST SANITIZER_LIST )
152
+ message (FATAL_ERROR "ThreadSanitizer (tsan) and AddressSanitizer (asan) cannot be used together!" )
156
153
endif ()
157
- elseif (WAMR_BUILD_SANITIZER STREQUAL "tsan" )
158
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=thread -fno-sanitize-recover=all" )
159
- set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread" )
160
- elseif (WAMR_BUILD_SANITIZER STREQUAL "posan" )
161
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=pointer-overflow -fno-sanitize-recover=all" )
162
- set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=pointer-overflow" )
163
- elseif (NOT (WAMR_BUILD_SANITIZER STREQUAL "" ) )
164
- message (SEND_ERROR "Unsupported sanitizer: ${WAMR_BUILD_SANITIZER} " )
165
- endif ()
154
+
155
+ # Check every sanitizer in the list
156
+ set (INVALID_SANITIZERS "" )
157
+ list (REMOVE_DUPLICATES SANITIZER_LIST )
158
+ set (SANITIZER_FLAGS )
159
+ set (NO_SANITIZER_FLAGS )
160
+ foreach (sanitizer ${SANITIZER_LIST} )
161
+ string (STRIP "${sanitizer} " sanitizer )
162
+ if (NOT sanitizer IN_LIST SUPPORTED_SANITIZERS )
163
+ list (APPEND INVALID_SANITIZERS "${sanitizer} " )
164
+ elseif (sanitizer STREQUAL "ubsan" )
165
+ list (APPEND SANITIZER_FLAGS "undefined" )
166
+ list (APPEND NO_SANITIZER_FLAGS "alignment" )
167
+ elseif (sanitizer STREQUAL "asan" )
168
+ if (NOT WAMR_BUILD_JIT EQUAL 1 )
169
+ set (ENV{ASAN_OPTIONS} "verbosity=2 debug=true" )
170
+ list (APPEND SANITIZER_FLAGS "address" )
171
+ else ()
172
+ message (WARNING "AddressSanitizer is not supported in LLVM JIT mode, skip it" )
173
+ endif ()
174
+ elseif (sanitizer STREQUAL "tsan" )
175
+ list (APPEND SANITIZER_FLAGS "thread" )
176
+ elseif (sanitizer STREQUAL "posan" )
177
+ list (APPEND SANITIZER_FLAGS "pointer-overflow" )
178
+ endif ()
179
+ endforeach ()
180
+
181
+ if (INVALID_SANITIZERS )
182
+ message (FATAL_ERROR "Unsupported sanitizers: ${INVALID_SANITIZERS} " )
183
+ endif ()
184
+ # common flags for all sanitizers
185
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fno-sanitize-recover=all" )
186
+ if (SANITIZER_FLAGS )
187
+ string (REPLACE ";" "," SANITIZER_FLAGS_STR "${SANITIZER_FLAGS} " )
188
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${SANITIZER_FLAGS_STR} " )
189
+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${SANITIZER_FLAGS_STR} " )
190
+ endif ()
191
+ if (NO_SANITIZER_FLAGS )
192
+ string (REPLACE ";" "," NO_SANITIZER_FLAGS_STR "${NO_SANITIZER_FLAGS} " )
193
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize=${NO_SANITIZER_FLAGS_STR} " )
194
+ endif ()
195
+ endif ()
166
196
167
197
if (WAMR_BUILD_LINUX_PERF EQUAL 1 )
168
198
if (NOT WAMR_BUILD_JIT AND NOT WAMR_BUILD_AOT )
0 commit comments