Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: skan en 14 Agosto 2013, 01:33 am



Título: Seguimos necesitando fgets por seguridad?
Publicado por: skan en 14 Agosto 2013, 01:33 am
Hola

Hace un tiempo leí  Effective C++, donde se aconseja el uso de fgets() (y strncat) en vez de get() porque se puede especificar el número de caracteres a leer y así no se produce un desbordamiento de memoria.

Varios libros nuevos, como el de Prata o Professional C++ no hablan de fgets.
¿Se debe a que ya no hace falta?
Lo digo porque comandos como cin.get()  y cin.getline() pueden especificar el tamaño a leer.
¿Qué diferencia hay entre cin.get() y fgets()?


Título: Re: Seguimos necesitando fgets por seguridad?
Publicado por: amchacon en 14 Agosto 2013, 01:50 am
En C++ ya no hace falta, menos cuando existe la clase string, cuyo tamaño puede modificarse sobre la marcha:

Código
  1. string Texto;
  2. getline(cin,Texto); // Puedes leer infinitos caracteres


Título: Re: Seguimos necesitando fgets por seguridad?
Publicado por: skan en 14 Agosto 2013, 02:57 am
En C++ ya no hace falta, menos cuando existe la clase string, cuyo tamaño puede modificarse sobre la marcha:

Código
  1. string Texto;
  2. getline(cin,Texto); // Puedes leer infinitos caracteres

¿Y qué pasa si cin no cabe en memoria?


Título: Re: Seguimos necesitando fgets por seguridad?
Publicado por: amchacon en 14 Agosto 2013, 08:48 am
string es una clase que se ajusta solo, de modo que si metes 100 caracteres se reservaran 100 caracteres.

Dado que cada caracter ocupa 1 byte, es muy díficil que tengas problemas de memoria (cuantos caracteres vas a meter? 1000000000?). Pero si así fuera lanzaría una excepcion (bad_alloc) que podrías manejar con un try y catch (o no la manejas, y entonces el programa finalizaría mostrando un mensaje de error).


Título: Re: Seguimos necesitando fgets por seguridad?
Publicado por: skan en 14 Agosto 2013, 14:21 pm
OK, gracias.  Lo que no entiendo es porque algunas cosas devuelven punteros (como los nombres de los array) y otras no (como los string)


Título: Re: Seguimos necesitando fgets por seguridad?
Publicado por: 0xDani en 14 Agosto 2013, 18:05 pm
OK, gracias.  Lo que no entiendo es porque algunas cosas devuelven punteros (como los nombres de los array) y otras no (como los string)


Por que string es una clase built-in de la STL, que internamente también maneja un array de caracteres. Puedes acceder a ese array por medio de la función c_str() de la clase string.

Saludos.