Prüfstand für Testwerkzeuge: Codeanalyse im Praxiseinsatz

Seite 6: Überblick und Open Source

Inhaltsverzeichnis

Folgende Tabelle zeigt die Funktionsweise, den Preis und die Anbindung der getesteten Werkzeuge.

Firma Viva64 Parasoft MathWorks Perforce
Software PVS Studio C/C++test Polyspace Bug Finder & Code Prover (1) Klocwork
Version 7.01.30939.1042 10.4.2 R2019a 19.01
C/C++ ja ja ja ja
C# ja separat nein ja
Java ja separat nein ja
Plattformen Client Linux, Windows, macOS Linux, Windows Linux, Windows, macOS Linux, Windows, macOS, Solaris, AIX
Plattformen Server - Linux, Windows Linux, Windows, macOS (2) Linux, Windows
IDE Visual Studio Eclipse, eigener Desktop Eclipse, eigener Desktop Eclipse, Visual Studio, IntelliJ IDEA
Continuous Integration - Jenkins, Bamboo Jenkins Jenkins, TeamCity
Bugtracking SonarQube (4) Jira Jira -
ca. Preis (5) 20.000 Euro 30.000 Euro keine Angaben 100.000 Euro
(1) zwei Produkte
(2) zusätzliche Produkte
(3) durch die Kommandozeilenprogramme ist eine Integration in fast alles möglich. Hier aufgelistet sind die Produkte, die sich laut Hersteller als fertige Konfigurationen angewendet werden lassen.
(4) Enterprise Variante
(5) ca. 20 Entwickler

Den Vergleich rundet ein Blick auf die Open-Source-Tools cppcheck und clang-analyzer ab. cppcheck findet lediglich einen "Use After Free"-Fehler, den alle anderen Werkzeuge ebenfalls gefunden haben:

$ cppcheck --force --quiet --inconclusive -I. *.c *.cpp

[use_after_free.c:34]: (error) \\
Dereferencing 'b' after it is \\
deallocated / released

Der clang-analyzer befindet sich in Linux-Distributionen meist im clang-tools-Paket. Er lässt sich folgendermaßen nutzen:

$ scan-build -analyze-headers -k make

scan-build: Using '/usr/lib/llvm-8/bin/clang' \\
  for static analysis

[...]

scan-build: 8 bugs found.
scan-build: Run 'scan-view \\
  /tmp/scan-build-2019-09-13-194623-19774-1' \\
  to examine bug reports.
$ scan-view /tmp/scan-build-2019-09-13-194623-19774-1
Starting scan-view at: http://127.0.0.1:8181
  Use Ctrl-C to exit.

Tester können in einem lokalen Webserver Ergebnisse ansehen (Abb. 4).

Der clang-analyzer bringt ein hübscheres Äußeres als cppcheck mit, konnte aber nur einen zusätzlichen Fehler erkennen – einen Double Free Bug. Im Vergleich haben die kommerziellen Tools das Doppelte und Dreifache der Fehler gefunden, sodass die Open-Source-Werkzeuge bislang bei weitem nicht mithalten können.

Zwei Fehlerklassen fand keines der getesteten Werkzeuge: das unbeabsichtigte Weiterleiten von Datei-Deskriptoren (Filedescriptor Leakage) und Type Confusion.

Code mit der ersten Fehlerklasse vererbt einen Datei-Deskriptor an einen Unterprozess, der unter die Kontrolle eines Angreifers kommen und dann auf den Deskriptor zugreifen kann. Dieses Szenario ist jedoch recht selten.

Bei Type Confusion handelt es sich um ein fehlerhaftes Typecasting einer Klasse wie in

mutterObjekt *mutter =
static_cast<mutterObjekt*> kind;

Es kann in Folge zu Pufferüberlaufen und anderen Fehlern führen. Es gehört zu den häufigsten kritischen Sicherheitslücken in modernen C++-Anwendungen wie Webbrowsern. Daher ist es besonders schwerwiegend, dass alle Programme diese Art von Bugs nicht entdecken. Die einzige dem Autor bekannte Lösung, hiernach effizient zu suchen, ist über Fuzzing in Verbindung mit speziellen Sanitizern mit LLVM.