Я видел использование этого шаблона для конкатенации строки в некотором коде, над которым я работал:
sprintf(buffer, "%s <input type='file' name='%s' />\r\n", buffer, id);
sprintf(buffer, "%s</td>", buffer);
и я уверен, что это не безопасно C. Вы заметите, что buffer
- это как выход, так и первый вход.
Помимо очевидной возможности переполнения буфера, я считаю, что нет гарантии, что буфер не будет изменен между началом и концом функции (т.е. нет гарантии того, что состояние буфера будет во время выполнения функции). Подпись sprintf дополнительно указывает, что целевая строка restrict
ed.
Я также вспоминаю отчет о умозрительном письме в memcpy, и я не вижу причин, по которым некоторые библиотеки C могли бы делать то же самое в Sprintf. В этом случае, конечно, это будет писать его источник. Таким образом безопасно ли это поведение?
FYI, я предложил:
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);
чтобы заменить это.