Wenn Sie in einer modernen Sprache schreiben, haben Sie sie tatsächlich, ohne es zu wissen, durch einen statischen Analysator geleitet. Tatsache ist, dass jeder moderne Compiler eine winzige Reihe von Warnungen vor möglichen Problemen im Code bereitstellt. Wenn Sie beispielsweise C ++ - Code in Visual Studio kompilieren, sehen Sie Folgendes:
In dieser Ausgabe sehen wir, dass die Variable var an keiner Stelle in der Funktion verwendet wurde. Tatsächlich haben Sie fast immer einen einfachen statischen Code-Analysator verwendet. Im Gegensatz zu professionellen Analysegeräten wie Coverity, Klocwork oder PVS-Studio können die vom Compiler bereitgestellten Warnungen jedoch nur einen kleinen Bereich von Problemen anzeigen.
Wenn Sie nicht genau wissen, was statische Analyse ist und wie sie implementiert wird, lesen Sie diesen Artikel , um mehr über diese Methode zu erfahren.
Warum ist eine statische Analyse erforderlich?
Kurz gesagt: Beschleunigung und Vereinfachung.
Mit der statischen Analyse können Sie viele verschiedene Probleme in Ihrem Code finden: vom Missbrauch von Sprachkonstrukten bis zu Tippfehlern. Zum Beispiel anstelle von
auto x = obj.x;
auto y = obj.y;
auto z = obj.z;
Sie haben den folgenden Code geschrieben:
auto x = obj.x;
auto y = obj.y;
auto z = obj.y;
Wie Sie sehen können, befindet sich in der letzten Zeile ein Tippfehler. PVS-Studio gibt beispielsweise die folgende Warnung aus:
V537 Überprüfen Sie die Richtigkeit der Verwendung des Elements 'y'.
Wenn Sie Ihre Hände in diesen Fehler stecken möchten, versuchen Sie es mit einem vorgefertigten Beispiel im Compiler-Explorer: * Klicken *.
Und wie Sie verstehen, ist es nicht immer möglich, sofort auf solche Teile des Codes zu achten, und aus diesem Grund können Sie sich eine gute Stunde lang zum Debuggen hinsetzen und sich fragen, warum alles so seltsam funktioniert.
Dies ist jedoch ein klarer Fehler. Was aber, wenn der Entwickler suboptimalen Code schrieb, weil er die Subtilität der Sprache vergessen hatte? Oder sogar undefiniertes Verhalten im Code erlaubt? Leider sind solche Fälle völlig alltäglich und der Löwenanteil der Zeit wird für das Debuggen von spezifischem Arbeitscode aufgewendet, der Tippfehler, typische Fehler oder undefiniertes Verhalten enthält.
Für diese Situationen erschien eine statische Analyse. Dies ist ein Assistent für den Entwickler, der auf verschiedene Probleme im Code hinweist und in der Dokumentation erklärt, warum es nicht erforderlich ist, auf diese Weise zu schreiben, wozu dies führen kann und wie es behoben werden kann. Hier ist ein Beispiel, wie es aussehen könnte: * klick *.
Weitere interessante Fehler, die der Analysator erkennen kann, finden Sie in den Artikeln:
- Top 10 Fehler in C ++ - Projekten im Jahr 2019
- Top 10 Fehler in C # -Projekten von 2019
- Top 10 Fehler in Java-Projekten von 2019
Nachdem Sie dieses Material gelesen und von der Nützlichkeit der statischen Analyse überzeugt haben, möchten Sie es möglicherweise testen. Aber wo fängst du an? Wie integriere ich ein neues Tool in ein laufendes Projekt? Und wie kann man ihm das Team vorstellen? Antworten auf diese Fragen finden Sie unten.
Hinweis. Die statische Analyse ersetzt oder negiert keine so nützlichen Dinge wie Codeüberprüfungen. Es ergänzt diesen Prozess, indem es hilft, Tippfehler, Ungenauigkeiten und gefährliche Konstruktionen im Voraus zu erkennen und zu korrigieren. Es ist viel produktiver, sich bei der Überprüfung des Codes auf die Algorithmen und die Verständlichkeit des Codes zu konzentrieren, als nach falschen Klammern zu suchen oder langweilige Vergleichsfunktionen zu lesen .
0. Das Instrument kennenlernen
Alles beginnt mit einer Testversion. In der Tat ist es schwierig, sich für eine Implementierung im Entwicklungsprozess zu entscheiden, wenn Sie das Tool noch nie live gesehen haben. Daher besteht der erste Schritt darin, die Testversion herunterzuladen .
Was Sie in dieser Phase lernen werden:
- Wie kann mit dem Analysegerät interagiert werden?
- Ist der Analysator mit Ihrer Entwicklungsumgebung kompatibel?
- Welche Probleme gibt es jetzt in Ihren Projekten?
Nachdem Sie alles installiert haben, was Sie benötigen, müssen Sie zunächst eine Analyse des gesamten Projekts ( Windows , Linux , macOS ) ausführen . Im Fall von PVS-Studio in Visual Studio sehen Sie ein ähnliches Bild:
Der Punkt ist, dass statische Analysatoren normalerweise eine große Anzahl von Warnungen für Projekte mit einer großen Codebasis ausgeben. Sie müssen nicht alle Probleme beheben, da Ihr Projekt bereits funktioniert. Dies bedeutet, dass diese Probleme nicht kritisch sind. Sie können sich jedoch die interessantesten Warnungen ansehenund reparieren Sie sie gegebenenfalls. Dazu müssen Sie die Ausgabe filtern und nur die zuverlässigsten Nachrichten hinterlassen. Im PVS-Studio-Plugin für Visual Studio erfolgt dies durch Filtern nach Fehlerstufen und Kategorien. Lassen Sie für die genaueste Ausgabe nur Hoch und Allgemein aktiviert :
In der Tat sind 178 Warnungen viel einfacher anzuzeigen als einige Tausend ... Gute Warnungen finden Sie häufig auf den
Registerkarten Mittel und Niedrig. Zu diesen Kategorien gehören jedoch auch Diagnosen mit geringerer Genauigkeit (Zuverlässigkeit). Weitere Informationen zu Warnstufen und Optionen für die Arbeit unter Windows finden Sie hier: * Klicken *.
Nachdem Sie die interessantesten Fehler erfolgreich überprüft (und erfolgreich behoben) haben, sollten Sie die verbleibenden Warnungen unterdrücken . Dies soll sicherstellen, dass neue Warnungen bei alten nicht verloren gehen. Darüber hinaus ist ein statischer Analysator ein Programmierhelfer und keine Liste für Fehler. :) :)
1. Automatisierung
Nach dem Meeting ist es Zeit, Plugins zu konfigurieren und in CI zu integrieren. Dies muss erfolgen, bevor Programmierer den statischen Analysator verwenden. Der Punkt ist, dass ein Programmierer möglicherweise vergisst, die Analyse einzuschalten, oder dies überhaupt nicht möchte. Dazu müssen Sie alles endgültig überprüfen, damit nicht verifizierter Code nicht in den allgemeinen Entwicklungszweig gelangt.
Was Sie in dieser Phase lernen werden:
- Welche Automatisierungsoptionen bietet das Tool?
- Ist der Analysator mit Ihrem Build-System kompatibel?
Da es keine perfekte Dokumentation gibt, müssen Sie manchmal schreiben, um den Support zu unterstützen . Dies ist normal und wir helfen Ihnen gerne weiter. :)
Kommen wir nun zu den CI-Diensten (Continuous Integration). Jeder Analysator kann ohne größere Probleme in sie implementiert werden. Dazu müssen Sie eine separate Stufe in der Pipeline erstellen, die normalerweise nach Montage- und Komponententests gefunden wird. Dies erfolgt mit verschiedenen Konsolendienstprogrammen. Zum Beispiel bietet PVS-Studio die folgenden Dienstprogramme:
- PVS-Studio_Cmd.exe (Analyse von Lösungen, C # -, C ++ - Projekten unter Windows)
- CLMonitor.exe (Kompilierungsüberwachung)
- pvs-studio-analyzer (Analyse von C ++ - Projekten unter Linux / macOS)
- pvs-studio-dotnet (Lösungsanalyse, C # -Projekte unter Linux / macOS)
- pvs-studio.jar (Analyse von Java-Projekten)
- PlogConverter (Protokolldateikonverter)
Um die Analyse in CI zu integrieren, müssen Sie drei Dinge tun:
- Installieren Sie den Analysator.
- Analyse ausführen;
- Ergebnisse liefern.
Um beispielsweise PVS-Studio unter Linux (Debian-Basis) zu installieren, müssen Sie die folgenden Befehle ausführen:
wget -q -O - https://files.viva64.com/etc/pubkey.txt \
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list \
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
Auf Windows-Systemen ist es nicht möglich, den Analysator über den Paketmanager zu installieren, aber es ist möglich, den Analysator über die Befehlszeile bereitzustellen:
PVS-Studio_setup.exe /verysilent /suppressmsgboxes
/norestart /nocloseapplications
Weitere Informationen zur Bereitstellung von PVS-Studio auf Windows-Systemen finden Sie * hier *.
Nach der Installation müssen Sie die Analyse direkt ausführen. Es wird jedoch empfohlen, dies erst zu tun, nachdem die Kompilierung und die Tests bestanden wurden. Dies liegt daran, dass die statische Analyse normalerweise doppelt so lange dauert wie die Kompilierung.
Da die Startmethode von der Plattform und den Besonderheiten des Projekts abhängt, werde ich die C ++ (Linux) -Option als Beispiel zeigen:
pvs-studio-analyzer analyze -j8 \
-o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w
Der erste Befehl analysiert und der zweite konvertiert den Bericht in das Textformat, zeigt ihn auf dem Bildschirm an und gibt bei Warnungen einen anderen Rückkehrcode als 0 zurück. Ein ähnlicher Mechanismus ist nützlich, um eine Assembly bei Fehlermeldungen zu blockieren. Sie können jedoch jederzeit das Flag -w entfernen und die Assembly mit den Warnungen nicht blockieren.
Hinweis. Das Textformat ist unpraktisch. Es ist nur ein Beispiel. Achten Sie auf das interessantere Berichtsformat - FullHtml. Sie können damit durch Ihren Code navigieren.
Weitere Informationen zum Einrichten der Analyse in CI finden Sie im Artikel " PVS-Studio und kontinuierliche Integration " (Windows) oder " Einrichten von PVS-Studio in Travis CI""(Linux).
Okay, Sie haben den Analysator auf dem Build-Server eingerichtet. Wenn nun jemand nicht verifizierten Code hochgeladen hat, wird die Überprüfungsphase unterbrochen und Sie können das Problem finden, aber dies ist nicht sehr praktisch, da es effizienter ist, das Projekt nicht danach zu überprüfen Wie die Zweige zusammengeführt wurden und davor in der Pull-Anforderungsphase.
Im Allgemeinen unterscheidet sich das Einrichten der Analyse einer Pull-Anforderung nicht wesentlich vom üblichen Start der Analyse in CI. Abgesehen von der Notwendigkeit, eine Liste der geänderten Dateien abzurufen. Normalerweise können sie durch Anfordern der Differenz abgerufen werden zwischen Zweigen mit Git:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
Jetzt müssen Sie diese Liste der Dateien an den Analysator übergeben. In PVS-Studio wird dies beispielsweise mit dem -S- Flag implementiert :
pvs-studio-analyzer analyze -j8 \
-o PVS-Studio.log \
-S .pvs-pr.list
Weitere Informationen zur Analyse von Pull-Anfragen finden Sie * hier *. Auch wenn Ihr CI nicht in der Liste der im Artikel angegebenen Dienste enthalten ist, ist der allgemeine Abschnitt zur Theorie dieser Art von Analyse für Sie hilfreich.
Durch Konfigurieren der Analyse von Pull-Anforderungen können Sie Commits mit Warnungen blockieren und so eine Grenze erstellen, die nicht verifizierter Code nicht überschreiten kann.
Das ist alles schön und gut, aber ich möchte alle Warnungen an einem Ort anzeigen können. Nicht nur von einem statischen Analysator, sondern auch von Unit-Tests oder von einem dynamischen Analysator. Hierfür gibt es verschiedene Dienste und Plugins. PVS-Studio verfügt beispielsweise über ein Plugin zur Integration in SonarQube .
2. Integration auf Entwicklermaschinen
Jetzt ist es Zeit, den Analysator für den täglichen Entwicklungsgebrauch zu installieren und zu konfigurieren. Zu diesem Zeitpunkt sind Sie bereits mit den meisten Arbeitsmethoden vertraut, sodass dies als der einfachste Teil bezeichnet werden kann.
Als einfachste Option können die Entwickler den erforderlichen Analysator selbst installieren. Dies wird jedoch lange dauern und sie von der Entwicklung ablenken, sodass Sie diesen Prozess mithilfe des Installationsprogramms und der erforderlichen Flags automatisieren können. Für PVS-Studio gibt es verschiedene Flags für die automatisierte Installation . Es gibt jedoch immer Paketmanager wie Chocolatey (Windows), Homebrew (macOS) oder Dutzende von Optionen für Linux.
Dann müssen Sie die erforderlichen Plugins installieren, z. B. für Visual Studio , IDEA ,Fahrer etc.
3. Täglicher Gebrauch
In dieser Phase ist es an der Zeit, einige Worte darüber zu sagen, wie die Leistung des Analysators im täglichen Gebrauch beschleunigt werden kann. Eine vollständige Analyse des gesamten Projekts dauert sehr lange, aber wie oft ändern wir den Code gleichzeitig im gesamten Projekt? Es gibt kaum ein so umfangreiches Refactoring, dass es sofort die gesamte Codebasis betrifft. Die Anzahl der gleichzeitig geänderten Dateien überschreitet selten zehn, daher ist es sinnvoll, sie zu analysieren. Für eine solche Situation gibt es einen inkrementellen Analysemodus . Sei einfach nicht beunruhigt, dies ist kein anderes Werkzeug. Dies ist ein spezieller Modus, in dem Sie nur geänderte Dateien und ihre Abhängigkeiten analysieren können. Dies geschieht automatisch nach dem Build, wenn Sie in der IDE mit installiertem Plugin arbeiten.
Wenn der Analysator Probleme im kürzlich geänderten Code feststellt, meldet er dies selbstständig. PVS-Studio informiert Sie beispielsweise anhand einer Benachrichtigung darüber: Es
reicht natürlich nicht aus, die Entwickler anzuweisen, das Tool zu verwenden. Wir müssen ihnen irgendwie sagen, was es ist und wie es ist. Hier finden Sie beispielsweise Artikel zum Schnellstart von PVS-Studio. Sie finden jedoch ähnliche Tutorials für jedes Tool, das Sie bevorzugen:
- So führen Sie PVS-Studio unter Windows aus (C, C ++, C #)
- So führen Sie PVS-Studio unter Linux und MacOS aus (C, C ++)
- So starten Sie PVS-Studio Java
Solche Artikel enthalten alle für den täglichen Gebrauch notwendigen Informationen und nehmen nicht viel Zeit in Anspruch. :)
Schon beim Kennenlernen des Tools haben wir bei einem der ersten Starts viele Warnungen unterdrückt. Leider sind statische Analysegeräte nicht perfekt, daher geben sie von Zeit zu Zeit falsch positive Ergebnisse. Es ist normalerweise einfach, sie zu unterdrücken. Beispielsweise reicht es im PVS-Studio-Plugin für Visual Studio aus, auf eine Schaltfläche zu klicken:
Sie können sie jedoch nicht nur unterdrücken. Beispielsweise können Sie dem Support ein Problem melden. Wenn es möglich ist, Fehlalarme zu beheben, werden Sie in zukünftigen Updates möglicherweise feststellen, dass jedes Mal weniger Fehlalarme für Ihre Codebasis spezifisch sind.
Nach der Integration
Wir haben also alle Phasen der Integration der statischen Analyse in den Entwicklungsprozess durchlaufen. Trotz der Wichtigkeit, solche Tools in CI einzurichten, ist der Computer des Entwicklers der wichtigste Ausgangspunkt. Schließlich ist ein statischer Analysator kein Richter, der irgendwo weit von Ihnen sagt, dass der Code wertlos ist. Im Gegenteil, es ist ein Assistent, der Sie auffordert, wenn Sie müde sind, und Sie daran erinnert, wenn Sie etwas vergessen haben.
Ohne regelmäßige Verwendung ist es jedoch unwahrscheinlich, dass eine statische Analyse die Entwicklung erheblich vereinfacht. Schließlich liegt der wichtigste Vorteil für den Entwickler nicht darin, komplexe und kontroverse Codeabschnitte zu finden, sondern darin, sie frühzeitig zu erkennen. Stimmen Sie zu, dass es nicht nur unangenehm, sondern auch sehr lang ist, das Problem zu finden, wenn die Änderungen getestet wurden. Bei regelmäßiger Verwendung der statischen Analyse werden alle Änderungen direkt auf Ihrem Computer überprüft und verdächtige Stellen gemeldet, während Sie am Code arbeiten.
Wenn Sie oder Ihre Kollegen immer noch nicht sicher sind, ob es sich lohnt, den Analysator zu implementieren, empfehlen wir Ihnen, den Artikel " Gründe für die Implementierung des statischen Code-Analysators PVS-Studio im Entwicklungsprozess " zu lesen". Es geht auf die typischen Bedenken von Entwicklern ein, dass statische Analysen ihre Zeit in Anspruch nehmen und so weiter.
Wenn Sie diesen Artikel einem englischsprachigen Publikum zugänglich machen möchten, verwenden Sie bitte den Übersetzungslink: Maxim Zvyagintsev. Statische Analyse: Vom Einstieg bis zur Integration .
