2010-12-11 11 views
37

Quiero quitar la advertencia de que me sale en esta línea del código,: peligroso formato de una cadena literal y no hay argumentos formato

FILE *fil; 
char *imp; 
(...) 
fprintf(fil,imp); 

la cosa es que cuando hago esto se escribe en el archivo exactamente lo que quiero, pero si me aplico el% s formato no es así, como este

fprintf(fil, "%s", imp); 
+0

¿Qué significa 'imp' contener? – casablanca

+1

¿Qué sucede si sustituyes el fprintf por 'fputs (imp, fil);'? – pmg

+0

una cadena, supongamos algo como esto imp = "prueba"; – Unzi

Respuesta

43

Esta advertencia es la forma en que gcc le dice que no puede verificar el argumento de cadena de formato para la función de estilo printf (printf, fprintf ... etc.). Esta advertencia se genera cuando el compilador no puede echar un vistazo a la cadena manualmente y asegurarse de que todo transcurrirá según lo previsto durante el tiempo de ejecución. Veamos un par de ejemplos.

Caso 1. Esta cadena puede ser verificada en tiempo de compilación y el compilador lo permitirá sin previo aviso:

printf("This string has no format"); 

Caso 2: Para este caso, el compilador puede detectar que usted tiene una especificador de formato y mostrará una advertencia diferente. En mi máquina decía "advertencia: muy pocos argumentos para el formato".

// This will most probably crash your machine 
printf("Not a safe string to %s"); 

Caso 3. Ahora bien, esto es algo su caso. Está tomando una cadena generada en tiempo de ejecución e intentando imprimirla. La advertencia que está recibiendo es el compilador advirtiéndole que podría haber un especificador de formato en la cadena. Digamos por ejemplo "bad% sdata". En este caso, el tiempo de ejecución intentará acceder a un argumento inexistente para que coincida con% s. Peor aún, podría tratarse de un usuario que intenta explotar su programa (haciendo que lea datos que no son seguros de leer).

char str[200]; 
scanf("%s", str) 
printf(str) 
+0

Llamar a una función que espera un 'const char *' y darle un 'char *' no causaría una advertencia, IMHO – terminus

+0

No estaba sugiriendo que la cadena se lance a const. Mencioné que el segundo argumento debe especificarse para corregir la advertencia. –

+0

¿Qué quiere decir con tener que "especificar un argumento"? – UncleBens

14

aunque técnicamente no hay nada de malo en llamar a una función printf-como con una cadena, todavía es una mala práctica porque la cadena puede contener tokens de formato como %s. Si imp es %s test por ejemplo, sucederán cosas malas.

Si solo desea imprimir el imp sin formatear, debe usar fputs(imp, fil) (tenga en cuenta los argumentos revertidos).

+8

Peor aún: si el usuario puede especificar la cadena imp, puede usar el token de formato% n para sobrescribir la memoria. Esto se conoce como ataque de cadena de formato y se puede usar para ejecutar código inyectado. – ollb

+3

fputs hace el truco para escribir una cadena sin formato. –

+0

¿Qué quiere decir con "formato sans%"? – TheRookierLearner

Cuestiones relacionadas