diff --git a/src/crypto/sha256_sse4.cpp b/src/crypto/sha256_sse4.cpp index 2d37d124d1e..4464ec92439 100644 --- a/src/crypto/sha256_sse4.cpp +++ b/src/crypto/sha256_sse4.cpp @@ -12,18 +12,23 @@ namespace sha256_sse4 { -void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks) -#if defined(__clang__) - /* - clang is unable to compile this with -O0 and -fsanitize=address. - See upstream bug: https://github.com/llvm/llvm-project/issues/92182. - This also fails to compile with -O2, -fcf-protection & -fsanitize=address. - See https://github.com/bitcoin/bitcoin/issues/31913. - */ -#if __has_feature(address_sanitizer) +/* +Both Clang and GCC fail with ASan on this inline assembly: +- Clang: compile failure with -O0 or -O2 + -fcf-protection under ASan. + See https://github.com/llvm/llvm-project/issues/92182 + and https://github.com/bitcoin/bitcoin/issues/31913. +- GCC: runtime SEGV during SHA256AutoDetect()'s self-test under ASan, + regardless of optimization level. + See https://github.com/bitcoin/bitcoin/issues/34881. +*/ +#if defined(__SANITIZE_ADDRESS__) + __attribute__((no_sanitize("address"))) +#elif defined(__clang__) +#if __has_feature(address_sanitizer) // fallback can be removed once support for Clang 21 is dropped __attribute__((no_sanitize("address"))) #endif #endif +void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks) { static const uint32_t K256 alignas(16) [] = { 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,