diff --git a/.github/azure-pipelines.yml b/.github/azure-pipelines.yml index 32d6bd0b..2aa641a4 100644 --- a/.github/azure-pipelines.yml +++ b/.github/azure-pipelines.yml @@ -92,6 +92,13 @@ jobs: xCodeVersion: 16.4 enableSanitizers: true + - template: jobs/macos.yml + parameters: + name: 'macOS_Xcode164_ThreadSanitizer' + vmImage: 'macOS-latest' + xCodeVersion: 16.4 + enableThreadSanitizer: true + # iOS - template: jobs/ios.yml parameters: @@ -124,3 +131,10 @@ jobs: enableSanitizers: true CC: clang CXX: clang++ + + - template: jobs/linux.yml + parameters: + name: Ubuntu_ThreadSanitizer_clang + enableThreadSanitizer: true + CC: clang + CXX: clang++ diff --git a/.github/jobs/linux.yml b/.github/jobs/linux.yml index 93a068c9..1236e340 100644 --- a/.github/jobs/linux.yml +++ b/.github/jobs/linux.yml @@ -1,6 +1,7 @@ parameters: name: '' enableSanitizers: false + enableThreadSanitizer: false CC: gcc CXX: g++ @@ -13,6 +14,7 @@ jobs: variables: SANITIZER_FLAG: ${{ coalesce(replace(format('{0}', parameters.enableSanitizers), 'True', 'ON'), 'OFF') }} + THREAD_SANITIZER_FLAG: ${{ coalesce(replace(format('{0}', parameters.enableThreadSanitizer), 'True', 'ON'), 'OFF') }} steps: - script: | @@ -23,7 +25,7 @@ jobs: - script: | export CC=${{parameters.CC}} export CXX=${{parameters.CXX}} - cmake -B Build/ubuntu -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo -D ENABLE_SANITIZERS=$(SANITIZER_FLAG) -D CMAKE_C_COMPILER=${{parameters.CC}} -D CMAKE_CXX_COMPILER=${{parameters.CXX}} + cmake -B Build/ubuntu -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo -D ENABLE_SANITIZERS=$(SANITIZER_FLAG) -D ENABLE_THREAD_SANITIZER=$(THREAD_SANITIZER_FLAG) -D CMAKE_C_COMPILER=${{parameters.CC}} -D CMAKE_CXX_COMPILER=${{parameters.CXX}} displayName: 'Configure CMake' - script: | diff --git a/.github/jobs/macos.yml b/.github/jobs/macos.yml index 01e029ee..29fd58ed 100644 --- a/.github/jobs/macos.yml +++ b/.github/jobs/macos.yml @@ -3,6 +3,7 @@ parameters: vmImage: '' xCodeVersion: '' enableSanitizers: false + enableThreadSanitizer: false jobs: - job: ${{parameters.name}} @@ -13,6 +14,7 @@ jobs: variables: SANITIZER_FLAG: ${{ coalesce(replace(format('{0}', parameters.enableSanitizers), 'True', 'ON'), 'OFF') }} + THREAD_SANITIZER_FLAG: ${{ coalesce(replace(format('{0}', parameters.enableThreadSanitizer), 'True', 'ON'), 'OFF') }} steps: - script: | @@ -20,7 +22,7 @@ jobs: displayName: 'Select Xcode ${{parameters.xCodeVersion}}' - script: | - cmake -B Build/macOS -G Xcode -D ENABLE_SANITIZERS=$(SANITIZER_FLAG) + cmake -B Build/macOS -G Xcode -D ENABLE_SANITIZERS=$(SANITIZER_FLAG) -D ENABLE_THREAD_SANITIZER=$(THREAD_SANITIZER_FLAG) displayName: 'Configure CMake' - task: Xcode@5 diff --git a/.gitignore b/.gitignore index b84ede5a..0260b044 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /Build +Tests/UnitTests/dist/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 33b28392..d3938368 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,11 @@ option(JSRUNTIMEHOST_POLYFILL_TEXTDECODER "Include JsRuntimeHost Polyfill TextDe # Sanitizers option(ENABLE_SANITIZERS "Enable AddressSanitizer and UBSan" OFF) +option(ENABLE_THREAD_SANITIZER "Enable ThreadSanitizer" OFF) + +if(ENABLE_SANITIZERS AND ENABLE_THREAD_SANITIZER) + message(FATAL_ERROR "ENABLE_SANITIZERS and ENABLE_THREAD_SANITIZER cannot be used together.") +endif() if(ENABLE_SANITIZERS) set(ENABLE_RTTI ON CACHE BOOL "" FORCE) @@ -111,6 +116,15 @@ if(ENABLE_SANITIZERS) endif() endif() +if(ENABLE_THREAD_SANITIZER) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") + add_compile_options(-fsanitize=thread -fno-omit-frame-pointer) + add_link_options(-fsanitize=thread) + else() + message(WARNING "ThreadSanitizer not supported on this compiler.") + endif() +endif() + # -------------------------------------------------- FetchContent_MakeAvailable_With_Message(arcana.cpp)