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)

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top