Warum nicht snprintf
verwenden? Im Gegensatz zu strncat
erwartet es die Größe des Puffers, aber noch wichtiger, es gibt kein verstecktes O (n).
Strcat muss den Null-Terminator für jede verkettete Zeichenfolge finden und jedes Mal durch den gesamten Puffer laufen, um das Ende zu finden. Jedes Mal, wenn die Zeichenfolge länger wird, wird strcat langsamer. Sprintf hingegen kann das Ende im Auge behalten. Du wirst das finden
%Vor%Ist häufig eine schnellere und besser lesbare Lösung.
Die Art und Weise, wie Sie die Funktion strncat
in Ihrem Ursprungscode verwenden, wäre für eine andere Funktion tatsächlich geeignet: strlcat
(Anmerkung l
anstelle von n
). Die strlcat
-Funktion ist kein Standard, aber sie ist ein beliebter Ersatz für strncat
. strlcat
erwartet als letztes Argument die Gesamtgröße des gesamten Zielpuffers.
Inzwischen erwartet strncat
die Größe des verbleibenden ungenutzten Teils des Zielpuffers als drittes Argument. Aus diesem Grund ist der ursprüngliche Code falsch.
Ich würde vorschlagen, anstatt diesen schrecklichen Missbrauch von strncpy
zu machen und explizite Rescans mit diesen strlen
-Aufrufen durchzuführen (beide Probleme in Joes Antwort), verwenden Sie entweder eine implementierte strlcat
oder implementieren eine selbst (Wenn Ihre Implementierung keine strlcat
bereitstellt).
Hogan hat die Frage ausreichend beantwortet; Wenn Sie sich jedoch Sorgen über Pufferüberläufe in strcat(...)
machen, sollten Sie sich gleichermaßen Gedanken über Pufferüberläufe in allen anderen Zeichenfolgenfunktionen machen.
Verwenden Sie strnlen(...)
und strncpy(...)
, um sicherzustellen, dass Sie wirklich in Ihrem Puffer bleiben. Wenn Sie keine Funktion strnlen(...)
haben, schreiben Sie sie.
Tags und Links string c buffer-overflow