mmap: Codeanalyse mit sechs Zeilen Bash
Ein typischer Fehler bei der Verwendung der C-Funktion mmap lässt sich erstaunlich einfach finden.

Die Programmiersprache C hat nicht ohne Grund den Ruf, voller Tücken zu sein. Die Funktion mmap, die Teil des POSIX-Standards ist, ist eine davon. Mit einem sehr simplen Shellskript ist es uns gelungen, viele fehlerhafte Verwendungen der mmap-Funktion aufzuspüren.
- mmap: Codeanalyse mit sechs Zeilen Bash
- Mit grep auf Fehlersuche
Die Funktion mmap ist schnell erklärt: Sie bildet eine Datei im Arbeitsspeicher ab. Nach dem Funktionsaufruf erhält man einen Pointer zu einer Speicheradresse, auf die man anschließend zugreifen und dort den Inhalt der Datei finden kann. Je nachdem mit welchen Parametern mmap aufgerufen wird, kann der Dateiinhalt auch mit Schreibzugriffen verändert werden.
Im Fehlerfall -1 statt NULL-Pointer
Der Rückgabewert von mmap ist, wenn die Funktion erfolgreich ausgeführt wird, ein Pointer. Doch mmap kann auch fehlschlagen, beispielsweise wenn zu wenig Speicher verfügbar ist oder wenn ein ungültiger Dateideskriptor übergeben wurde. Im Fehlerfall gibt mmap den Wert -1 zurück, der über die entsprechende Konstante MAP_FAILED geprüft werden sollte. Damit verhält sich mmap eher unüblich. Denn die meisten Standardfunktionen, die Pointer zurückgeben, geben im Fehlerfall einen NULL-Pointer zurück.
Das führt häufig dazu, dass Programmierer den Rückgabewert nicht korrekt prüfen. Das folgende Codebeispiel ist beispielsweise falsch:
m = mmap(0, 3, PROT_READ, MAP_SHARED, fd, 0); if (!m) { printf("Error!\n"); return 1; }
Hier wird im Fall eines zurückgegebenen NULL-Pointers ein Fehler ausgegeben, aber mmap gibt niemals einen derartigen Wert zurück. Korrekt müsste man den Rückgabewert auf MAP_FAILED prüfen:
m = mmap(0, 3, PROT_READ, MAP_SHARED, fd, 0); if (m == MAP_FAILED) { printf("Error!\n"); return 1; }
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
- ohne Werbung
- mit ausgeschaltetem Javascript
- mit RSS-Volltext-Feed
Mit grep auf Fehlersuche |
- 1
- 2
Habe jetzt ein kurzes Update im Artikel.
Merkst was? sprintf ist Teil der stdlibc, mmap() hingegen nicht. Wo soll gcc denn die...
Also laut dir ist C nicht eine typsichere Sprache... no comment. Außerdem, du kannst in...
Einerseits ist mmap keine "C-Funktion". Es ist eine Funktion, die von jeder Sprache mit...
Früher stand das bei mmap noch nicht in der Doku, wurde erst später eingeführt. NULL...