Faux sentiment de sécurité avec `snprintf_s`
-
02-10-2019 - |
Question
sprintf
« sûrs » de MSVC funcions ont une version de modèle qui « connaît » la taille du tampon cible. Cependant, ce code peint heureusement 567890 la pile après la fin de bytes
...
char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );
Toute idée ce que je fais mal, ou est-ce un bug connu?
(je travaille dans VS2005 - n'a pas testé en 2008 ou 2010)
La solution
Il ne semble être un bogue dans Visual C ++ 2005 (je vais avoir du mal à obtenir à ce lien, Google a également mis en mémoire cache ).
j'ai pu reproduire le problème dans Visual C ++ 2005. Dans Visual C ++ 2008 et 2010, la chaîne est tronquée correctement (bytes
contient 1234\0
) et -1
est retourné comme prévu.
Autres conseils
L'exemple est en effet correct. De la version -
Microsoft Visual Studio 2005
Version 8.0.50727.867 (vsvista.050727-8600)
...
Visual C++ 77626-009-0000007-41722
- qui inclut le Service Pack 1, le correctif Vista et quelques correctifs bibliothèque - la fonction ci-dessus mentionné
template <size_t size>
int _snprintf_s(
char (&buffer)[size],
size_t count,
const char *format [,
argument] ...
);
toujours est buggy. Cependant, ce qui est vraiment fascinant est que que cette fonction des 4 fonctions variantes
- OK:
int _snprintf_s(char *buffer, size_t sizeOfBuffer, size_t count, :::
- Buggy:
template <size_t size> int _snprintf_s(char (&buffer)[size], size_t count, :::
- OK:
int _snwprintf_s
(version large de caractères) - OK:
template <size_t size> int _snwprintf_s
(oui, la version large de caractères est OK)
est bogué, qui est si l'on se sert de la version non-modèle, il est OK, et si l'on se sert de l'une des grandes versions de caractères, il est OK aussi. Incroyable.
Exemple était erroné.
Le code doit être:
char bytes[5];
_snprintf_s( bytes, 5, _TRUNCATE, "%s", "1234567890" );
Pour le mauvais code, il peut un bug que le compilateur n'a pas donné aucun avertissement, mais ce serait la vérification faible pour snprintf.