Cela ne provoque pas un avertissement de gcc, même avec -Wall -Wextra -pedantic
:
#include "stdio.h"
int main (void) {
char xx[1000] = "hello";
sprintf (xx, "xyzzy plugh %s", xx);
printf ("%s\n", xx);
return 0;
}
Cependant, la raison pour laquelle cela est considéré comme une mauvaise idée peut être vu de la sortie. Plutôt que d'obtenir:
xyzzy plugh hello
comme une personne normale peut attendre, vous obtenez en fait:
xyzzy plugh xyzzy plugh
mais, comme tout comportement non défini, votre kilométrage peut varier.
La référence définitive est la norme C99, section 7.19.6.6 The sprintf function
, qui stipule que:
La fonction sprintf est équivalente à fprintf, sauf que la sortie est écrite dans un tableau (spécifié par l'argument s) plutôt que à un flux. Un caractère nul est écrit à la fin des caractères écrits; il n'est pas compté comme faisant partie de la valeur retournée. Si la copie a lieu entre des objets qui se chevauchent, le comportement n'est pas défini.
La norme C++ (bien, en fait le projet de C++ 0x , mais il est sûrement en raison d'un jour à, je l'espère - Vas-y les gars, faites-le sur là) références ce car il intègre des pièces de la norme C comme fonctionnalité obsolète.
+1 pour la réponse. +2 pour être psychique. –