avertissement: format pas un littéral de chaîne et pas d’arguments de format

Je veux supprimer l’avertissement que je reçois sur cette ligne du code,

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

la chose est quand je fais ceci écrit sur le fichier exactement ce que je veux, mais si j’applique le format% s il n’a pas, comme ceci

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

Cet avertissement est la manière de gcc de vous dire qu’il ne peut pas vérifier l’argument de chaîne de format pour la fonction de style printf (printf, fprintf … etc). Cet avertissement est généré lorsque le compilateur ne peut pas jeter un coup d’œil dans la chaîne et s’assurer que tout ira comme prévu pendant l’exécution. Regardons quelques exemples.

Cas 1. Cette chaîne peut être vérifiée à la compilation et le compilateur l’autorise sans avertissement:

 printf("This ssortingng has no format"); 

Cas 2: Dans ce cas, le compilateur peut détecter que vous avez un spécificateur de format et déclencher un avertissement différent. Sur ma machine, il était dit “avertissement: trop peu d’arguments pour le format”.

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

Cas 3. Maintenant, c’est un peu votre cas. Vous prenez une chaîne générée à l’exécution et essayez de l’imprimer. L’avertissement que vous recevez est le compilateur vous avertissant qu’il pourrait y avoir un spécificateur de format dans la chaîne. Dites par exemple “bad% sdata”. Dans ce cas, le runtime essaiera d’accéder à un argument inexistant pour correspondre au% s. Pire encore, cela pourrait être un utilisateur qui tente d’exploiter votre programme (ce qui le ferait lire des données qui ne sont pas sûres à lire).

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

Bien qu’il soit techniquement inutile d’appeler une fonction de type printf avec une chaîne, cela rest une mauvaise pratique car la chaîne peut contenir des jetons de format comme %s . Si imp est le %s test de %s test par exemple, les choses vont mal.

Si vous voulez juste imprimer le imp sans formater, vous devez utiliser fputs(imp, fil) (notez les arguments inversés).