Wie kann ich eine Zeichenkette in C sicher kopieren?
- Einführung
- Problematik von strcpy
- Sichere Alternativen
- Praktische Umsetzung mit strncpy
- Verwendung von strlcpy
- Alternative: Eigene Funktion schreiben
- Fazit
Einführung
In der Programmiersprache C ist das Kopieren von Zeichenketten ein häufiger Vorgang. Dabei muss unbedingt darauf geachtet werden, dass die Zielpuffer ausreichend groß sind, um Pufferüberläufe zu vermeiden, die zu Sicherheitslücken führen können.
Die Standardfunktion strcpy kopiert zwar eine Zeichenkette, bietet aber keinen Schutz gegen das Überschreiben des Zielpuffers,
Problematik von strcpy
strcpy erwartet, dass der Zielpuffer groß genug ist, um die komplette Quellzeichenkette inklusive des abschließenden Nullterminators aufzunehmen.
Erfolgt dies nicht, wird der Speicherbereich des Zielpuffers überschrieben, was zu undefiniertem Verhalten führen kann.
Sichere Alternativen
Um eine Zeichenkette sicher zu kopieren, empfiehlt es sich, die Länge des Zielpuffers zu kennen und nur so viele Zeichen zu kopieren, dass der Puffer nicht überläuft.
Die Funktion strncpy aus der Standardbibliothek erlaubt eine maximale Anzahl an zu kopierenden Zeichen anzugeben. Allerdings hat
strncpy einige Nachteile, beispielsweise wird kein Nullterminator garantiert, wenn die Quelle länger als die Anzahl der kopierten Zeichen ist.
Eine verbesserte Alternative, die in modernen Entwicklungsumgebungen vorhanden ist, ist strlcpy, die den Zielpuffer immer nullterminiert und die Länge direkt angibt. Diese Funktion ist jedoch nicht standardisiert und nicht überall verfügbar.
Praktische Umsetzung mit strncpy
Wenn nur strncpy verfügbar ist, sollte man stets selbst dafür sorgen, dass der Zielpuffer am Ende nullterminiert ist. Das bedeutet, man kopiert höchstens size - 1 Zeichen und schreibt am Ende manuell ein \0. Beispiel:
void sichere_str_copy(char *ziel, const char *quelle, size_t size) { if (size == 0) return; // Keine Kapazität im Ziel strncpy(ziel, quelle, size - 1); ziel = \0; // Sicherstellen der Nulltermination}Verwendung von strlcpy
Falls strlcpy verfügbar ist (z. B. auf BSD-Systemen oder durch Nachinstallation), kann man diese Funktion verwenden, da sie einfacher zu handhaben ist und immer eine Nullterminierung garantiert:
strlcpy(ziel, quelle, size);Dabei gibt strlcpy die Länge der Quelle zurück, sodass man prüfen kann, ob der Zielpuffer ausreichend groß war.
Alternative: Eigene Funktion schreiben
Um maximale Sicherheit und Portabilität zu gewährleisten, kann man eine eigene Funktion zum sicheren Kopieren von Zeichenketten schreiben. Dabei sollte man beachten, keine Speicherbereiche zu überschreiben, eine Nullterminierung sicherzustellen und mögliche Fehlerzustände zu handhaben.
Fazit
Das sichere Kopieren von Zeichenketten in C ist wichtig, um Sicherheitsprobleme zu vermeiden. Die einfache Verwendung von strcpy ist wegen der fehlenden Längenprüfung risikoreich. Stattdessen sollte man:
erstens, die Größe des Zielpuffers kennen, zweitens Funktionen wie strncpy oder strlcpy verwenden und drittens gegebenenfalls selbst die Nullterminierung sicherstellen. Auf diese Weise lassen sich Pufferüberläufe vermeiden und stabiler, sicherer Code schreiben.
