• IT-Karriere:
  • Services:

mmap: Codeanalyse mit sechs Zeilen Bash

Ein typischer Fehler bei der Verwendung der C-Funktion mmap lässt sich erstaunlich einfach finden.

Ein Erfahrungsbericht von veröffentlicht am
Tücken in der Programmiersprache C gibt es viele - eine fehlerhafte Funktionsverwendung konnten wir mit einem sehr simplen Script effektiv aufspüren.
Tücken in der Programmiersprache C gibt es viele - eine fehlerhafte Funktionsverwendung konnten wir mit einem sehr simplen Script effektiv aufspüren. (Bild: Buchcover / Wikimedia Commons / Emil Engler/CC0 1.0)

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.

Inhalt:
  1. mmap: Codeanalyse mit sechs Zeilen Bash
  2. 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:

Stellenmarkt
  1. Landkreis Potsdam-Mittelmark, Teltow
  2. über duerenhoff GmbH, Raum Berlin

  1. m = mmap(0, 3, PROT_READ, MAP_SHARED, fd, 0);
  2. if (!m) {
  3. printf("Error!\n");
  4. return 1;
  5. }

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:

  1. m = mmap(0, 3, PROT_READ, MAP_SHARED, fd, 0);
  2. if (m == MAP_FAILED) {
  3. printf("Error!\n");
  4. return 1;
  5. }

Bitte aktivieren Sie Javascript.
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. 1
  2. 2
  3.  


Anzeige
Top-Angebote
  1. (u. a. Persona 5 Royal PS4 für 24,36€ + 2,99€ Versand oder Marktabholung, Yakuza Remastered...
  2. (u. a. Seagate Expansion Desktop 8TB für 125,75€ und SanDisk Ultra Micro-SDXC 128 GB für 13...
  3. (u. a. F1 2020 - Deluxe Schumacher Edition [EU Key] für 42,99€ und Borderlands 3 - Steam Key...
  4. (u. a. Sandisk Extreme 256GB SDXC für 54,99€, Western Digital 10 TB Elements Desktop externe...

hab (Golem.de) 19. Jun 2020 / Themenstart

Habe jetzt ein kurzes Update im Artikel.

rubberduck09 13. Jun 2020 / Themenstart

Merkst was? sprintf ist Teil der stdlibc, mmap() hingegen nicht. Wo soll gcc denn die...

ultim 09. Jun 2020 / Themenstart

Also laut dir ist C nicht eine typsichere Sprache... no comment. Außerdem, du kannst in...

ultim 07. Jun 2020 / Themenstart

Einerseits ist mmap keine "C-Funktion". Es ist eine Funktion, die von jeder Sprache mit...

gadthrawn 07. Jun 2020 / Themenstart

Früher stand das bei mmap noch nicht in der Doku, wurde erst später eingeführt. NULL...

Kommentieren


Folgen Sie uns
       


IBM - von der Lochkarte zum Quantencomputer (Golem Geschichte)

Golem.de erzählt die über 100-jährige Geschichte von Big Blue im Video.

IBM - von der Lochkarte zum Quantencomputer (Golem Geschichte) Video aufrufen
    •  /