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. Koordinator*in (m/w/d) für Digitalisierung mit Schwerpunkt Onlinezugangsgesetz (OZG)
    Universität Stuttgart, Stuttgart
  2. SAP BW/BI Berater (m/w/x)
    über duerenhoff GmbH, Raum Essen
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 Karrierewelt
  1. ITIL 4® Foundation: virtueller Zwei-Tage-Workshop
    12./13.12.2022, virtuell
  2. Green IT: Praxisratgeber zur nachhaltigen IT-Nutzung (virtueller Ein-Tages-Workshop)
    14.03.2023, 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...



Aktuell auf der Startseite von Golem.de
Twitter
Was bisher bei Elon Musks Twitter 2.0 geschah

Nach der Twitter-Übernahme durch Elon Musk ist klar: Das Netzwerk hat wesentlich weniger Mitarbeiter. Es ist aber noch viel mehr passiert.
Ein Bericht von Oliver Nickel

Twitter: Was bisher bei Elon Musks Twitter 2.0 geschah
Artikel
  1. Telefónica: Warum der LTE-Ausbau in der U-Bahn so lange dauert
    Telefónica
    Warum der LTE-Ausbau in der U-Bahn so lange dauert

    Seit August 2010 laufen in Deutschland LTE-Netze. Nun wird 5G langsam wichtiger, doch die Berliner U-Bahn ist noch immer nicht für alle mit 4G versorgt.

  2. Responsible Disclosure: Obi macht das Melden einer Sicherheitslücke schwer
    Responsible Disclosure
    Obi macht das Melden einer Sicherheitslücke schwer

    Ein Sicherheitsforscher hat eine Lücke bei mehreren Unternehmen und Stadtverwaltungen gemeldet. Obi machte es ihm besonders schwer.

  3. Glasfaser: Konkurrenz gegen Abschaltrecht des Kupfernetzes der Telekom
    Glasfaser
    Konkurrenz gegen Abschaltrecht des Kupfernetzes der Telekom

    Noch ist die Telekom weit davon entfernt, ihr Kupfernetz abschalten zu können. Doch erste Planungen laufen und die Konkurrenz stellt Forderungen.

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 • PS5 bei Amazon • Samsung SSDs bis -28% • Rabatt-Code für ebay • Logitech Mäuse, Tastaturen & Headsets -53% • HyperX PC-Peripherie -56% • Google Pixel 6 & 7 -49% • PS5-Spiele günstiger • Tiefstpreise: Palit RTX 4080 1.369€, Roccat Kone Pro 39,99€, Asus RTX 6950 XT 939€ [Werbung]
    •  /