Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

350
Vistas
¿Por qué está en desuso printf con un solo argumento (sin especificadores de conversión)?

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?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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"
over 4 years ago · Santiago Trujillo Denunciar

0

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 .

over 4 years ago · Santiago Trujillo Denunciar

0

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". )

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda