Является ли sprintf (буфер, «% s […]», буфер, […]) безопасным?

Я видел использование этого шаблона для конкатенации на строку в некотором коде, над которым я работал:

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

и я вполне уверен, что это не безопасно C. Вы заметите, чтоbuffer это и выход, и первый вход.

Помимо очевидной возможности переполнения буфераЯ полагаю, что нет никакой гарантии, что буфер не будет изменен между началом и концом функции (то есть, нет никакой гарантии относительно того, каким будет состояние буфера во время выполнения функции). Подпись sprintf дополнительно указывает, что целевая строкаrestrictредактор

Я также помню отчет оумозрительная запись в memcpy, и я не вижу причин, по которым какая-то библиотека C могла бы делать то же самое в sprintf. В этом случае, конечно, он будет писать его источнику. Такэто поведение безопасно?

К вашему сведению, я предложил:

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

заменить это.

Ответы на вопрос(3)

Ваш ответ на вопрос