vi uso de este patrón para concatenar en una cadena en algún código que estaba trabajando:¿Es seguro sprintf (buffer, "% s [...]", buffer, [...])?
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 segura C. Se dará cuenta de que buffer
es a la vez la salida y la primera entrada.
Además de la posibilidad obvia de desbordamiento de memoria intermedia, creo que no hay garantía de que la memoria intermedia no cambie entre el inicio y el final de la función (es decir, no hay garantía de qué de buffer será durante la ejecución de la función). La firma de sprintf especifica, además, que la cadena de destino es restrict
ed.
También recuerdo un informe de speculative writing in 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 en su fuente. ¿Entonces es este comportamiento seguro?
FYI, he propuesto:
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 reemplazarlo.
Incluso si es * seguro * (no se bloqueará, etc.) puedo imaginarlo generando un resultado diferente al esperado. –
@AndrewMedico ¿Cómo es eso? – cat