[Python-checkins] gh-96821: Add config option `--with-strict-overflow` (#96823)

hauntsaninja webhook-mailer at python.org
Sat Mar 4 16:39:59 EST 2023


https://github.com/python/cpython/commit/eff9f43924fc836970b2378d58523388d9246194
commit: eff9f43924fc836970b2378d58523388d9246194
branch: main
author: Matthias Görgens <matthias.goergens at gmail.com>
committer: hauntsaninja <12621235+hauntsaninja at users.noreply.github.com>
date: 2023-03-04T13:39:52-08:00
summary:

gh-96821: Add config option `--with-strict-overflow` (#96823)

Co-authored-by: C.A.M. Gerlach <CAM.Gerlach at Gerlach.CAM>
Co-authored-by: Erlend E. Aasland <erlend.aasland at protonmail.com>
Co-authored-by: Adam Turner <9087854+AA-Turner at users.noreply.github.com>
Co-authored-by: Shantanu <hauntsaninja at gmail.com>

files:
A Misc/NEWS.d/next/Build/2022-09-14-10-38-15.gh-issue-96821.Zk2a9c.rst
M Doc/using/configure.rst
M configure
M configure.ac

diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst
index 8fa8d250d533..8936bd381c9d 100644
--- a/Doc/using/configure.rst
+++ b/Doc/using/configure.rst
@@ -326,6 +326,11 @@ also be used to improve performance.
 
    Enable C-level code profiling with ``gprof`` (disabled by default).
 
+.. cmdoption:: --with-strict-overflow
+
+   Add ``-fstrict-overflow`` to the C compiler flags (by default we add
+   ``-fno-strict-overflow`` instead).
+
 
 .. _debug-build:
 
diff --git a/Misc/NEWS.d/next/Build/2022-09-14-10-38-15.gh-issue-96821.Zk2a9c.rst b/Misc/NEWS.d/next/Build/2022-09-14-10-38-15.gh-issue-96821.Zk2a9c.rst
new file mode 100644
index 000000000000..865cfde8b063
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2022-09-14-10-38-15.gh-issue-96821.Zk2a9c.rst
@@ -0,0 +1,3 @@
+Explicitly mark C extension modules that need defined signed integer overflow,
+and add a configure option :option:`--with-strict-overflow`.
+Patch by Matthias Görgens and Shantanu Jain.
diff --git a/configure b/configure
index 557519ad86e0..9e99352f589f 100755
--- a/configure
+++ b/configure
@@ -1054,6 +1054,7 @@ with_assertions
 enable_optimizations
 with_lto
 enable_bolt
+with_strict_overflow
 with_dsymutil
 with_address_sanitizer
 with_memory_sanitizer
@@ -1825,6 +1826,8 @@ Optional Packages:
   --with-lto=[full|thin|no|yes]
                           enable Link-Time-Optimization in any build (default
                           is no)
+  --with-strict-overflow  if 'yes', add -fstrict-overflow to CFLAGS, else add
+                          -fno-strict-overflow (default is no)
   --with-dsymutil         link debug information into final executable with
                           dsymutil in macOS (default is no)
   --with-address-sanitizer
@@ -8376,6 +8379,64 @@ case $CC in
         fi
 esac
 
+save_CFLAGS=$CFLAGS
+CFLAGS="-fstrict-overflow -fno-strict-overflow"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports -fstrict-overflow and -fno-strict-overflow" >&5
+$as_echo_n "checking if $CC supports -fstrict-overflow and -fno-strict-overflow... " >&6; }
+if ${ac_cv_cc_supports_fstrict_overflow+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_cc_supports_fstrict_overflow=yes
+else
+  ac_cv_cc_supports_fstrict_overflow=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_supports_fstrict_overflow" >&5
+$as_echo "$ac_cv_cc_supports_fstrict_overflow" >&6; }
+CFLAGS=$save_CFLAGS
+
+if test "x$ac_cv_cc_supports_fstrict_overflow" = xyes; then :
+  STRICT_OVERFLOW_CFLAGS="-fstrict-overflow"
+           NO_STRICT_OVERFLOW_CFLAGS="-fno-strict-overflow"
+else
+  STRICT_OVERFLOW_CFLAGS=""
+           NO_STRICT_OVERFLOW_CFLAGS=""
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-strict-overflow" >&5
+$as_echo_n "checking for --with-strict-overflow... " >&6; }
+
+# Check whether --with-strict-overflow was given.
+if test "${with_strict_overflow+set}" = set; then :
+  withval=$with_strict_overflow;
+    if test "x$ac_cv_cc_supports_fstrict_overflow" = xno; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-strict-overflow=yes requires a compiler that supports -fstrict-overflow" >&5
+$as_echo "$as_me: WARNING: --with-strict-overflow=yes requires a compiler that supports -fstrict-overflow" >&2;}
+fi
+
+else
+  with_strict_overflow=no
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_strict_overflow" >&5
+$as_echo "$with_strict_overflow" >&6; }
+
 # Check if CC supports -Og optimization level
 save_CFLAGS=$CFLAGS
 CFLAGS="-Og"
