Ich Verwendung dieses Musters sah auf eine Zeichenfolge in einigen Code verketten Ich arbeitete an:Ist sprintf (Puffer, "% s [...]", Puffer, [...]) sicher?
sprintf(buffer, "%s <input type='file' name='%s' />\r\n", buffer, id);
sprintf(buffer, "%s</td>", buffer);
und ich bin ziemlich sicher, es ist nicht sicher C. ist werden Sie feststellen, dass buffer
bemerken ist sowohl die Ausgabe und die erste Eingabe.
Abgesehen von der offensichtlichen Möglichkeit eines Pufferüberlaufes, ich glaube, es gibt keine Garantie dafür gibt, dass Puffer nicht zwischen dem Beginn und dem Ende der Funktion verändert bekommen (dh es gibt keine Garantie, was den Staat Puffer wird während der Ausführung der Funktion sein). Die Signatur von sprintf gibt zusätzlich an, dass die Zielzeichenfolge restrict
ed ist.
Ich erinnere mich auch einen Bericht von speculative writing in memcpy, und ich sehe keinen Grund, warum einige C-Bibliothek dasselbe in einem Sprintf tun könnte. In diesem Fall würde es natürlich auf seine Quelle schreiben. Also ist dieses Verhalten sicher?
FYI, ich vorgeschlagen:
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);
diese zu ersetzen.
Auch wenn es * sicher * ist (wird nicht abstürzen usw.) Ich kann mir vorstellen, dass es ein anderes Ergebnis als das erwartete ergibt. –
@AndrewMedico Wie ist das? – cat