Il seguente codice causa un errore e uccide la mia applicazione. Ha senso poiché il buffer ha una lunghezza di soli 10 byte e il testo è lungo 22 byte (buffer overflow).sprintf_s con un buffer troppo piccolo
char buffer[10];
int length = sprintf_s(buffer, 10, "1234567890.1234567890.");
Come faccio a prendere questo errore in modo da poter segnalare invece di schiantarsi la mia domanda?
Edit:
Dopo aver letto le commenti qui sotto sono andato con _snprintf_s. Se restituisce un valore -1, il buffer non è stato aggiornato.
length = _snprintf_s(buffer, 10, 9, "123456789");
printf("1) Length=%d\n", length); // Length == 9
length = _snprintf_s(buffer, 10, 9, "1234567890.1234567890.");
printf("2) Length=%d\n", length); // Length == -1
length = _snprintf_s(buffer, 10, 10, "1234567890.1234567890.");
printf("3) Length=%d\n", length); // Crash, it needs room for the NULL char
Il passaggio della dimensione del buffer e della dimensione del buffer meno uno è ottuso e soggetto a errori. Si dovrebbe preferire la variante che descrivo qui sotto: length = _snprintf_s (buffer, _TRUNCATE, "1234567890.1234567890."); Poiché il parametro della prima dimensione è omesso, il compilatore utilizza il sovraccarico del modello che ne deduce la dimensione. _TRUNCATE è un valore speciale che fa ciò che dice. Nessun numero magico, e ora il tuo codice è sicuro, manutenibile e un buon esempio. Se ti piace questo commento e _snprintf_s allora dovresti selezionare la mia risposta, invece della pericolosa risposta snprintf/_snprintf. –