2017-05-08 2 views
0

Je code suivant:C - chaîne de format non constant drapeau

if (my_condition_is_true){ 
    my_format_string = "Something %d, plus some_other_thing %lu" 
} 
else{ 
    my_format_string = "Something %d, plus some_other_thing %llu" 
} 

my_string_formatter(my_format_string, var1, var2) 

Cela pose problème de chaîne de format non constante. J'ai essayé suivante,

my_string_formatter("%s" my_format_string, var1, var2) 

Mais, ce doesnot aider

Les gens idée ....

+3

Qu'est-ce que 'my_string_formatter'? – StoryTeller

+6

comment est var2 à la fois un non signé long et un non signé long long? pas sûr que vous aurez une réponse sans [mcve] –

+0

C'est juste un avertissement. Quand vous savez ce que vous faites, ignorer l'avertissement peut être votre meilleure option (vous pouvez être capable de le désactiver complètement). – pmg

Répondre

0

vous passez une chaîne 'format' non constant:

"Something %d, plus some_other_thing %lu" 

De here:

Passer une chaîne 'format' non constante à une fonction printf peut conduire à une discordance entre le nombre d'arguments définis par le 'format' et le nombre d'arguments effectivement passés à la fonction. Si la chaîne de format provient finalement d'une source non fiable, cette peut être utilisée pour les exploits.

Ceci est un avertissement concernant la sécurité.

+0

Merci pour le lien, j'ai déjà regardé sur ce site. Mon problème est de savoir comment contourner le problème. – Emdadul

+0

@Emdadul il serait utile d'inclure cette information dans votre question, pour ceux qui ne sont pas familiers avec ce drapeau gcc –

0

Il est un avertissement parce

char* someString = someFunc(); 
printf(someString); 

est une erreur commune surtout chez les débutants. Si la chaîne contient un spécificateur de format ou même des signes de pourcentage non échappés, c'est un bug assez mauvais. Si vous avez de la chance, c'est une faute de segmentation, sinon, c'est un trou de sécurité.

Si vous savez vraiment ce que vous faites, vous pouvez désactiver l'avertissement. (NB mon compilateur (clang) ne soulève pas cet avertissement même avec -Wall que j'ai trouvé quelque peu surprenant). Cette réponse pourrait aider

https://stackoverflow.com/a/12171222/169346

vous ajoutez un attribut à votre fonction my_string_formatter qui indique au compilateur que la première chaîne est une chaîne de format. L'attribut est probablement non portable entre les compilateurs. Cependant, vos deux chaînes de format ont des types différents pour le second paramètre (l'une est unsigned long et l'autre est unsigned long long) mais vous transmettez les mêmes deux paramètres dans l'appel, quelle que soit la chaîne de format utilisée. Ceci est un bug et vous ne partez que parce que long et long long ont la même taille sur votre implémentation (je suppose).