From 76b7f048d5c270757e816fdeae1f37654da11c22 Mon Sep 17 00:00:00 2001 From: lipengyu Date: Sat, 12 Sep 2026 16:23:56 +0800 Subject: [PATCH] gh-157354 : Honor disabled sanitizer configure options --- ...-09-12-15-33-26.gh-issue-157354.2hw6fe.rst | 3 + configure | 86 ++++++++++++------- configure.ac | 38 ++++---- 3 files changed, 75 insertions(+), 52 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2026-09-12-15-33-26.gh-issue-157354.2hw6fe.rst diff --git a/Misc/NEWS.d/next/Build/2026-09-12-15-33-26.gh-issue-157354.2hw6fe.rst b/Misc/NEWS.d/next/Build/2026-09-12-15-33-26.gh-issue-157354.2hw6fe.rst new file mode 100644 index 000000000000000..906b70fcf5e5f36 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2026-09-12-15-33-26.gh-issue-157354.2hw6fe.rst @@ -0,0 +1,3 @@ +Honor ``=no`` and ``--without-...`` for the AddressSanitizer, +MemorySanitizer, UndefinedBehaviorSanitizer, and ThreadSanitizer configure +options without adding sanitizer flags or changing the pymalloc setting. diff --git a/configure b/configure index 1115be256afb495..43fbea67b317c20 100755 --- a/configure +++ b/configure @@ -14151,20 +14151,26 @@ printf %s "checking for --with-address-sanitizer... " >&6; } if test ${with_address_sanitizer+y} then : withval=$with_address_sanitizer; -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 -printf "%s\n" "$withval" >&6; } +else case e in #( + e) with_address_sanitizer=no ;; +esac +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_address_sanitizer" >&5 +printf "%s\n" "$with_address_sanitizer" >&6; } +if test "x$with_address_sanitizer" = xno +then : + +else case e in #( + e) BASECFLAGS="-fsanitize=address -fno-omit-frame-pointer $BASECFLAGS" LDFLAGS="-fsanitize=address $LDFLAGS" # ASan works by controlling memory allocation, our own malloc interferes. with_pymalloc="no" - -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } ;; + ;; esac fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-memory-sanitizer" >&5 printf %s "checking for --with-memory-sanitizer... " >&6; } @@ -14172,8 +14178,18 @@ printf %s "checking for --with-memory-sanitizer... " >&6; } if test ${with_memory_sanitizer+y} then : withval=$with_memory_sanitizer; -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 -printf "%s\n" "$withval" >&6; } +else case e in #( + e) with_memory_sanitizer=no ;; +esac +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_memory_sanitizer" >&5 +printf "%s\n" "$with_memory_sanitizer" >&6; } +if test "x$with_memory_sanitizer" = xno +then : + +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fsanitize=memory" >&5 printf %s "checking whether C compiler accepts -fsanitize=memory... " >&6; } if test ${ax_cv_check_cflags___fsanitize_memory+y} @@ -14220,14 +14236,10 @@ fi # MSan works by controlling memory allocation, our own malloc interferes. with_pymalloc="no" - -else case e in #( - e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } ;; + ;; esac fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-undefined-behavior-sanitizer" >&5 printf %s "checking for --with-undefined-behavior-sanitizer... " >&6; } @@ -14235,22 +14247,27 @@ printf %s "checking for --with-undefined-behavior-sanitizer... " >&6; } if test ${with_undefined_behavior_sanitizer+y} then : withval=$with_undefined_behavior_sanitizer; -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 -printf "%s\n" "$withval" >&6; } -BASECFLAGS="-fsanitize=undefined $BASECFLAGS" -LDFLAGS="-fsanitize=undefined $LDFLAGS" -with_ubsan="yes" +else case e in #( + e) with_undefined_behavior_sanitizer=no ;; +esac +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_undefined_behavior_sanitizer" >&5 +printf "%s\n" "$with_undefined_behavior_sanitizer" >&6; } +if test "x$with_undefined_behavior_sanitizer" = xno +then : + +with_ubsan="no" else case e in #( e) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -with_ubsan="no" +BASECFLAGS="-fsanitize=undefined $BASECFLAGS" +LDFLAGS="-fsanitize=undefined $LDFLAGS" +with_ubsan="yes" ;; esac fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-thread-sanitizer" >&5 printf %s "checking for --with-thread-sanitizer... " >&6; } @@ -14258,22 +14275,27 @@ printf %s "checking for --with-thread-sanitizer... " >&6; } if test ${with_thread_sanitizer+y} then : withval=$with_thread_sanitizer; -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 -printf "%s\n" "$withval" >&6; } -BASECFLAGS="-fsanitize=thread $BASECFLAGS" -LDFLAGS="-fsanitize=thread $LDFLAGS" -with_tsan="yes" +else case e in #( + e) with_thread_sanitizer=no ;; +esac +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_thread_sanitizer" >&5 +printf "%s\n" "$with_thread_sanitizer" >&6; } +if test "x$with_thread_sanitizer" = xno +then : + +with_tsan="no" else case e in #( e) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -with_tsan="no" +BASECFLAGS="-fsanitize=thread $BASECFLAGS" +LDFLAGS="-fsanitize=thread $LDFLAGS" +with_tsan="yes" ;; esac fi - # Set info about shared libraries. diff --git a/configure.ac b/configure.ac index 902a822e43a42f0..b937757294189d7 100644 --- a/configure.ac +++ b/configure.ac @@ -3519,14 +3519,14 @@ AC_MSG_CHECKING([for --with-address-sanitizer]) AC_ARG_WITH([address_sanitizer], AS_HELP_STRING([--with-address-sanitizer], [enable AddressSanitizer memory error detector, 'asan' (default is no)]), -[ -AC_MSG_RESULT([$withval]) +[], [with_address_sanitizer=no]) +AC_MSG_RESULT([$with_address_sanitizer]) +AS_VAR_IF([with_address_sanitizer], [no], [], [ BASECFLAGS="-fsanitize=address -fno-omit-frame-pointer $BASECFLAGS" LDFLAGS="-fsanitize=address $LDFLAGS" # ASan works by controlling memory allocation, our own malloc interferes. with_pymalloc="no" -], -[AC_MSG_RESULT([no])]) +]) AC_MSG_CHECKING([for --with-memory-sanitizer]) AC_ARG_WITH( @@ -3535,16 +3535,16 @@ AC_ARG_WITH( [--with-memory-sanitizer], [enable MemorySanitizer allocation error detector, 'msan' (default is no)] )], -[ -AC_MSG_RESULT([$withval]) +[], [with_memory_sanitizer=no]) +AC_MSG_RESULT([$with_memory_sanitizer]) +AS_VAR_IF([with_memory_sanitizer], [no], [], [ AX_CHECK_COMPILE_FLAG([-fsanitize=memory],[ BASECFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer $BASECFLAGS" LDFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 $LDFLAGS" ],[AC_MSG_ERROR([The selected compiler doesn't support memory sanitizer])]) # MSan works by controlling memory allocation, our own malloc interferes. with_pymalloc="no" -], -[AC_MSG_RESULT([no])]) +]) AC_MSG_CHECKING([for --with-undefined-behavior-sanitizer]) AC_ARG_WITH( @@ -3553,15 +3553,14 @@ AC_ARG_WITH( [--with-undefined-behavior-sanitizer], [enable UndefinedBehaviorSanitizer undefined behaviour detector, 'ubsan' (default is no)] )], -[ -AC_MSG_RESULT([$withval]) +[], [with_undefined_behavior_sanitizer=no]) +AC_MSG_RESULT([$with_undefined_behavior_sanitizer]) +AS_VAR_IF([with_undefined_behavior_sanitizer], [no], [ +with_ubsan="no" +], [ BASECFLAGS="-fsanitize=undefined $BASECFLAGS" LDFLAGS="-fsanitize=undefined $LDFLAGS" with_ubsan="yes" -], -[ -AC_MSG_RESULT([no]) -with_ubsan="no" ]) AC_MSG_CHECKING([for --with-thread-sanitizer]) @@ -3571,15 +3570,14 @@ AC_ARG_WITH( [--with-thread-sanitizer], [enable ThreadSanitizer data race detector, 'tsan' (default is no)] )], -[ -AC_MSG_RESULT([$withval]) +[], [with_thread_sanitizer=no]) +AC_MSG_RESULT([$with_thread_sanitizer]) +AS_VAR_IF([with_thread_sanitizer], [no], [ +with_tsan="no" +], [ BASECFLAGS="-fsanitize=thread $BASECFLAGS" LDFLAGS="-fsanitize=thread $LDFLAGS" with_tsan="yes" -], -[ -AC_MSG_RESULT([no]) -with_tsan="no" ]) # Set info about shared libraries.