@@ -8428,15 +8489,8 @@ if test "${OPT-unset}" = "unset"
 then
     case $GCC in
     yes)
-        # For gcc 4.x we need to use -fwrapv so lets check if its supported
-        if "$CC" -v --help 2>/dev/null |grep -- -fwrapv > /dev/null; then
-           WRAP="-fwrapv"
-        fi
-
         if test -n "${cc_is_clang}"
         then
-            # Clang also needs -fwrapv
-            WRAP="-fwrapv"
             # bpo-30104: disable strict aliasing to compile correctly dtoa.c,
             # see Makefile.pre.in for more information
             CFLAGS_ALIASING="-fno-strict-aliasing"
@@ -8447,7 +8501,7 @@ then
 	    if test "$Py_DEBUG" = 'true' ; then
 		OPT="-g $PYDEBUG_CFLAGS -Wall"
 	    else
-		OPT="-g $WRAP -O3 -Wall"
+		OPT="-g -O3 -Wall"
 	    fi
 	    ;;
 	*)
@@ -8580,6 +8634,12 @@ UNIVERSAL_ARCH_FLAGS=
 
 
 # tweak BASECFLAGS based on compiler and platform
+if test "x$with_strict_overflow" = xyes; then :
+  BASECFLAGS="$BASECFLAGS $STRICT_OVERFLOW_CFLAGS"
+else
+  BASECFLAGS="$BASECFLAGS $NO_STRICT_OVERFLOW_CFLAGS"
+fi
+
 case $GCC in
 yes)
     CFLAGS_NODIST="$CFLAGS_NODIST -std=c11"
@@ -27049,7 +27109,7 @@ fi
   as_fn_append MODULE_BLOCK "MODULE__CTYPES_STATE=$py_cv_module__ctypes$as_nl"
   if test "x$py_cv_module__ctypes" = xyes; then :
 
-    as_fn_append MODULE_BLOCK "MODULE__CTYPES_CFLAGS=$LIBFFI_CFLAGS$as_nl"
+    as_fn_append MODULE_BLOCK "MODULE__CTYPES_CFLAGS=$NO_STRICT_OVERFLOW_CFLAGS $LIBFFI_CFLAGS$as_nl"
     as_fn_append MODULE_BLOCK "MODULE__CTYPES_LDFLAGS=$LIBFFI_LIBS$as_nl"
 
 fi
diff --git a/configure.ac b/configure.ac
index 982f669acbcf..31b7a2157a2b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2073,6 +2073,45 @@ case $CC in
         fi
 esac
 
