Inicializar punteros ¡SIEMPRE!

Hace poco, en los foros de SoloCodigo, apareció un mensaje comentando que el siguiente código:


#include

int main(int argc, char **argv)
{
int *a;
char caca[16];

*a=456;
printf("%d", *a);

return 0;
}

compilaba sin problemas con Dev-C++ (recordemos que usa el compilador MinGW). Pero al ejecutar, el programa cerraba por un error (aparece un mensaje de Windows indicando que el programa generó un error).

Tras ver el código se observa que el problema es que se está asignando incorrectamente un valor al puntero a, ya que no ha sido inicializado. Lo que más extraño me pareció fué que otros comentarios indicaban que Visual C++ mostraba un aviso de que se hacía uso de una variable sin inicializar, ¡pero en Dev-C++ no! Me pareció extraño pues siempre he creído que GCC (MinGW es un port a Windows de GCC) es bastante robusto como para fallar ante esta situación, así que me puse a probar:

Lo primero fué compilar utilizando -Wall para activar la mayor cantidad de avisos posibles:


$ gcc codigo.c -Wall

Pero sólo mostraba un aviso sobre la variable caca[16] (variable sin uso). Tras una lectura a las páginas man de gcc:

$ man gcc

Encontré que, la opción necesaria -Wuninitialized, si se activaba mediante -Wall pero que no tenía efecto a menos que se compilara con optimización, entonces, la compilación debía ser:

$ gcc codigo.c -Wall -O

Y ¡voilá!:

codigo.c: En la función ‘main’:
codigo.c:6: aviso: variable ‘caca’ sin uso
codigo.c:8: aviso: se utiliza ‘a’ sin inicializar en esta función

Para resumir, siempre debemos tener en cuenta que los punteros sin inicializar representan un gran riesgo en cualquier programa, por lo que debemos procurar INICIALIZAR SIEMPRE LOS PUNTEROS al declararlos, ya sea a la variable a la que apuntarán o, en su defecto, a NULL. Y, para que el compilador nos eche la mano, no olvidemos compilar siempre con -Wall y -O (claro, hablando de GCC, como indiqué antes, tal parece que este es el comportamiento por defecto de VC++, aunque yo no lo probé :P) si queremos que el compilador nos eche una manita extra :D.

Leave a Reply