Wie kann ich strncat ohne Pufferüberlaufprobleme verwenden?

8

Ich habe einen Puffer, ich mache viel strncat. Ich möchte sicherstellen, dass ich niemals die Puffergröße überlaufe.

%Vor%

Statt sizeof (buff) möchte ich etwas buff - xxx sagen. Ich möchte sicherstellen, dass ich den Puffer nicht überschreibe

    
jscode 01.08.2011, 20:22
quelle

5 Antworten

16

Berücksichtigen Sie die Größe der vorhandenen Zeichenfolge und des Nullabschlusses

%Vor%     
Joe 01.08.2011, 20:26
quelle
11

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.

    
Dave 01.08.2011 21:11
quelle
5

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

Ссылка

    
AnT 01.08.2011 21:01
quelle
3

Dies ist der beste Weg, es zu tun. sizeof() gibt Ihnen nur die Größe des Zeigers für die Daten, wenn Sie es nicht lokal zuweisen (Sie haben in diesem Fall lokal zugeordnet, aber es ist besser, dies zu tun, und es funktioniert, wenn der Code neu berechnet wird).

%Vor%     
Hogan 01.08.2011 20:24
quelle
1

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.

    
Edwin Buck 01.08.2011 20:28
quelle

Tags und Links