From e40b0da91f79998db53271c8a9ad3740b9dfe23f Mon Sep 17 00:00:00 2001 From: David Kilzer Date: Mon, 24 Feb 2025 04:30:40 -0800 Subject: [PATCH] [ANGLE] Workaround ASan false-positive stack-use-after-scope in Xcode 16.3 Reviewed by John Wilander and Kimmo Kinnunen. * Configurations/Sanitizers.xcconfig: (WK_ADDRESS_SANITIZER_OTHER_CFLAGS_YES): (WK_NEEDS_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_WORKAROUND): Add. (WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE): Add. (WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_YES): Add. - Include a command-line switch to define a macro if the workaround is needed. * Configurations/WebKitTargetConditionals.xcconfig: (WK_XCODE_BEFORE_16_3): Add. (WK_XCODE_BEFORE_16_3_XCODE_BEFORE_16): Add. (WK_XCODE_BEFORE_16_3_XCODE_SINCE_16): Add. (WK_XCODE_BEFORE_16_3_1600): Add. (WK_XCODE_BEFORE_16_3_1610): Add. (WK_XCODE_BEFORE_16_3_1620): Add. (WK_XCODE_16_3): Add. (WK_XCODE_16_3_): Add. (WK_XCODE_16_3_YES): Add. - Add version checking variables for Xcode 16.3. * Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.h: (sh::fractionalPart): - Disable ASan if the workaround is needed. Canonical link: https://commits.webkit.org/290943@main --- Configurations/Sanitizers.xcconfig | 12 ++++++++++-- Configurations/WebKitTargetConditionals.xcconfig | 13 ++++++++++++- .../ANGLE/src/compiler/translator/InfoSink.h | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Configurations/Sanitizers.xcconfig b/Configurations/Sanitizers.xcconfig index 25be668577000..accd7bf77cd6a 100644 --- a/Configurations/Sanitizers.xcconfig +++ b/Configurations/Sanitizers.xcconfig @@ -1,4 +1,4 @@ -// Copyright (C) 2023-2024 Apple Inc. All rights reserved. +// Copyright (C) 2023-2025 Apple Inc. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions @@ -26,6 +26,8 @@ // Requires SDKVariant.xcconfig. +#include "WebKitTargetConditionals.xcconfig" + WK_SANITIZER_GCC_OPTIMIZATION_LEVEL = $(WK_SANITIZER_GCC_OPTIMIZATION_LEVEL_$(CONFIGURATION)); WK_SANITIZER_GCC_OPTIMIZATION_LEVEL_Debug = 0; WK_SANITIZER_GCC_OPTIMIZATION_LEVEL_Production = 1; @@ -64,11 +66,17 @@ WK_ANY_SANITIZER_LDFLAGS_YES = -Wl,-rpath,@executable_path/Frameworks; // Address Sanitizer // Add -fsanitize-address-use-after-return=never to disable ASan's "fake stack" to fix JSC garbage collection. -WK_ADDRESS_SANITIZER_OTHER_CFLAGS_YES = -fsanitize-address-use-after-return=never; +WK_ADDRESS_SANITIZER_OTHER_CFLAGS_YES = -fsanitize-address-use-after-return=never $(WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE); WK_ADDRESS_SANITIZER_OTHER_LDFLAGS_YES = -fsanitize-address-use-after-return=never; WK_ADDRESS_SANITIZER_OTHER_CPLUSPLUSFLAGS_YES = -U_LIBCPP_HAS_NO_ASAN; +// Workaround ASan stack-use-after-scope false positive in Xcode 16.3: . +WK_NEEDS_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_WORKAROUND = $(WK_NOT_$(WK_XCODE_BEFORE_16_3)); + +WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE = $(WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_$(WK_NEEDS_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_WORKAROUND); +WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_YES = -DWK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE; + // Undefined Behavior Sanitizer // FIXME: Tune list of Undefined Behavior (UBSan) checkers diff --git a/Configurations/WebKitTargetConditionals.xcconfig b/Configurations/WebKitTargetConditionals.xcconfig index e7fba47e5a479..b8f7885e8067d 100644 --- a/Configurations/WebKitTargetConditionals.xcconfig +++ b/Configurations/WebKitTargetConditionals.xcconfig @@ -1,4 +1,4 @@ -// Copyright (C) 2018-2024 Apple Inc. All rights reserved. +// Copyright (C) 2018-2025 Apple Inc. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions @@ -380,3 +380,14 @@ WK_XCODE_BEFORE_16_1500 = YES; WK_XCODE_16 = $(WK_XCODE_16_$(WK_XCODE_BEFORE_16)); WK_XCODE_16_ = _XCODE_SINCE_16; WK_XCODE_16_YES = _XCODE_BEFORE_16; + +WK_XCODE_BEFORE_16_3 = $(WK_XCODE_BEFORE_16_3$(WK_XCODE_16)); +WK_XCODE_BEFORE_16_3_XCODE_BEFORE_16 = YES; +WK_XCODE_BEFORE_16_3_XCODE_SINCE_16 = $(WK_XCODE_BEFORE_16_3_$(XCODE_VERSION_MINOR)); +WK_XCODE_BEFORE_16_3_1600 = YES; +WK_XCODE_BEFORE_16_3_1610 = YES; +WK_XCODE_BEFORE_16_3_1620 = YES; + +WK_XCODE_16_3 = $(WK_XCODE_16_3_$(WK_XCODE_BEFORE_16_3)); +WK_XCODE_16_3_ = _XCODE_SINCE_16_3; +WK_XCODE_16_3_YES = _XCODE_BEFORE_16_3; diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.h b/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.h index 8d3b1c0cf16e7..680e5cbb38886 100644 --- a/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.h +++ b/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.h @@ -21,6 +21,9 @@ class TSymbol; class TType; // Returns the fractional part of the given floating-point number. +#ifdef WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE +__attribute__((no_sanitize_address)) +#endif inline float fractionalPart(float f) { float intPart = 0.0f;