• IT-Karriere:
  • Services:

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. Hays AG, Berlin
  2. dmTECH GmbH, Karlsruhe

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.

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


Anzeige
Hardware-Angebote
  1. (reduzierte Überstände, Restposten & Co.)

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
       


Asus-Gaming-Monitor mit 43 Zoll Diagonale - Test

Zwar ist der PG43UQ mit seinen 43 Zoll noch immer ziemlich riesig, er passt aber zumindest noch gut auf den Schreibtisch. Und dort überrascht der Asus-Monitor mit einer guten Farbdarstellung und hoher Helligkeit.

Asus-Gaming-Monitor mit 43 Zoll Diagonale - Test Video aufrufen
    •  /