Test Foro de elhacker.net SMF 2.1

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 (cpp) [Seleccionar]
string Texto;
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
Cita de: 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 (cpp) [Seleccionar]
string Texto;
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
Cita de: 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)


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.