[C con Clase] Función gets ()

Salvador Pozo salvador en conclase.net
Mie Abr 25 19:45:31 CEST 2007


El pasado 2007-04-25 17:22:13, Omar Murray escribió:
 
OM> Hola lista:
OM> Cuando compilo con el gcc un código que he escrito me sale el siguiente
OM> mensaje:
OM> **********************************************************************
OM> tp01_08.c:(.text+0x17c): warning: the `gets' function is dangerous and
OM> should not be used.
OM> **********************************************************************
OM> Por lo demás el código funciona bien.
OM> Mi pregunta es, porque es peligrosa esta función ? Es recomendable *no*
OM> usarla ? Alguna función que la reemplace ?
OM> La idea es que reciba una cadena de palabras con ' ' y '.' inclusive.
OM> Esto con scanf no resulta ya que de esta forma solo me toma la primer
OM> palabra ingresada hasta el espacio ' '.
OM> La idea es codificar en C, no C++.

Hola:

Efectivamente, la función "gets" se considera peligrosa y no debería usarse.

El motivo es simple. Esta función no proporciona control sobre el tamaño de la cadena leída, por lo que es posible que en una lectura se sobrepase el tamaño de la cadena que recibe el dato, y el programa se corrompa.

Por ejemplo:

int main() {
   char cad[3];

   gets(cad);
   return 0;
}

Si el usuario, consciente o inconscientemente, introduce más de 3 caracteres, la función continúa almacenando todos los caracteres sobrantes en posiciones contiguas más allá del final del bloque destinado a la cadena, con lo que se seguirá sobrescribiendo memoria utilizada por otras variables o incluso por el código del programa.

Este tipo de "agujeros" de seguridad suele ser el objetivo de hackers o crackers, que intentan colocar código ejecutable en una entrada de datos, de modo que se modifique el código original y se ejecute el suyo propio.

La solución es simple, en lugar de gets se puede usar fgets, que sí permite especificar el tamaño del array:

fgets(cad, 3, stdio);

El "inconveniente", que no es tal, es que ahora hay que especificar el fichero de entrada, en este caso el teclado o entrada estándar.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase