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. Ingenieur (w/m/d) Kommunikationstechnik
    Deutscher Bundestag, Berlin
  2. Product Owner (m/f/d) for Hardware Security Modules
    Elektrobit Automotive GmbH, Erlangen
Detailsuche

  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.  


hab (Golem.de) 19. Jun 2020

Habe jetzt ein kurzes Update im Artikel.

rubberduck09 13. Jun 2020

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

ultim 09. Jun 2020

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

ultim 07. Jun 2020

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



Aktuell auf der Startseite von Golem.de
Neue Grafikkarten
Erste Preise für Nvidias Geforce RTX 4090 aufgetaucht

Der US-Händler Newegg gibt einen Blick auf die Preise der Nvidia-Ada-Grafikkarten. Sie werden teurer als die Geforce RTX 3090 zuvor.

Neue Grafikkarten: Erste Preise für Nvidias Geforce RTX 4090 aufgetaucht
Artikel
  1. Smart Home Eco Systems: Was unterscheidet Alexa von Homekit von Google Home?
    Smart Home Eco Systems
    Was unterscheidet Alexa von Homekit von Google Home?

    Alexa, Homekit, Google Home - ist das nicht eigentlich alles das Gleiche? Nein, es gibt erhebliche Unterschiede bei Sprachsteuerung, Integration und Datenschutz. Ein Vergleich.
    Eine Analyse von Karl-Heinz Müller

  2. Hideo Kojima: Es sollte ein Death-Stranding-Spiel für Google Stadia geben
    Hideo Kojima
    Es sollte ein Death-Stranding-Spiel für Google Stadia geben

    Hideo Kojima arbeitete am Exklusivtitel für Stadia. Das wurde vorzeitig eingestellt, auch weil Google nicht an Einzelspieler-Games glaubte.

  3. Superbase V: Zendures Solarstation mit 6.400 Wh kommt mit hohem Rabatt
    Superbase V
    Zendures Solarstation mit 6.400 Wh kommt mit hohem Rabatt

    Vor dem Verkaufsstart über die eigene Webseite verkauft Zendure seine Superbase V über Kickstarter - mit teilweise fast 50 Prozent Rabatt.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • Razer DeathAdder V3 Pro 106,39€ • Alternate (u. a. Kingston FURY Beast RGB 32 GB DDR5-6000 226,89€, be quiet! Silent Base 802 Window 156,89€) • MindFactory (u. a. Kingston A400 240/480 GB 17,50€/32€) • SanDisk microSDXC 400 GB 29,99€ • PCGH-Ratgeber-PC 3000 Radeon Edition 2.500€ [Werbung]
    •  /