Dmitry Nikolaev - stock.adobe.co

Statische und dynamische Code-Analyse zusammen einsetzen

Jeder Programmierer möchte auf Anhieb einen leistungsstarken, sicheren und fehlerfreien Code liefern. Wirksame Code-Analysetechniken unterstützen dabei.

Wenn man Entwicklungsteams fragt, was ihr primäres Ziel ist, lauten die drei häufigsten Antworten:

  • schreiben von fehlerfreiem Code
  • erfüllen der Designspezifikationen
  • Sicherheitsprobleme verhindern

Damit stellt sich die Frage: Wie können Teams ihren generierten Code überprüfen, um sicherzustellen, dass die drei Hauptziele erreicht werden?

Die Code-Analyse ist die einfachste Antwort auf diese Frage – die allerdings weitere Fragen auslöst. Sollte es eine statische Code-Analyse sein? Oder besser eine dynamische Code-Analyse? Oder vielleicht beides?

Wir wollen zunächst analysieren, inwiefern statische und dynamische Code-Analyse eine wichtige Rolle bei der Entwicklung spielen und wie diese beziehungsweise ihre Unterschiede zur Gestaltung des Codes beitragen.

Wie unterscheiden sich statische und dynamische Code-Analyse?

Bei der statischen Code-Analyse wird der Programmcode untersucht, um Probleme in der Logik und den Techniken zu erkennen. Der Quellcode wird hierbei einer Reihe formaler Prüfungen unterzogen, bei denen bestimmte Arten von Fehlern entdeckt werden können, noch bevor die entsprechende Software ausgeführt wird. Bei der dynamischen Code-Analyse wird der Code hingegen ausgeführt und das Ergebnis untersucht, was auch das Testen möglicher Ausführungspfade des Codes beinhaltet.

Selbst in der rudimentärsten Form führen Entwicklungsteams beim Testen des Codes eine dynamische Analyse durch. Und wenn Programmierer den Code überprüfen, führen sie eine statische Analyse durch. Unabhängig davon, welche Tools sie verwenden, führen Entwickler und Programmierer eine Analyse durch, die letztendlich dazu beiträgt, besseren Code zu erstellen.

Weder statische noch dynamische Code-Analyse ist für sich genommen die ideale Option. Das bedeutet, dass Teams beides nutzen und den Code auf diese Weise optimieren sollten. Entwicklungsteams dürfen sich die statische und die dynamische Code-Analyse nicht als Alternativen vorstellen. Betrachten Sie sie stattdessen als komplementär und symbiotisch.

Code-Review ist statischen Analyse ähnlich

Betrachten Sie Code-Review und statische Code-Analyse als verwandte Begriffe. Code-Reviews helfen dabei, Codeprobleme zu finden, ohne dass teure und zeitaufwändige dynamische Tests durchgeführt werden müssen. Die statische Code-Analyse, die im Rahmen eines Code-Reviews durchgeführt wird, ist der erste und wichtigste Schritt bei der Entwicklung und Wartung guter Software.

Die meisten statischen Code-Analysen werden mit Tools und automatisiert durchgeführt. Diese bewerten den Code und suchen nach Fehlern oder nicht empfohlenen Techniken und Praktiken. Die Bandbreite reicht von der Sicherstellung von einfachen Coding-Standards über die Prüfung von Typumwandlungen und Bereichsgrenzen über die Suche nach bestimmten Arten von Speicherlecks bis hin zur technischen Verifikation von Quelltext.

Unternehmen, die die statische Code-Analyse als Bestandteil des Code-Reviews betrachten, werden wahrscheinlich zuerst formelle Code-Überprüfungen durchführen, dann die statischen Code-Analyse-Tools anwenden und schließlich die Ergebnisse mit dem Code-Review-Prozess ihrer Wahl überprüfen.

Wenn ein Unternehmen beschließt, den Code zunächst mit einem Programmierer und einem Mentor zu überprüfen, kann es in Erwägung ziehen, zunächst die statische Code-Analyse einzusetzen. Mit diesem Ansatz werden wahrscheinlich mindestens 85 Prozent der Codefehler erkannt, und der Experte spart wertvolle Zeit bei der Identifizierung der Fehler.

