Ist sprintf (buffer, "% s […]", buffer, […]) sicher?

Ich habe gesehen, dass dieses Muster verwendet wurde, um in einem Code, an dem ich gearbeitet habe, eine Zeichenfolge zu verketten:

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

und ich bin mir ziemlich sicher, dass es nicht sicher istbuffer ist sowohl der Ausgang als auch der erste Eingang.

Abgesehen von der offensichtlichen Möglichkeit eines PufferüberlaufsIch glaube, es gibt keine Garantie dafür, dass der Puffer zwischen dem Start und dem Ende der Funktion nicht geändert wird (d. H. Es gibt keine Garantie dafür, wie der Zustand des Puffers während der Ausführung der Funktion sein wird). Die Signatur von sprintf gibt zusätzlich an, dass es sich bei der Zielzeichenfolge um handeltrestricted.

Ich erinnere mich auch an einen Bericht von aspekulatives Schreiben in memcpy, und ich sehe keinen Grund, warum eine C-Bibliothek in einem Sprintf dasselbe tun könnte. In diesem Fall würde es natürlich an seine Quelle schreiben. SoIst dieses Verhalten sicher?

Zu Ihrer Information schlug ich vor:

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

um dies zu ersetzen.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage