|
|
@@ -141,28 +141,58 @@ include (${WAMR_ROOT_DIR}/build-scripts/package.cmake)
|
|
|
|
|
|
if (NOT DEFINED WAMR_BUILD_SANITIZER)
|
|
|
set(WAMR_BUILD_SANITIZER $ENV{WAMR_BUILD_SANITIZER})
|
|
|
-endif ()
|
|
|
+endif()
|
|
|
|
|
|
-if (NOT DEFINED WAMR_BUILD_SANITIZER)
|
|
|
- set(WAMR_BUILD_SANITIZER "")
|
|
|
-elseif (WAMR_BUILD_SANITIZER STREQUAL "ubsan")
|
|
|
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=alignment" )
|
|
|
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined")
|
|
|
-elseif (WAMR_BUILD_SANITIZER STREQUAL "asan")
|
|
|
- if (NOT WAMR_BUILD_JIT EQUAL 1)
|
|
|
- set (ASAN_OPTIONS "verbosity=2 debug=true ")
|
|
|
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=address -fno-sanitize-recover=all" )
|
|
|
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
|
|
|
+if (NOT WAMR_BUILD_SANITIZER STREQUAL "")
|
|
|
+ set(SUPPORTED_SANITIZERS "ubsan;asan;tsan;posan")
|
|
|
+ string(REPLACE "," ";" SANITIZER_LIST "${WAMR_BUILD_SANITIZER}")
|
|
|
+
|
|
|
+ # Check uncompabile sanitizers
|
|
|
+ if("tsan" IN_LIST SANITIZER_LIST AND "asan" IN_LIST SANITIZER_LIST)
|
|
|
+ message(FATAL_ERROR "ThreadSanitizer (tsan) and AddressSanitizer (asan) cannot be used together!")
|
|
|
endif()
|
|
|
-elseif (WAMR_BUILD_SANITIZER STREQUAL "tsan")
|
|
|
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=thread -fno-sanitize-recover=all" )
|
|
|
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
|
|
|
-elseif (WAMR_BUILD_SANITIZER STREQUAL "posan")
|
|
|
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fsanitize=pointer-overflow -fno-sanitize-recover=all" )
|
|
|
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=pointer-overflow")
|
|
|
-elseif (NOT (WAMR_BUILD_SANITIZER STREQUAL "") )
|
|
|
- message(SEND_ERROR "Unsupported sanitizer: ${WAMR_BUILD_SANITIZER}")
|
|
|
-endif()
|
|
|
+
|
|
|
+ # Check every sanitizer in the list
|
|
|
+ set(INVALID_SANITIZERS "")
|
|
|
+ list(REMOVE_DUPLICATES SANITIZER_LIST)
|
|
|
+ set(SANITIZER_FLAGS)
|
|
|
+ set(NO_SANITIZER_FLAGS)
|
|
|
+ foreach(sanitizer ${SANITIZER_LIST})
|
|
|
+ string(STRIP "${sanitizer}" sanitizer)
|
|
|
+ if(NOT sanitizer IN_LIST SUPPORTED_SANITIZERS)
|
|
|
+ list(APPEND INVALID_SANITIZERS "${sanitizer}")
|
|
|
+ elseif(sanitizer STREQUAL "ubsan")
|
|
|
+ list(APPEND SANITIZER_FLAGS "undefined")
|
|
|
+ list(APPEND NO_SANITIZER_FLAGS "alignment")
|
|
|
+ elseif(sanitizer STREQUAL "asan")
|
|
|
+ if (NOT WAMR_BUILD_JIT EQUAL 1)
|
|
|
+ set(ENV{ASAN_OPTIONS} "verbosity=2 debug=true")
|
|
|
+ list(APPEND SANITIZER_FLAGS "address")
|
|
|
+ else()
|
|
|
+ message(WARNING "AddressSanitizer is not supported in LLVM JIT mode, skip it")
|
|
|
+ endif()
|
|
|
+ elseif(sanitizer STREQUAL "tsan")
|
|
|
+ list(APPEND SANITIZER_FLAGS "thread")
|
|
|
+ elseif(sanitizer STREQUAL "posan")
|
|
|
+ list(APPEND SANITIZER_FLAGS "pointer-overflow")
|
|
|
+ endif()
|
|
|
+ endforeach()
|
|
|
+
|
|
|
+ if(INVALID_SANITIZERS)
|
|
|
+ message(FATAL_ERROR "Unsupported sanitizers: ${INVALID_SANITIZERS}")
|
|
|
+ endif()
|
|
|
+ # common flags for all sanitizers
|
|
|
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer -fno-sanitize-recover=all")
|
|
|
+ if(SANITIZER_FLAGS)
|
|
|
+ string(REPLACE ";" "," SANITIZER_FLAGS_STR "${SANITIZER_FLAGS}")
|
|
|
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${SANITIZER_FLAGS_STR}")
|
|
|
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${SANITIZER_FLAGS_STR}")
|
|
|
+ endif()
|
|
|
+ if(NO_SANITIZER_FLAGS)
|
|
|
+ string(REPLACE ";" "," NO_SANITIZER_FLAGS_STR "${NO_SANITIZER_FLAGS}")
|
|
|
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-sanitize=${NO_SANITIZER_FLAGS_STR}")
|
|
|
+ endif()
|
|
|
+endif ()
|
|
|
|
|
|
if (WAMR_BUILD_LINUX_PERF EQUAL 1)
|
|
|
if (NOT WAMR_BUILD_JIT AND NOT WAMR_BUILD_AOT)
|