web-dev-qa-db-fra.com

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

Je veux supprimer l'avertissement que j'obtiens sur cette ligne du code,

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

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

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

Cet avertissement est la manière de gcc de vous dire qu'il ne peut pas vérifier l'argument de chaîne de formatage de la fonction de style printf (printf, fprintf ... etc). Cet avertissement est généré lorsque le compilateur ne peut pas lire manuellement la chaîne et s'assurer que tout se passera comme vous le souhaitez pendant l'exécution. Regardons quelques exemples.

Cas 1. Cette chaîne peut être vérifiée au moment de la compilation et le compilateur l'autorisera sans avertissement:

printf("This string has no format");

Cas 2: Dans ce cas, le compilateur peut détecter que vous avez un spécificateur de format et émettra 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 string to %s"); 

Cas 3. Maintenant, c'est un peu votre cas. Vous prenez une chaîne générée lors de l'exécution et essayez de l'imprimer. L'avertissement que vous obtenez 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 tentera d'accéder à un argument inexistant pour correspondre au% s. Pire encore, cela pourrait être un utilisateur essayant d'exploiter votre programme (l'amenant à lire des données dont la lecture n'est pas sûre).

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

Bien que techniquement il n'y ait rien de mal à appeler une fonction de type printf avec une chaîne, c'est toujours une mauvaise pratique car la chaîne peut contenir des jetons de format comme %s. Si imp est %s test Par exemple, de mauvaises choses se produiront.

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

17
terminus