Die statische Code-Analyse und -Überprüfung eignet sich besonders gut für schnelle Entwicklungs- und GitOps-Umgebungen, in denen häufig Änderungen an einer einzigen Komponente vorgenommen werden. Wenn zum Beispiel das Softwaredesign das Verhalten der Komponenten richtig isoliert hat, wird die statische Analyse die meisten Codefehler aufdecken.

Warum also eine dynamische Analyse?

Die Antwort auf diese Frage ist einfach: Die statische Analyse findet nicht jeden Codefehler.

Sie ist vor allem dann begrenzt, wenn es darum geht, Probleme in komplexen Anwendungen zu lösen, die aus mehreren Komponenten bestehen. Die statische Analyse bietet auch wenig Wert, wenn Sie die Leistung messen oder Richtlinien für die Skalierung und/oder den Lastausgleich testen wollen. Bei diesen Einschränkungen kommt die dynamische Code-Analyse ins Spiel.

Koordinieren Sie dynamische und statische Analyse

So wie Entwicklungsteams die statische Code-Analyse bereits routinemäßig einsetzen, auch wenn sie nicht formell vorgeschrieben ist oder verwaltet wird, verwenden sie auch die dynamische Code-Analyse. Grundprinzip der dynamischen Analyse ist die kontrollierte Ausführung der zu testenden Software mit systematisch festgelegten oder generierten Eingabedaten. Routinemäßige Softwaretests und die Ausführung von Software zum Verifizieren eines Fixes oder zur Validierung der ursprünglichen Implementierung sind Formen der dynamischen Code-Analyse.

Es geht also nicht um die Frage: statische Code-Analyse oder dynamische Code-Analyse? Die Teams verwenden wahrscheinlich bereits beides. Die Frage ist nur, wie man beide effektiv einsetzt.

Die statische Code-Analyse wird am besten mit einm Code-Review kombiniert. Die dynamische Code-Analyse eignet sich für eine Form des automatisierten Testens und der Generierung von Testdaten.

Teams sollten sich bei der dynamischen Code-Analyse zunächst auf die Bereiche konzentrieren, in denen die statische Analyse wahrscheinlich unwirksam ist. Beispiele dafür sind die Leistung von Komponenten, die Anwendungs-Performance, die Anwendungslogik, die Sicherheitsvalidierung und das Überschreiten von Komponentengrenzen.

Automatisierte Tools zur Generierung von Testdaten wie Redgate SQL Data Generator und DTM Data Generator – um nur einige zu nennen – simulieren beispielsweise den Betrieb einer Anwendung unter Volllast. Sie validieren auch alle logischen Pfade und testen, ob diese Punkte Sicherheitslücken aufweisen. Möglicherweise verwendet ein Unternehmen diese Tools bereits, aber es ist wichtig, dass sie die spezifischen Bereiche testen, die bei der statischen Analyse am ehesten übersehen werden.

Leistungs- und Lasttests lassen sich mit weit verbreiteten Tools und Verfahren leicht automatisieren. Logik- und Sicherheitsvalidierung sind mit jeder Form von automatisierten Tests mit generierten Daten schwieriger einzurichten. Teams müssen den Schwerpunkt auf das Testdesign legen und Tools für die Datengenerierung mit feldspezifischen Werteinschränkungen sorgfältig auswählen, um Tests durchzuführen und damit potenzielle Probleme zu identifizieren. Bei der Sicherheitsvalidierung sollten die Teams die Werte des Testdatenbereichs über den normalen Betrieb hinaus erweitern, um zu gewährleisten, dass sie keine potenziellen Problembereiche schaffen.

Die Debatte um statische und dynamische Code-Analyse ist ein Indikator für einen Fehler in vielen Entwicklungsstrategien, die eher einzelne Schritte als den Gesamtprozess betrachten. Sowohl die statische als auch die dynamische Code-Analyse spielen im Rahmen eines integrierten Entwicklungs- und Bereitstellungsprozesses eine wichtige Rolle. Ohne das jeweils andere werden sie Ihnen wahrscheinlich keine guten Dienste leisten.

Erfahren Sie mehr über Softwareentwicklung