En un libro que estoy leyendo, está escrito que printf con un solo argumento (sin especificadores de conversión) está en desuso. Se recomienda sustituir
printf("Hello World!");con
puts("Hello World!");o
printf("%s", "Hello World!"); ¿Alguien puede decirme por qué? printf("Hello World!"); ¿Está Mal? Está escrito en el libro que contiene vulnerabilidades. ¿Cuáles son estas vulnerabilidades?
printf("Hello World!"); en mi humilde opinión no es vulnerable, pero considere esto:
const char *str; ... printf(str); Si sucede que str apunta a una cadena que contiene %s especificadores de formato, su programa exhibirá un comportamiento indefinido (principalmente un bloqueo), mientras que puts(str) simplemente mostrará la cadena tal como está.
Ejemplo:
printf("%s"); //undefined behaviour (mostly crash) puts("%s"); // displays "%s\n"printf("Hello world");
está bien y no tiene ninguna vulnerabilidad de seguridad.
El problema radica en:
printf(p); donde p es un puntero a una entrada controlada por el usuario. Es propenso a ataques de cadenas de formato : el usuario puede insertar especificaciones de conversión para tomar el control del programa, por ejemplo, %x para volcar la memoria o %n para sobrescribir la memoria.
Tenga en cuenta que puts("Hello world") no es equivalente en comportamiento a printf("Hello world") sino a printf("Hello world\n") . Los compiladores generalmente son lo suficientemente inteligentes como para optimizar la última llamada para reemplazarla con puts .
Además de las otras respuestas, printf("Hello world! I am 50% happy today") es un error fácil de hacer, que puede causar todo tipo de problemas de memoria desagradables (¡es UB!).
Es simplemente más simple, más fácil y más robusto "requerir" que los programadores sean absolutamente claros cuando quieren una cadena palabra por palabra y nada más .
Y eso es lo que printf("%s", "Hello world! I am 50% happy today") . Es completamente infalible.
(Steve, por supuesto, printf("He has %d cherries\n", ncherries) no es en absoluto lo mismo; en este caso, el programador no tiene la mentalidad de "cadena textual"; ella tiene la mentalidad de "cadena de formato". )