+dnl Historically, some of our code assumed that signed integer overflow
+dnl is defined behaviour via twos-complement.
+dnl Set STRICT_OVERFLOW_CFLAGS and NO_STRICT_OVERFLOW_CFLAGS depending on compiler support.
+dnl Pass the latter to modules that depend on such behaviour.
+_SAVE_VAR([CFLAGS])
+CFLAGS="-fstrict-overflow -fno-strict-overflow"
+AC_CACHE_CHECK([if $CC supports -fstrict-overflow and -fno-strict-overflow],
+               [ac_cv_cc_supports_fstrict_overflow],
+  AC_COMPILE_IFELSE(
+    [AC_LANG_PROGRAM([[]], [[]])],
+    [ac_cv_cc_supports_fstrict_overflow=yes],
+    [ac_cv_cc_supports_fstrict_overflow=no]
+  )
+)
+_RESTORE_VAR([CFLAGS])
+
+AS_VAR_IF([ac_cv_cc_supports_fstrict_overflow], [yes],
+          [STRICT_OVERFLOW_CFLAGS="-fstrict-overflow"
+           NO_STRICT_OVERFLOW_CFLAGS="-fno-strict-overflow"],
+          [STRICT_OVERFLOW_CFLAGS=""
+           NO_STRICT_OVERFLOW_CFLAGS=""])
+
+AC_MSG_CHECKING([for --with-strict-overflow])
+AC_ARG_WITH([strict-overflow],
+  AS_HELP_STRING(
+    [--with-strict-overflow],
+    [if 'yes', add -fstrict-overflow to CFLAGS, else add -fno-strict-overflow (default is no)]
+  ),
+  [
+    AS_VAR_IF(
+      [ac_cv_cc_supports_fstrict_overflow], [no],
+      [AC_MSG_WARN([--with-strict-overflow=yes requires a compiler that supports -fstrict-overflow])],
+      []
+    )
+  ],
+  [with_strict_overflow=no]
+)
+AC_MSG_RESULT([$with_strict_overflow])
+
 # Check if CC supports -Og optimization level
 _SAVE_VAR([CFLAGS])
 CFLAGS="-Og"
@@ -2103,15 +2142,8 @@ if test "${OPT-unset}" = "unset"
 then
     case $GCC in
     yes)
-        # For gcc 4.x we need to use -fwrapv so lets check if its supported
-        if "$CC" -v --help 2>/dev/null |grep -- -fwrapv > /dev/null; then
-           WRAP="-fwrapv"
-        fi
-
         if test -n "${cc_is_clang}"
         then
-            # Clang also needs -fwrapv
-            WRAP="-fwrapv"
             # bpo-30104: disable strict aliasing to compile correctly dtoa.c,
             # see Makefile.pre.in for more information
             CFLAGS_ALIASING="-fno-strict-aliasing"
@@ -2122,7 +2154,7 @@ then
 	    if test "$Py_DEBUG" = 'true' ; then
 		OPT="-g $PYDEBUG_CFLAGS -Wall"
 	    else
-		OPT="-g $WRAP -O3 -Wall"
+		OPT="-g -O3 -Wall"
 	    fi
 	    ;;
 	*)
@@ -2237,6 +2269,10 @@ AC_DEFUN([PY_CHECK_CC_WARNING], [
 ])
 
 # tweak BASECFLAGS based on compiler and platform
+AS_VAR_IF([with_strict_overflow], [yes],
+          [BASECFLAGS="$BASECFLAGS $STRICT_OVERFLOW_CFLAGS"],
+          [BASECFLAGS="$BASECFLAGS $NO_STRICT_OVERFLOW_CFLAGS"])
+
 case $GCC in
 yes)
     CFLAGS_NODIST="$CFLAGS_NODIST -std=c11"
@@ -7213,7 +7249,7 @@ PY_STDLIB_MOD([_crypt],
   [$LIBCRYPT_CFLAGS], [$LIBCRYPT_LIBS])
 PY_STDLIB_MOD([_ctypes],
   [], [test "$have_libffi" = yes],
-  [$LIBFFI_CFLAGS], [$LIBFFI_LIBS])
+  [$NO_STRICT_OVERFLOW_CFLAGS $LIBFFI_CFLAGS], [$LIBFFI_LIBS])
 PY_STDLIB_MOD([_curses],
   [], [test "$have_curses" != "no"],
   [$CURSES_CFLAGS], [$CURSES_LIBS]



More information about the Python-checkins mailing list