Einige statische Code-Analyse-Tools schlagen vor, dass alle strcat-Verwendung aus Sicherheitsgründen durch strncat ersetzt werden sollte?
Wenn in einem Programm die Größe des Zielpuffers und der Quellpuffer klar bekannt ist, wird trotzdem empfohlen, für strncat zu gehen?
Sollen strcat trotz der Vorschläge von statischen Tools immer verwendet werden?
Wenn Sie absolut sicher sind, dass die Quellpuffergröße ausreicht und der Quellpuffer ein NULL-Zeichen enthält, das die Zeichenkette beendet, können Sie sicher strcat verwenden, wenn der Zielpuffer groß genug ist.
Ich empfehle immer noch, strncat zu verwenden und ihm die Größe des Zielpuffers zu geben - Länge der Zielzeichenfolge - 1
Hinweis: Ich habe das bearbeitet, seit die Kommentare darauf hingewiesen haben, dass meine vorherige Antwort schrecklich falsch war.
Verketten Sie zwei Strings zu einer einzelnen Zeichenfolge.
Prototypen
%Vor%BESCHREIBUNG
Die Funktionen strcat()
und strncat()
fügen eine Kopie des nullterminierten Objekts an
Zeichenfolge s2 an das Ende der Null-terminierten Zeichenfolge s1, dann fügen Sie eine abschließende \ 0 '. Die Zeichenfolge s1 muss ausreichend Platz zum Speichern der Zeichenfolge haben
Ergebnis.
Die Funktion strncat () hängt nicht mehr als n Zeichen von s2 und fügt dann ein abschließendes \ 0 'hinzu.
Die Quell- und Zielzeichenfolgen sollten sich nicht überschneiden, wie das Verhalten ist undefiniert.
RÜCKGABEWERTE
%Vor%SICHERHEITSHINWEISE
Die Funktion strcat()
kann leicht so missbraucht werden, dass böswillige Benutzer willkürlich die Funktionalität eines laufenden Programms ändern können
durch einen Pufferüberlauf-Angriff.
Vermeiden Sie die Verwendung von strcat()
. Verwenden Sie stattdessen strncat()
oder strlcat()
und stellen Sie sicher
dass keine weiteren Zeichen in den Zielpuffer kopiert werden, als dies möglich ist
halten.
Beachten Sie, dass strncat()
ebenfalls problematisch sein kann. Es kann Sicherheitsbedenken geben, dass eine Zeichenfolge überhaupt abgeschnitten wird. Seit der abgeschnittenen Zeichenfolge
wird nicht so lang sein wie das Original, es kann sich auf eine komplett andere Ressource beziehen und die Verwendung der abgeschnittenen Ressource könnte sehr viel bewirken
falsches Verhalten Beispiel:
Beispiel
%Vor%Sie machen nicht dasselbe, also können sie nicht gegeneinander ausgetauscht werden. Beide haben unterschiedliche Datenmodelle.
strcat
ist null
abgeschlossene Zeichenfolge, für die Sie (als Programmierer) garantieren, dass genügend Platz vorhanden ist. strncat
ist eine Sequenz
von char
, das entweder beendet ist
Bei der Länge geben Sie oder an
durch eine Nullbeendigung, wenn es ist
sollte kürzer sein
Länge. Die Verwendung dieser Funktionen hängt also nur von den Annahmen ab, die Sie in Bezug auf Ihre Daten machen können (oder wollen).
Statische Werkzeuge sind im Allgemeinen schlecht in der Lage, die Umstände bei der Verwendung einer Funktion zu verstehen. Ich wette, die meisten von ihnen warnen nur für jedes gefundene strcat, anstatt tatsächlich zu prüfen, ob die an die Funktion übergebenen Daten deterministisch sind oder nicht. Wie bereits erwähnt, ist keine der Funktionen unsicher, wenn Sie die Kontrolle über Ihre Eingabedaten haben.
Beachten Sie, dass strncat () etwas langsamer ist, da es gegen '\ 0' Termination und einen Counter prüfen muss und es auch explizit am Ende hinzufügen muss. strcat () sucht andererseits nur nach '\ 0' und fügt der neuen Zeichenfolge das abschließende '\ 0' hinzu, indem der Terminator zusammen mit allen Daten aus der zweiten Zeichenfolge kopiert wird.