diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 4f27a23b1a62b1d..3744d6279e7b464 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -11,6 +11,7 @@ import _opcode import os import re +import shlex import stat import sys import sysconfig @@ -469,27 +470,39 @@ def check_sanitizer(*, address=False, hwaddress=False, memory=False, ub=False, cflags = sysconfig.get_config_var('CFLAGS') or '' - config_args = sysconfig.get_config_var('CONFIG_ARGS') or '' + config_args = shlex.split(sysconfig.get_config_var('CONFIG_ARGS') or '') + + def configured_with_sanitizer(name): + with_option = f'--with-{name}-sanitizer' + without_option = f'--without-{name}-sanitizer' + enabled = False + for arg in config_args: + if arg == without_option or arg == f'{with_option}=no': + enabled = False + elif arg == with_option or arg.startswith(f'{with_option}='): + enabled = True + return enabled + memory_sanitizer = ( '-fsanitize=memory' in cflags or - '--with-memory-sanitizer' in config_args + configured_with_sanitizer('memory') ) hwaddress_sanitizer = ( '-fsanitize=hwaddress' in cflags or - '--with-hwaddress-sanitizer' in config_args + configured_with_sanitizer('hwaddress') ) address_sanitizer = ( '-fsanitize=address' in cflags or - '--with-address-sanitizer' in config_args or + configured_with_sanitizer('address') or hwaddress_sanitizer ) ub_sanitizer = ( '-fsanitize=undefined' in cflags or - '--with-undefined-behavior-sanitizer' in config_args + configured_with_sanitizer('undefined-behavior') ) thread_sanitizer = ( '-fsanitize=thread' in cflags or - '--with-thread-sanitizer' in config_args + configured_with_sanitizer('thread') ) function_sanitizer = ( '-fsanitize=function' in cflags 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..5bc35aaf9870c2a --- /dev/null +++ b/Misc/NEWS.d/next/Build/2026-09-12-15-33-26.gh-issue-157354.2hw6fe.rst @@ -0,0 +1,2 @@ +Fix the :samp:`--with-{name}-sanitizer=no` and :samp:`--without-{name}-sanitizer` +:program:`configure` options enabling the sanitizer instead of disabling it. diff --git a/configure b/configure index efd9d7ace16713d..dd89018c35cf508 100755 --- a/configure +++ b/configure @@ -14412,8 +14412,18 @@ 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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program links with -fsanitize=address" >&5 @@ -14441,14 +14451,10 @@ esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - -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-hwaddress-sanitizer" >&5 printf %s "checking for --with-hwaddress-sanitizer... " >&6; } @@ -14456,8 +14462,18 @@ printf %s "checking for --with-hwaddress-sanitizer... " >&6; } if test ${with_hwaddress_sanitizer+y} then : withval=$with_hwaddress_sanitizer; -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 -printf "%s\n" "$withval" >&6; } +else case e in #( + e) with_hwaddress_sanitizer=no ;; +esac +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_hwaddress_sanitizer" >&5 +printf "%s\n" "$with_hwaddress_sanitizer" >&6; } +if test "x$with_hwaddress_sanitizer" = xno +then : + +else case e in #( + e) hwasan_flags="-fsanitize=hwaddress" # x86-64 lacks address tagging, so HWASan needs the page aliasing mode there. # See gh-156049 and @@ -14496,14 +14512,10 @@ esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - -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; } @@ -14511,8 +14523,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) BASECFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer $BASECFLAGS" LDFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 $LDFLAGS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program links with -fsanitize=memory" >&5 @@ -14540,14 +14562,10 @@ esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - -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; } @@ -14555,8 +14573,20 @@ 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; } +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) BASECFLAGS="-fsanitize=undefined $BASECFLAGS" LDFLAGS="-fsanitize=undefined $LDFLAGS" with_ubsan="yes" @@ -14585,17 +14615,10 @@ esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - -else case e in #( - e) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -with_ubsan="no" ;; esac fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --with-thread-sanitizer" >&5 printf %s "checking for --with-thread-sanitizer... " >&6; } @@ -14603,8 +14626,20 @@ 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; } +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) BASECFLAGS="-fsanitize=thread $BASECFLAGS" LDFLAGS="-fsanitize=thread $LDFLAGS" with_tsan="yes" @@ -14633,17 +14668,10 @@ esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - -else case e in #( - e) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -with_tsan="no" ;; esac fi - # Set info about shared libraries. diff --git a/configure.ac b/configure.ac index 7faf0c8a4ae662f..ff4ce0b0a7123cd 100644 --- a/configure.ac +++ b/configure.ac @@ -3746,8 +3746,9 @@ 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" AC_MSG_CHECKING([whether a program links with -fsanitize=address]) @@ -3755,8 +3756,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot link with -fsanitize=address: the compiler does not support AddressSanitizer or its runtime library is not installed; see config.log])]) -], -[AC_MSG_RESULT([no])]) +]) AC_MSG_CHECKING([for --with-hwaddress-sanitizer]) AC_ARG_WITH( @@ -3765,8 +3765,9 @@ AC_ARG_WITH( [--with-hwaddress-sanitizer], [enable HWAddressSanitizer memory error detector, 'hwasan' (default is no)] )], -[ -AC_MSG_RESULT([$withval]) +[], [with_hwaddress_sanitizer=no]) +AC_MSG_RESULT([$with_hwaddress_sanitizer]) +AS_VAR_IF([with_hwaddress_sanitizer], [no], [], [ hwasan_flags="-fsanitize=hwaddress" # x86-64 lacks address tagging, so HWASan needs the page aliasing mode there. # See gh-156049 and @@ -3781,8 +3782,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot link with $hwasan_flags: the compiler does not support HWAddressSanitizer or its runtime library is not installed; see config.log])]) -], -[AC_MSG_RESULT([no])]) +]) AC_MSG_CHECKING([for --with-memory-sanitizer]) AC_ARG_WITH( @@ -3791,8 +3791,9 @@ 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], [], [ BASECFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer $BASECFLAGS" LDFLAGS="-fsanitize=memory -fsanitize-memory-track-origins=2 $LDFLAGS" AC_MSG_CHECKING([whether a program links with -fsanitize=memory]) @@ -3800,8 +3801,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot link with -fsanitize=memory: the compiler does not support MemorySanitizer or its runtime library is not installed; see config.log])]) -], -[AC_MSG_RESULT([no])]) +]) AC_MSG_CHECKING([for --with-undefined-behavior-sanitizer]) AC_ARG_WITH( @@ -3810,8 +3810,11 @@ 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" @@ -3820,10 +3823,6 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot link with -fsanitize=undefined: the compiler does not support UndefinedBehaviorSanitizer or its runtime library is not installed; see config.log])]) -], -[ -AC_MSG_RESULT([no]) -with_ubsan="no" ]) AC_MSG_CHECKING([for --with-thread-sanitizer]) @@ -3833,8 +3832,11 @@ 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" @@ -3843,10 +3845,6 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot link with -fsanitize=thread: the compiler does not support ThreadSanitizer or its runtime library is not installed; see config.log])]) -], -[ -AC_MSG_RESULT([no]) -with_tsan="no" ]) # Set info about shared libraries.