Czy sprintf (bufor, „% s […]”, bufor, […]) jest bezpieczny?

Widziałem użycie tego wzorca do łączenia na łańcuchu w jakimś kodzie, nad którym pracowałem:

sprintf(buffer, "%s <input type='file' name='%s' />\r\n", buffer, id);
sprintf(buffer, "%s</td>", buffer);

i jestem prawie pewien, że nie jest to bezpieczne C. Zauważysz tobuffer jest zarówno wyjściem, jak i pierwszym wejściem.

Oprócz oczywistej możliwości przepełnienia bufora, Uważam, że nie ma gwarancji, że bufor nie zostanie zmieniony między początkiem a końcem funkcji (tzn. Nie ma gwarancji, jaki będzie stan bufora podczas wykonywania funkcji). Podpis sprintf dodatkowo określa, że ​​ciąg docelowy torestrictwyd.

Przypominam również raport ospekulatywne pisanie w memcpyi nie widzę powodu, dla którego jakaś biblioteka C mogłaby zrobić to samo w sprintf. W tym przypadku oczywiście zapisywałby do źródła. Więcczy to zachowanie jest bezpieczne?

FYI, zaproponowałem:

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);

zastąpić to.

questionAnswers(3)

yourAnswerToTheQuestion