diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake index 8cdce4a017..c2121e424a 100644 --- a/build-scripts/config_common.cmake +++ b/build-scripts/config_common.cmake @@ -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) diff --git a/tests/wamr-test-suites/test_wamr.sh b/tests/wamr-test-suites/test_wamr.sh index 6f498653f0..1edf363bcb 100755 --- a/tests/wamr-test-suites/test_wamr.sh +++ b/tests/wamr-test-suites/test_wamr.sh @@ -39,7 +39,9 @@ function help() echo "-F set the firmware path used by qemu" echo "-C enable code coverage collect" echo "-j set the platform to test" - echo "-T set sanitizer to use in tests(ubsan|tsan|asan|posan)" + echo "-T set the sanitizer(s) used during testing. It can be either a comma-separated list + (e.g., ubsan, asan) or a single option + (e.g., ubsan, tsan, asan, posan)." echo "-A use the specified wamrc command instead of building it" echo "-N enable extended const expression feature" echo "-r [requirement name] [N [N ...]] specify a requirement name followed by one or more" @@ -1066,26 +1068,9 @@ function trigger() EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_TAIL_CALL=1" fi - echo "SANITIZER IS" $WAMR_BUILD_SANITIZER - - if [[ "$WAMR_BUILD_SANITIZER" == "ubsan" ]]; then - echo "Setting run with ubsan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=ubsan" - fi - - if [[ "$WAMR_BUILD_SANITIZER" == "asan" ]]; then - echo "Setting run with asan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=asan" - fi - - if [[ "$WAMR_BUILD_SANITIZER" == "tsan" ]]; then - echo "Setting run with tsan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=tsan" - fi - - if [[ "$WAMR_BUILD_SANITIZER" == "posan" ]]; then - echo "Setting run with posan" - EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=posan" + if [[ -n "$WAMR_BUILD_SANITIZER" ]]; then + echo "Setting run with sanitizer(s): $WAMR_BUILD_SANITIZER" + EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_SANITIZER=$WAMR_BUILD_SANITIZER" fi # Make sure we're using the builtin WASI libc implementation