Ho visto l'uso di questo modello per concatenare su una stringa in qualche codice su cui stavo lavorando:Sprintf (buffer, "% s [...]", buffer, [...]) è sicuro?
sprintf(buffer, "%s <input type='file' name='%s' />\r\n", buffer, id);
sprintf(buffer, "%s</td>", buffer);
e sono abbastanza certo che non è sicura C. Si noterà che buffer
è sia l'output e il primo input.
A parte l'ovvia possibilità di un buffer overflow, credo non ci sia alcuna garanzia che il buffer non venga modificato tra l'inizio e la fine della funzione (cioè, non vi è alcuna garanzia su quale sia lo stato del buffer sarà durante l'esecuzione della funzione). La firma di sprintf specifica inoltre che la stringa di destinazione è restrict
ed.
Ricordo anche un rapporto di speculative writing in memcpy e non vedo alcun motivo per cui una libreria C potrebbe fare la stessa cosa in uno sprintf. In questo caso, ovviamente, scriverebbe alla sua fonte. Quindi questo comportamento è sicuro?
FYI, ho proposto:
char *bufEnd = buffer + strlen(buffer);
/* sprintf returns the number of f'd and print'd into the s */
bufEnd += sprintf(bufEnd, " <input type='file' name='%s' />\r\n", id);
per sostituire questo.
Anche se è * sicuro * (non si blocca, ecc.), Posso immaginare che generi un risultato diverso da quello previsto. –
@AndrewMedico Come va? – cat