Qu'est-ce que l'utilisation de l' %n
spécificateur de format en C? Quelqu'un pourrait-il expliquer avec un exemple?
Réponses
Trop de publicités?La plupart de ces réponses expliquer ce qu' %n
t (qui est à l'impression de rien et d'écrire le nombre de caractères imprimés jusqu'à présent à un int
variable), mais jusqu'à présent, personne n'a vraiment donné un exemple de ce que l'utilisation qu'il possède. En voici une:
int n;
printf("%s: %nFoo\n", "hello", &n);
printf("%*sBar\n", n, "");
affichera:
hello: Foo
Bar
avec Foo et Bar alignés. (Il est trivial de le faire sans l'aide d' %n
pour cet exemple particulier, et en général on a toujours pu briser cette première printf
appel:
int n = printf("%s: ", "hello");
printf("Foo\n");
printf("%*sBar\n", n, "");
Si le légèrement plus de confort vaut utiliser quelque chose d'ésotérique comme %n
(et éventuellement d'introduire des erreurs) est ouvert au débat.)
Je n'ai pas vraiment vu beaucoup de pratique du monde réel utilise de l' %n
spécificateur, mais je me souviens qu'il a été utilisé dans oldschool printf vulnérabilités avec une chaîne de format d'attaque tout à fait un tout à l'arrière.
Quelque chose qui ressemblait à ceci
void authorizeUser( char * username, char * password){
...code here setting authorized to false...
printf(username);
if ( authorized ) {
giveControl(username);
}
}
lorsqu'un utilisateur malveillant pourrait profiter de l'identifiant de paramètre passé dans printf, comme la chaîne de format et utiliser une combinaison de %d
, %c
ou w/e pour passer à travers la pile d'appel et ensuite modifier la variable autorisé à une valeur vraie.
Oui, c'est une utilisation ésotérique, mais toujours utiles à connaître lors de l'écriture d'un démon pour éviter les failles de sécurité? :D
À partir d' ici , nous voyons qu'il stocke le nombre de caractères imprimés jusqu'à présent.
n
L'argument est un pointeur vers un entier, dans lequel est écrit le nombre d'octets écrits à la sortie jusqu'à présent par le présent appel à un de lafprintf()
fonctions. Aucun argument n'est converti.
Un exemple d'utilisation serait:
int n_chars = 0;
printf("Hello, World%n", &n_chars);
n_chars
aurait alors une valeur de 12
.