Prüfstand für Testwerkzeuge: Codeanalyse im Praxiseinsatz
Seite 6: Überblick und Open Source
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 |
Tests mit Open Source
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.
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.
Kollektives Versagen
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.