Mauvais
void Error(const char* format, ...)
{
char dest[1024 * 16];
va_list argptr;
va_start(argptr, format);
vsprintf(dest, format, argptr);
va_end(argptr);
printf(dest);
}
Ce code n'est pas si bon. Il utilise une taille fixe de caractères de la mémoire tampon qui peut conduire à un dépassement de la mémoire tampon d'erreur si la chaîne est pathologiquement long. L'arbitraire de grandes 1024*16
de la taille devrait être un drapeau dans votre tête. Aussi, l' printf
appel pourrait rencontrer des problèmes si dest
finit contenant des codes de mise en forme. Mieux, il s' printf("%s", dest)
. Mais encore mieux serait d'utiliser vprintf
ou vfprintf
:
Bon
void Error(const char* format, ...)
{
va_list argptr;
va_start(argptr, format);
vfprintf(stderr, format, argptr);
va_end(argptr);
}
Si vous voulez manipuler la chaîne avant de l'afficher et vraiment besoin de le stocker dans une mémoire tampon d'abord, veuillez veuillez veuillez utiliser vsnprintf
au lieu de vsprintf
. vsnprintf
permettra d'éviter un accident débordement de la mémoire tampon d'erreur.