python / python/cpython

`configure` mishandles the default and `--disable-*` forms of the safety options

Abierto
#156,764 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

build type-bug
Lenguaje dominante
Python
Estrellas
77.2k
Forks
35.9k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

Bug report

Bug description:
Summary

configure.ac mishandles the safety and slower-safety configure options.

  • A default configure invocation reports safety as disabled, although the safety options are intended to be enabled by default.
  • --disable-safety enables the safety options instead of disabling them.
  • --disable-slower-safety enables the slower safety options instead of disabling them.

The latter two cases are not only incorrect status messages: configure actually enters the corresponding enabled branches and probes the associated compiler options.

Reproduction

Using an out-of-tree build directory:

mkdir build
cd build
Default configuration
../configure

Observed:

checking for --enable-safety... no
checking for --enable-slower-safety... no
Disable safety
../configure --disable-safety

Observed:

checking for --enable-safety... yes
checking whether C compiler accepts -fstack-protector-strong... yes
checking whether C compiler accepts -Wtrampolines... yes
checking whether C compiler accepts -Wimplicit-fallthrough... yes
checking whether C compiler accepts -Werror=format-security... yes
checking whether C compiler accepts -Wbidi-chars=any... yes
checking whether C compiler accepts -Wall... yes
checking for --enable-slower-safety... no
Disable slower safety
../configure --disable-slower-safety

Observed:

checking for --enable-safety... no
checking for --enable-slower-safety... yes
checking whether C compiler accepts -D_FORTIFY_SOURCE=3... yes
Actual Behavior

The resulting behavior is:

Configure invocation safety slower-safety
../configure no no
../configure --disable-safety yes no
../configure --disable-slower-safety no yes

In particular, the two --disable-* forms enable the options they are intended to disable.

Expected Behavior

The expected behavior is:

Configure invocation safety slower-safety
../configure yes no
../configure --enable-safety yes no
../configure --disable-safety no no
../configure --enable-slower-safety default value for safety yes
../configure --disable-slower-safety default value for safety no

In particular:

  • safety should remain enabled by default unless explicitly disabled.
  • --disable-safety should set enable_safety=no and should not execute the safety compiler-option checks.
  • --disable-slower-safety should set enable_slower_safety=no and should not execute the slower-safety compiler-option checks.
Cause

The affected declarations are in configure.ac in the AC_ARG_ENABLE([safety], ...) and AC_ARG_ENABLE([slower-safety], ...) blocks.

Their action-if-given branches currently test variables named disable_safety and disable_slower_safety.

For an AC_ARG_ENABLE option, Autoconf represents both forms through the corresponding enable option value:

--enable-safety   -> enableval=yes
--disable-safety  -> enableval=no

Likewise for slower-safety.

The current action blocks do not use that value. Instead, because disable_safety / disable_slower_safety are not the variables carrying the Autoconf option state, the fallback branch selects the enabled state whenever either option is explicitly present.

This causes:

--disable-safety
    -> action-if-given runs
    -> disable_safety is not "yes"
    -> enable_safety=yes

and similarly:

--disable-slower-safety
    -> enable_slower_safety=yes

There is also a separate default-value issue in the safety declaration: its action-if-not-given branch currently selects enable_safety=no, despite the option being intended to be enabled by default.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-156767

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza en configure.ac, en los bloques AC_ARG_ENABLE([safety], ...) y AC_ARG_ENABLE([slower-safety], ...), y luego reproduce las tres invocaciones indicadas desde un directorio de compilación fuera del árbol de código fuente. Compara el estado generado y las comprobaciones de opciones del compilador con la tabla esperada; se considera terminado cuando las formas predeterminadas y las formas explícitas de habilitación/deshabilitación seleccionan los estados documentados sin sondeos no deseados.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
shell
Área
build-system
Tipo de issue
Error
Dificultad
2/5
Tiempo estimado
1-3 horas
Estado de actividad
Estancado
Claridad
Bien especificado
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.