@@ -141,28 +141,58 @@ include (${WAMR_ROOT_DIR}/build-scripts/package.cmake)
141141
142142if (NOT DEFINED WAMR_BUILD_SANITIZER)
143143 set (WAMR_BUILD_SANITIZER $ENV{WAMR_BUILD_SANITIZER} )
144- endif ()
144+ endif ()
145145
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!" )
156153 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 ()
166196
167197if (WAMR_BUILD_LINUX_PERF EQUAL 1)
168198 if (NOT WAMR_BUILD_JIT AND NOT WAMR_BUILD_AOT)
0 commit comments