Domanda

di MSVC funcions sprintf "sicuro" hanno una versione modello che 'sa' la dimensione del buffer di destinazione. Tuttavia, questo codice dipinge felicemente 567890 la risma dopo la fine della bytes ...

char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );

Qualche idea di cosa ho fatto di sbagliato, o si tratta di un bug noto?

(sto lavorando in VS2005 - non prova nel 2008 o 2010)

È stato utile?

Soluzione

E 'sembra essere un bug in Visual C ++ 2005 (sto avendo difficoltà a raggiungere quel collegamento; Google ha anche inserito nella cache ).

sono stato in grado di riprodurre il problema in Visual C ++ 2005. In Visual C ++ 2008 e il 2010, la stringa viene troncata in modo corretto (bytes contiene 1234\0) e -1 viene restituito come previsto.

Altri suggerimenti

L'esempio è effettivamente corretta. A partire dalla versione -

Microsoft Visual Studio 2005
Version 8.0.50727.867 (vsvista.050727-8600)
...
Visual C++ 77626-009-0000007-41722

- che include SP1, l'aggiornamento rapido Vista e alcuni degli aggiornamenti rapidi biblioteca - la sopra citata funzione

template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
      argument] ... 
);

ancora è bacato. Tuttavia, ciò che è veramente affascinante è che solo questa funzione delle 4 funzioni variante

  • 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 (versione carattere di larghezza)
  • OK: template <size_t size> int _snwprintf_s (sì, la versione di caratteri estesi è OK)

è buggy, è che se i propri utilizzando la versione non-modello è ok, e se uno di utilizzando uno dei personaggi versioni larghe è ok troppo. Incredibile.

Esempio era sbagliato.

Il codice dovrebbe essere:

char bytes[5];
_snprintf_s( bytes, 5, _TRUNCATE, "%s", "1234567890" );

Per il codice errato, è possibile un errore che il compilatore non ha dato alcun avvertimento, ma sarebbe il controllo debole snprintf.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top