Die statische Codeanalyse (SCA) ist eine Methode, um Computer-Quellcode auf Fehler, Sicherheitslücken und suboptimalen Code zu überprüfen, ohne das Programm auszuführen. Sie verwendet automatisierte Tools, um Code zu scannen und erweiterte Analysen in Echtzeit durchzuführen.
Auch bekannt als Quellcode-Analyse, identifiziert die statische Codeanalyse logische Fehler und Speicherlecks, bevor Anwendungen ausgeführt werden, wodurch die Debugging-Zeit reduziert wird. Sie sucht automatisch nach Syntaxfehlern und versteckten Sicherheitslücken, die von Menschen übersehen werden könnten. Sie setzt Codierungsstandards durch, trägt zur Einhaltung gesetzlicher Vorschriften in großen Teams bei und beschleunigt generell die gesamte Entwicklung.
Die statische Codeanalyse findet im Gegensatz zur dynamischen Codeanalyse vor der Codeausführung statt. Dynamische Analysen beinhalten das Ausführen der Anwendung und die Beobachtung ihres Verhaltens. Im Gegensatz dazu behandelt die statische Analyse den Quellcode als einen strukturellen Datensatz, den sie scannt, um Probleme zu identifizieren, bevor die Anwendung überhaupt kompiliert, verpackt oder bereitgestellt wird. Dieser Ansatz bestimmt, wie sich das Programm auf der Grundlage seiner Struktur verhalten wird. Beide Techniken sind wichtig für eine allgemeine Qualitätssicherung innerhalb eines DevOps- oder DevSecops-Frameworks.
Bleiben Sie mit dem Think-Newsletter über die wichtigsten – und faszinierendsten – Branchentrends in den Bereichen KI, Automatisierung, Daten und mehr auf dem Laufenden. Weitere Informationen finden Sie in der IBM Datenschutzerklärung.
Die statische Codeanalyse besteht aus drei Hauptphasen.
Der Analyzer liest den Quellcode und zerlegt ihn in Token. Diese werden in einen Parser eingespeist, der sie anhand der Grammatikregeln einer bestimmten Programmiersprache auswertet und sie in einen hierarchischen abstrakten Syntaxbaum (AST) umstrukturiert. Der AST bildet die Struktur der Software in einem maschinenlesbaren Format ab.
Der Analyzer erstellt einen Control Flow Graph (CFG), um Ausführungspfade abzubilden, kombiniert mit Datenflussanalysen, um zu verfolgen, wie Variablen die Werte von der Initialisierung bis zur Nutzung ändern. Dies ist die Phase, in der der Analyzer Fehler wie toten Code (Code, der niemals ausgeführt werden kann) entdeckt.
Mit Hilfe der AST- und Flow-Modelle prüft das Tool den Code anhand von Codierungsrichtlinien und Heuristiken. Diese reichen von einfachen Namenskonventionen bis hin zu ausgefeilteren Sicherheitsüberprüfungen wie der Taint-Analyse, die fehlerhafte Eingaben verfolgt, die zu SQL-Injections führen könnten.
In den Anfängen der Computertechnik war die Codeausführung teuer und Entwickler konnten es sich nicht leisten, Rechenleistung mit der Fehlersuche zu verschwenden. Die Verifizierung erfolgte ausschließlich durch menschliche Intelligenz, mit langsamen und manuellen Überprüfungen des Codes.
Die Entwicklung von Lint im Jahr 1978 durch Stephen C. Johnson bei Bell Labs markiert den Beginn der modernen statischen Codeanalyse. Lint wurde für das Unix-Betriebssystem entwickelt und dient dazu, Quellcode zu scannen und verdächtige Konstruktionen vor der Kompilierung zu kennzeichnen.
Lint identifizierte problematischen Code, der entfernt werden konnte, ohne die Programmlogik zu verändern, wodurch wertvolle Rechenzeit eingespart wurde. Johnson benannte Lint nach den Flusen, die im Filter eines Wäschetrockners übrig bleiben, weil sein Tool unerwünschten problematischen Code (Flusen) entfernte, ohne die Logik (die Struktur der Kleidung) zu verändern.
Mit dem Aufkommen des Internets in den 1990er und 2000er Jahren wuchs auch der Bedarf, Sicherheitslücken zu schließen. Um dieser Nachfrage gerecht zu werden, entstanden neue Tools sowie komplexere Analyseformen, die Code in mathematische Modelle kompilierten, um zu verfolgen, wie sich die Variablen verschieben. Um diesen Bedrohungen entgegenzuwirken, entstanden neue Frameworks wie die das statische Testen der Anwendungssicherheit (SAST), während Methoden wie das dynamische Testen der Anwendungssicherheit (DAST) eine Laufzeitbewertung ermöglichten.
Diese Techniken waren zwar mathematisch präzise, wiesen aber aufgrund ihrer begrenzten Fähigkeit, den Kontext zu verstehen, hohe Falsch-Positiv-Raten auf. Das Aufkommen von maschinellem Lernen und großen Sprachmodellen (LLMs) in den 2020er Jahren löste eine neue Ära der Codeanalyse aus, in der Modelle mit Milliarden von Codezeilen trainiert werden konnten. Durch dieses Training konnte auf die Absicht des Entwicklers und den semantischen Kontext geschlossen werden.
Ursprünglich war die statische Codeanalyse ein Gatekeeper-Prozess, der vor der Veröffentlichung durchgeführt wurde, heute wird diese Analyse jedoch während des gesamten Softwareentwicklungszyklus (SDLC) durchgeführt. Diese „Shift-Left“-Philosophie beinhaltet die Verlagerung des Testens „nach links“, also näher an die Erstellung des Codes.
Heute sind Code-Analysetools wie SonarQube, ESLint und GitHub Advanced Security ein integraler Bestandteil des Workflows von Entwicklern.. Sie werden innerhalb integrierter Entwicklungsumgebungen (IDEs) ausgeführt, um Fehler in Echtzeit während der Eingabe durch den Entwickler zu kennzeichnen. Sie fungieren auch als automatisierte Kontrollpunkte innerhalb der kontinuierlichen Integration und kontinuierlichen Bereitstellung oder CI/CD-Pipelines.
Moderne Programmierassistenten mit maschinellem Lernen ermöglichen eine dezentrale Codeanalyse, die schnell und weitgehend unsichtbar ist, sodass Entwickler Fehler frühzeitig erkennen und die Codequalität in Echtzeit verbessern können. IBM Bob zum Beispiel enthält einen Workflow zur Überprüfung, der in einem separaten Panel ausgeführt wird und automatisch nach Code-Gerüchen sucht und Verstöße gegen Codierungsstandards markiert, die Benutzer dann ablehnen oder von Bob automatisch lösen lassen können.
Die Analyse kann auch proaktiv durch strategischer Prompting erfolgen. Anstatt beispielsweise einen Programmierassistenten zu bitten, „Bugs zu finden“, kann ein Entwickler ihn bitten, Repositorys mit bestimmten Zielen vor Augen zu überprüfen. Zur Überprüfung der Architektur kann man ihn bitten, die Verzeichnisorganisation, die Einstiegspunkte, die Komponentenbeziehungen und den gesamten technischen Stack zu überprüfen und dabei eine detaillierte Dokumentation zu erstellen. Ein Prompt zur Analyse des Datenbankdesigns kann Modernisierungsziele identifizieren. Spezialisierte Prompts prüfen Datenbankdesign, Migrationsanalysen führen und eine umfassende Überprüfung technischer Schulden durch, mit Empfehlungen, wie Probleme am strategischsten behoben werden können.
Beschleunigen Sie die Softwarebereitstellung mit Bob, Ihrem KI-Partner für sichere, absichtsorientierte Entwicklung.
Entwickeln, bereitstellen und verwalten Sie KI-Anwendungen schneller mit unternehmensgerechten Tools.
Gestalten Sie Altsysteme durch intelligente KI-Modernisierung neu.