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. Teamleiter Technical IT Support (m/w/d)
    Hays AG, München
  2. Referent Rohdatenaufbereitung (w/m/d) Senior-Cyber-Security-Specia- list
    Gemeinsames Kompetenz- und Dienstleistungszentrum der Polizei, Leipzig
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...

gadthrawn 07. Jun 2020

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



Aktuell auf der Startseite von Golem.de
Macbook Pro
Apple bestätigt High Power Mode für M1 Max

Käufer des Macbook Pro mit M1 Max können wohl in MacOS Monterey per Klick noch mehr Leistung aus dem Gerät herausholen.

Macbook Pro: Apple bestätigt High Power Mode für M1 Max
Artikel
  1. Bundesregierung: Autobahn App 2.0 im ersten Quartal 2022 geplant
    Bundesregierung
    Autobahn App 2.0 im ersten Quartal 2022 geplant

    Die Opposition kritisiert die massiven Kosten, Nutzer bewerten die App schlecht. Dennoch soll die Autobahn App nun erweitert werden.

  2. Klage: Google soll E-Privacy und Werbemarkt manipuliert haben
    Klage
    Google soll E-Privacy und Werbemarkt manipuliert haben

    Mehrere US-Bundesstaaten haben Klage gegen Google eingereicht. Das Unternehmen rühmt sich derweil, Regulierungen verlangsamt zu haben.

  3. Silence S04: Günstiges Elektroauto mit herausnehmbaren Akku vorgestellt
    Silence S04
    Günstiges Elektroauto mit herausnehmbaren Akku vorgestellt

    Beim Elektroauto Silence S04 kann der Nutzer den Akku selbst wechseln, wenn dieser leergefahren ist.

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 • Saturn-Gutscheinheft mit Direktabzügen und Zugaben • Nur noch heute: Mehrwertsteuer-Aktion bei MediaMarkt • Roccat Suora 43,99€ • Razer Goliathus Extended Chroma Mercury ab 26,99€ • Seagate SSDs & HDDs günstiger • Alternate (u. a. ASUS ROG Strix Z590-A Gaming WIFI 258€) [Werbung]
    •  /