strcat Vs strncat - Wann sollte welche Funktion verwendet werden?

8

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?

    
Jay 27.06.2011, 09:41
quelle

4 Antworten

10

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.

    
Juho 27.06.2011, 09:45
quelle
11

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:

%Vor%

Beispiel

%Vor%     
Pankaj Kumar 28.06.2011 06:18
quelle
1

Sie machen nicht dasselbe, also können sie nicht gegeneinander ausgetauscht werden. Beide haben unterschiedliche Datenmodelle.

  • Eine Zeichenfolge für strcat ist null abgeschlossene Zeichenfolge, für die Sie (als Programmierer) garantieren, dass genügend Platz vorhanden ist.
  • Eine Zeichenfolge für 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).

    
Jens Gustedt 27.06.2011 09:53
quelle
0

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.

    
Lundin 27.06.2011 11:33
quelle

Tags und Links