¿Es seguro el sprintf (búfer, "% s [...]", búfer, [...])?

Vi el uso de este patrón para concatenar en una cadena en un código en el que estaba trabajando:

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

y estoy bastante seguro de que no es seguro C. Notarás quebuffer Es tanto la salida como la primera entrada.

Aparte de la obvia posibilidad de un desbordamiento de búfer., Creo que no hay garantía de que el búfer no se cambie entre el inicio y el final de la función (es decir, no hay garantía de cuál será el estado del búfer durante la ejecución de la función). La firma de sprintf además especifica que la cadena objetivo esrestricted.

También recuerdo un informe de unescritura especulativa en memcpy, y no veo ninguna razón por la que alguna biblioteca C pueda hacer lo mismo en un sprintf. En este caso, por supuesto, estaría escribiendo a su fuente. Asi que¿Es seguro este comportamiento?

Para tu información, te propuse:

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

para reemplazar esto.

Respuestas a la pregunta(3)

Su respuesta a la pregunta