Merge bitcoin-core/secp256k1#1532: cmake: Disable eager MSan in ctime_tests

f55703ba49 autotools: Delete unneeded compiler test (Hennadii Stepanov)
396e885886 autotools: Align MSan checking code with CMake's implementation (Hennadii Stepanov)
abde59f52d cmake: Report more compiler details in summary (Hennadii Stepanov)
7abf979a43 cmake: Disable `ctime_tests` if build with `-fsanitize=memory` (Hennadii Stepanov)

Pull request description:

  Same as https://github.com/bitcoin-core/secp256k1/pull/1517, but for the CMakle build system.

  The second commit improves the configure summary (similar to https://github.com/hebasto/bitcoin/pull/189.

ACKs for top commit:
  real-or-random:
    ACK f55703ba49

Tree-SHA512: 18190c062ae6e27d0ecbe7460cc22c960b25c0d35aa4b94f151d4b1c48f16e99fd5ecdfcb359784f95995292633d30d3d23b75a12be3aca5afffcc1e7e7daf31
This commit is contained in:
merge-script
2024-06-10 18:07:13 +02:00
4 changed files with 45 additions and 5 deletions

View File

@@ -263,6 +263,17 @@ endif()
set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_C_VISIBILITY_PRESET hidden)
set(print_msan_notice)
if(SECP256K1_BUILD_CTIME_TESTS)
include(CheckMemorySanitizer)
check_memory_sanitizer(msan_enabled)
if(msan_enabled)
try_append_c_flags(-fno-sanitize-memory-param-retval)
set(print_msan_notice YES)
endif()
unset(msan_enabled)
endif()
# Ask CTest to create a "check" target (e.g., make check) as alias for the "test" target. # Ask CTest to create a "check" target (e.g., make check) as alias for the "test" target.
# CTEST_TEST_TARGET_ALIAS is not documented but supposed to be user-facing. # CTEST_TEST_TARGET_ALIAS is not documented but supposed to be user-facing.
# See: https://gitlab.kitware.com/cmake/cmake/-/commit/816c9d1aa1f2b42d40c81a991b68c96eb12b6d2 # See: https://gitlab.kitware.com/cmake/cmake/-/commit/816c9d1aa1f2b42d40c81a991b68c96eb12b6d2
@@ -332,7 +343,7 @@ message("Valgrind .............................. ${SECP256K1_VALGRIND}")
get_directory_property(definitions COMPILE_DEFINITIONS) get_directory_property(definitions COMPILE_DEFINITIONS)
string(REPLACE ";" " " definitions "${definitions}") string(REPLACE ";" " " definitions "${definitions}")
message("Preprocessor defined macros ........... ${definitions}") message("Preprocessor defined macros ........... ${definitions}")
message("C compiler ............................ ${CMAKE_C_COMPILER}") message("C compiler ............................ ${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}, ${CMAKE_C_COMPILER}")
message("CFLAGS ................................ ${CMAKE_C_FLAGS}") message("CFLAGS ................................ ${CMAKE_C_FLAGS}")
get_directory_property(compile_options COMPILE_OPTIONS) get_directory_property(compile_options COMPILE_OPTIONS)
string(REPLACE ";" " " compile_options "${compile_options}") string(REPLACE ";" " " compile_options "${compile_options}")
@@ -358,7 +369,14 @@ endif()
if(SECP256K1_LATE_CFLAGS) if(SECP256K1_LATE_CFLAGS)
message("SECP256K1_LATE_CFLAGS ................. ${SECP256K1_LATE_CFLAGS}") message("SECP256K1_LATE_CFLAGS ................. ${SECP256K1_LATE_CFLAGS}")
endif() endif()
message("\n") message("")
if(print_msan_notice)
message(
"Note:\n"
" MemorySanitizer detected, tried to add -fno-sanitize-memory-param-retval to compile options\n"
" to avoid false positives in ctime_tests. Pass -DSECP256K1_BUILD_CTIME_TESTS=OFF to avoid this.\n"
)
endif()
if(SECP256K1_EXPERIMENTAL) if(SECP256K1_EXPERIMENTAL)
message( message(
" ******\n" " ******\n"

View File

@@ -50,10 +50,14 @@ AC_MSG_CHECKING(whether MemorySanitizer is enabled)
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#if defined(__has_feature) #if defined(__has_feature)
# if __has_feature(memory_sanitizer) # if __has_feature(memory_sanitizer)
# error "MemorySanitizer is enabled." /* MemorySanitizer is enabled. */
# elif
# error "MemorySanitizer is disabled."
# endif # endif
#else
# error "__has_feature is not defined."
#endif #endif
]])], [msan_enabled=no], [msan_enabled=yes]) ]])], [msan_enabled=yes], [msan_enabled=no])
AC_MSG_RESULT([$msan_enabled]) AC_MSG_RESULT([$msan_enabled])
]) ])

View File

@@ -0,0 +1,18 @@
include_guard(GLOBAL)
include(CheckCSourceCompiles)
function(check_memory_sanitizer output)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
check_c_source_compiles("
#if defined(__has_feature)
# if __has_feature(memory_sanitizer)
/* MemorySanitizer is enabled. */
# elif
# error \"MemorySanitizer is disabled.\"
# endif
#else
# error \"__has_feature is not defined.\"
#endif
" HAVE_MSAN)
set(${output} ${HAVE_MSAN} PARENT_SCOPE)
endfunction()

View File

@@ -248,7 +248,7 @@ if test x"$enable_ctime_tests" = x"auto"; then
fi fi
print_msan_notice=no print_msan_notice=no
if test x"$enable_ctime_tests" = x"yes" && test x"$GCC" = x"yes"; then if test x"$enable_ctime_tests" = x"yes"; then
SECP_MSAN_CHECK SECP_MSAN_CHECK
# MSan on Clang >=16 reports unitialized memory in function parameters and return values, even if # MSan on Clang >=16 reports unitialized memory in function parameters and return values, even if
# the uninitalized variable is never actually "used". This is called "eager" checking, and it's # the uninitalized variable is never actually "used". This is called "eager" checking, and it's