mirror of https://github.com/python/cpython
gh-96821: Add config option `--with-strict-overflow` (#96823)
Co-authored-by: C.A.M. Gerlach <CAM.Gerlach@Gerlach.CAM> Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Shantanu <hauntsaninja@gmail.com>
This commit is contained in:
parent
e4609cbe4c
commit
eff9f43924
|
@ -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:
|
||||
|
||||
|
|
|
@ -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.
|
|
@ -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
|
||||
|
|
54
configure.ac
54
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]
|
||||
|
|
Loading…
Reference in New Issue