¿Por qué no recibo una advertencia de “usado no inicializado” de gcc en este ejemplo trivial? [duplicate]

3 minutos de lectura

¿Por que no recibo una advertencia de usado no inicializado
Jean-François Fabre

Una vez más un estúpido error de variable no inicializada en ¿Cómo solucionar este error de segmentación en un programa inversor de secuencia?.

Así que iba a repetir el “por favor use -Wall flags”, pero cuando probé el código contra las advertencias, no encontré ninguna advertencia para mi gran sorpresa.

Así que lo reduje a esto a continuación (este código no tiene sentido para fines de ejecución, pero ilustra lo que quiero mostrar):

#include <stdio.h>

int main()
{

  int i,len=12;

  /* printf("%d\n",i); */

  while(i!=len-1)
  {

    i++;
    len--;
  }

 return 0;
 }

al compilarlo usando gcc 4.7.3 y 6.2.1 usando

gcc -Wall -Wextra -pedantic

No recibo advertencias, mientras que i descaradamente no se inicializa antes de usar en el while lazo.

Ahora si descomento el printf declaración que obtengo:

warning: 'i' is used uninitialized in this function [-Wuninitialized]

Entonces, ¿por qué se emite la advertencia al pasar i para printf pero no en el while ¿prueba?

(Es diferente a que gcc no advierta sobre una variable no inicializada porque en mi caso, no hay ramas)

(Suena como un error, pero es tan trivial que me pregunto si no me estoy perdiendo algo enorme).

  • ¿Por qué no asignar i = 0?

    – Doctor X

    28 de septiembre de 2017 a las 9:21

  • ¿Obtiene resultados diferentes si fuerza versiones específicas del estándar de idioma a través de -std=….?

    – SirDarius

    28 de septiembre de 2017 a las 9:26

  • @SirDarius no. lo mismo para c99, lo mismo para compilar con g++.

    – Jean-François Fabre

    28 de septiembre de 2017 a las 9:27

  • Comentando i++ desde while loop muestra [-Wuninitialized] advirtiendo No tengo idea de por qué.

    – svtag

    28 de septiembre de 2017 a las 9:27


  • @Sma buen punto. Ahora eso está empezando a parecer un error. Dicho esto, gcc es optimista al reportar advertencias: cuando reporta una advertencia, hay un verdadero problema. Pero puede dejar de informar algunos.

    – Jean-François Fabre

    28 de septiembre de 2017 a las 9:29

Es difícil decir que es un errorporque gcc mezcla el código para la optimización y para crear advertencias, que incluso está documentado para esta advertencia en particular:

-Wuninitialized

Advierta si se usa una variable automática sin inicializarla primero o si una variable puede ser golpeada por una llamada a setjmp.
[…]
Debido a que estas advertencias dependen de la optimización, las variables o elementos exactos para los que hay advertencias dependen de las opciones de optimización precisas y la versión de GCC utilizada.

(de documentos de GCC Opciones para solicitar o suprimir advertenciasénfasis mío)

Encontraste un caso muy tonto en mi humilde opinión aquí. Tratar -O1 y recibirás una advertencia inesperada:

warn.c: In function ‘main’:
warn.c:13:6: warning: ‘i’ may be used uninitialized in this function [-Wmaybe-uninitialized]
     i++;
      ^

Entonces, gcc ¡todavía pierde el primer uso no inicializado, pero encuentra el segundo! Tratar -O0 o -O2 y el aviso vuelve a desaparecer…

Todavía podría intentar presentar un error sobre esto. Nota clang lo hace bien:

warn.c:10:9: warning: variable 'i' is uninitialized when used here
      [-Wuninitialized]
  while(i!=len-1)
        ^
warn.c:6:8: note: initialize the variable 'i' to silence this warning
  int i,len=12;
       ^
        = 0
1 warning generated.

  • ya hay un error para esto: gcc.gnu.org/bugzilla/show_bug.cgi?id=18501

    – bolov

    28 de septiembre de 2017 a las 9:32

  • Estoy considerando seriamente abandonar gcc ahora… gracias.

    – Jean-François Fabre

    28 de septiembre de 2017 a las 9:32

  • @bolov interesante;) Pero la forma en que gcc documenta esta advertencia hace que sea muy difícil decir que de hecho es un error…

    usuario2371524

    28 de septiembre de 2017 a las 9:33

  • @bolov: de su enlace “Hola chicos, este año será el décimo aniversario de este error. ¡Deberíamos pedir un pastel!” 🙂 ahora tengo hambre. Gracias por las respuestas a todos. Parece que a los creadores de gcc no les importa demasiado UB 🙂

    – Jean-François Fabre

    28 de septiembre de 2017 a las 9:33


  • @Jean-FrançoisFabre nos perdimos la fiesta. Fue hace 3 años 🙂

    – bolov

    28 de septiembre de 2017 a las 9:34

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad