Code – String in C anlegen

Es gibt eine Weit verbreitete Sicherheitslücke in C Programmen, welche auf die dynamische allokation von Strings zurückgeht.
Da diese recht einfach zu umgehen ist, wollte ich hier kurz eine Notiz hinterlassen.

Nehmen wir mal an, ich habe ein Hello World Programm geschrieben, dass dynamisch einen String anlegt.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main (int argc, char *argv[])
{
	char *str = malloc (strlen ("Hello World!") * sizeof (char));
	
	// Fehler, es ist kein Platz für die Binäre 0 (\0)
	strcpy (str, "Hello World!");
	
	printf ("%s\n", str);
	
	free (str);
	return 0;
}

Da beim malloc nur 12 Byte reserviert werden, und strcpy immer eine Binäre 0 (\0) dranhängt, ist zu wenig Speicherplatz vorhanden.
Dass nennt man buffer overflow.

Um die gefährliche Lücke zu umgehen, kann man auf eine Funktion in der String Bibliothek zurückgreifen.
strdup legt den benötigten Speicherplatz an und Initiiert im Anschluss den String.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main (int argc, char *argv[])
{
	char *str = strdup ("Hello World!");
	
	printf ("%s\n", str);
	
	free (str);
	return 0;
}

Veröffentlicht von

Marc Volker Dickmann

Schreibt über alles was ihn Interessiert und beschäftigt. Startet regelmäßig neue Projekte.

Ein Gedanke zu „Code – String in C anlegen“

  1. Kleiner Hinweis, sizeof(char) ist per Definition immer 1, denn char ist immer der kleinste adressierbare Typ. Selbst wenn man eine exotische Plattform hätte, mit beispielsweise 16 Bits pro Byte, wäre sizeof(char) trotzdem 1.

    Wenn man also Speicherplatz für einen String alloziert, reicht es bei malloc ein +1 anzuhängen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.