advertencia: formato no es un literal de cadena ni argumentos de formato

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