Mit grep auf Fehlersuche

Wenn man sich derartige Konstruktionen ansieht, erscheint es naheliegend, dass man zumindest die einfachsten Varianten dieser Fehler automatisiert finden könnte. Genau das haben wir versucht - mit einer extrem trivialen Methode.

Stellenmarkt
  1. System Engineer Microsoft - Schwerpunkt Client-Design und Active Directory-Design
    Computacenter AG & Co. oHG, Ratingen, Frankfurt am Main
  2. IT-Systemadministratoren (m/w/d) Schwerpunkt Netzwerk
    Städtische Werke Magdeburg GmbH & Co. KG, Magdeburg
Detailsuche

Wir suchen dafür mit dem Tool grep und einem regulären Ausdruck nach Aufrufen von mmap in C-Dateien und betrachten die zehn Zeilen nach diesem Aufruf. Wir gehen dabei davon aus, dass der Check auf einen möglichen Fehler üblicherweise wenige Zeilen unter dem Funktionsaufruf stattfindet. Finden wir dort den Wert -1 oder die Konstante MAP_FAILED dann gehen wir davon aus, dass der Fehler korrekt geprüft wird. Andernfalls geben wir den Dateinamen aus.

Bei ersten Tests fanden wir bereits echte Fehler, doch auch sehr viele Fehlalarme. Zwei Fälle traten dabei besonders häufig auf. Zum einen fanden wir häufig Funktionen, die mmap im Namen enthalten, aber nicht direkt syntaxkompatibel sind. Diese haben wir durch eine Anpassung des regulären Ausdrucks ausgeschlossen - nur tatsächliche Aufrufe von mmap und nicht etwa von xyz_mmap werden nun erkannt.

Kommentare mit Präprozessor filtern

Weiterhin fanden wir häufig Kommentare, in denen etwas erklärt und dabei die Funktion mmap erwähnt wird. Um diese Fälle abzufangen, kann man den Präprozessor des Compilers nutzen und Kommentare damit einfach herausfiltern. Diese beiden Anpassungen reichten, um die Mehrzahl der Fehlalarme auszuschließen.

Golem Akademie
  1. Ansible Fundamentals: Systemdeployment & -management: virtueller Drei-Tage-Workshop
    6.–8. Dezember 2021, Virtuell
  2. Netzwerktechnik Kompaktkurs: virtueller Fünf-Tage-Workshop
    8.–12. November 2021, virtuell
Weitere IT-Trainings

Klar ist: Dieser Ansatz ist sehr grob und natürlich nicht perfekt. So finden sich etwa Fälle, in denen der Rückgabewert von mmap selbst wieder als Rückgabewert verwendet wird und der Fehlercheck eine Ebene höher in einer anderen Funktion stattfindet. Auch kann das Skript echte Fehler verpassen, etwa wenn zufällig der Wert -1 aus anderen Gründen im Code auftaucht.

Viele echte Bugs gefunden

Aber selbst diese einfache Methode lieferte gute Ergebnisse. Bei der Mehrzahl der ausgegebenen Funde handelte es sich um echte Fehler. Wir haben das Skript mit größeren Mengen Quellcode von freien Softwareprojekten getestet und dabei eine ganze Reihe von Bugs gefunden, die wir an die entsprechenden Projekte gemeldet haben. Fehler fanden wir etwa in Komponenten von KDE und Gnome, in der Linux-Grafikbibliothek Mesa, im Debugger GDB, im Emulator Qemu und einige mehr. Das Skript, das effektiv nur sechs Zeilen lang ist, haben wir auch veröffentlicht.

Da sich diese Fehler mit so simplen Methoden finden lassen, stellt sich die Frage, ob gängige Codeanalysetools diese ebenfalls finden. Aber zumindest bei den frei verfügbaren Tools wurden wir enttäuscht.

Selbst bei sehr trivialen Fällen wie dem oben genannten Beispiel zeigen weder GCC noch Clang eine Warnung an, auch wenn man alle Warnungen aktiviert. Auch die von beiden Compilern bereitgestellten statischen Codeanalysewerkzeuge - scan-build bei Clang und das Flag -fanalyzer beim aktuellen GCC - finden derartige Fehler nicht. Die frei verfügbaren Codeanalysetools Cppcheck und Splint finden den Fehler ebenfalls in ihrer Standardeinstellung nicht. Auf proprietäre Codeanalysewerkzeuge wie Coverity hatten wir keinen Zugriff und konnten sie somit nicht testen.

Nachtrag vom 19. Juni 2020, 19:45 Uhr

Wir sind von einem Leser darauf hingewiesen worden dass man mit dem Tool Cppcheck derartige Bugs ebenfalls finden kann, wenn man eine speziell dafür geschriebene Regel verwendet.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 mmap: Codeanalyse mit sechs Zeilen Bash
  1.  
  2. 1
  3. 2


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
Kursabsturz
Teamviewer-Chef spricht über schwere hausgemachte Fehler

Die vielen neuen Mitarbeiter seien nicht richtig eingearbeitet worden. Und die Ziele von Teamviewer seien zu hochgesteckt gewesen, sagt Oliver Steil.

Kursabsturz: Teamviewer-Chef spricht über schwere hausgemachte Fehler
Artikel
  1. Amazon-Go-Konkurrenz: Rewe eröffnet ersten kassenlosen Supermarkt
    Amazon-Go-Konkurrenz
    Rewe eröffnet ersten kassenlosen Supermarkt

    Kameras und Sensoren überwachen Kunden in Rewes kassenlosem Supermarkt. Bezahlt wird mit dem Smartphone.

  2. NDR und Media Broadcast: Fernsehen über 5G wird breit ausgestrahlt
    NDR und Media Broadcast
    Fernsehen über 5G wird breit ausgestrahlt

    Fernsehen kann auch über 5G laufen. Auf 578 MHz kann das jetzt ausprobiert werden. NDR und Media Broadcast machen es möglich.

  3. Smartphone-Tarife: Tchibo bietet Jahres-Tarif mit 72 GByte
    Smartphone-Tarife
    Tchibo bietet Jahres-Tarif mit 72 GByte

    In diesem Jahr stehen drei unterschiedliche Jahres-Tarife für Tchibo-Kunden zur Wahl.

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 • Speicherprodukte von Sandisk & WD zu Bestpreisen (u. a. Sandisk SSD Plus 2TB 140,99€) • Sapphire Pulse RX 6600 497,88€ • Epos H3 Hybrid Gaming-Headset 144€ • Apple MacBook Pro 2021 erhältlich ab 2.249€ • EA-Spiele für alle Plattformen günstiger • Samsung 55" QLED 699€ [Werbung]
    •  /