Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

348
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!