Quiero eliminar la advertencia que recibo en esta línea del código,
FILE *fil; char *imp; (...) fprintf(fil,imp);
el caso es que cuando hago esto, escribo en el archivo exactamente lo que quiero, pero si aplico el formato% s no lo hago, como este
fprintf(fil, "%s", imp);
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 comstackdor 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 se puede verificar en tiempo de comstackción y el comstackdor lo permitirá sin previo aviso:
printf("This string has no format");
Caso 2: en este caso, el comstackdor puede detectar que tiene un especificador de formato y emitirá 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 este es un tanto tu caso. Está tomando una cadena generada en tiempo de ejecución e intentando imprimirla. La advertencia que está recibiendo es el comstackdor 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 progtwig (haciendo que lea datos que no son seguros de leer).
char str[200]; scanf("%s", str) printf(str)
Aunque técnicamente no hay nada de malo en llamar a una función tipo printf con una cadena, sigue siendo 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 invertidos).