funciona funcion dev como c file-io gnu c99 buffer-overflow

funcion - ¿Por qué la función Fgets está obsoleta?



gets c file (2)

Del tutorial de programación de GNU C :

La fgets ("file get string") es similar a la función gets. Esta función está obsoleta, es decir, está obsoleta y se recomienda encarecidamente que no la use, porque es peligrosa. Es peligroso porque si los datos de entrada contienen un carácter nulo, no se puede saber. No use fgets menos que sepa que los datos no pueden contener un nulo. No lo use para leer archivos editados por el usuario porque, si el usuario inserta un carácter nulo, debe manejarlo correctamente o imprimir un mensaje de error claro. Siempre use getline o getdelim lugar de fgets si puede.

Pensé que la función fgets detiene cuando encuentra un /0 o /n ; ¿Por qué esta página de manual sugiere que un byte nulo es "peligroso" cuando los fgets deben manejar la entrada correctamente? Además, ¿cuál es la diferencia entre getline y fgets , y la función fgets realmente se considera obsoleta en el C99 o en los futuros estándares de C?


Esto es solo propaganda de GNU. En ningún sentido oficial es fgets obsoleto. sin embargo, es peligroso y obsoleto.


No, fgets no está actualmente en desuso en C99 o en el estándar actual, C11. Pero el autor de ese tutorial tiene razón en que los fgets no se detendrán cuando encuentren un NUL, y no tiene ningún mecanismo para informar su lectura de dicho personaje.

La función fgets lee a lo sumo uno menos que la cantidad de caracteres especificada por n desde la secuencia a la que apunta la stream en la matriz apuntada por s . No se leen caracteres adicionales después de un carácter de nueva línea (que se conserva) o después del final del archivo.

(§7.21.7.2)

Los getdelim y getline GNU se han estandarizado en POSIX 2008 , por lo que si se orienta a una plataforma POSIX, entonces no sería una mala idea usarlos en su lugar.

EDITAR : Pensé que no había absolutamente ninguna forma segura de usar los fgets frente a los caracteres NUL, pero R .. (ver comentarios) señaló que hay:

char buf[256]; memset(buf, ''/n'', sizeof(buf)); // fgets will never write a newline fgets(buf, sizeof(buf), fp);

Ahora busca el último carácter no /n en buf . Sin embargo, en realidad no recomendaría este kludge.