Parasoft
Fehlerfreier Code, sichere Anwendung
Statische Analyse ermöglicht es Software-Entwicklern, die Codequalität von Anfang an hochzuhalten. Das frühzeitige und häufige Prüfen auf Fehler und deren Behebung reduziert den Arbeitsaufwand und hilft dabei, Software-Schwachstellen zu vermeiden.
Es ist verlockend, bei der Software-Entwicklung in die übliche Falle zu tappen: Man prüft die Qualität in der Regel am Ende einfach in das Softwareprojekt hinein, anstatt von vornherein bessere Software zu entwickeln. Dieser Ansatz der Qualitätskontrolle stützt sich auf Unit- oder Funktionstests. Man sollte unbedingt der Versuchung widerstehen, so vorzugehen. Eingebaute Qualität kann auch von Anfang an Teil der Software sein. Die einfachste und effektivste Maßnahme ist hierbei der Einsatz der statischen Analyse: Sie hilft Software-Ingenieuren Fehler zu vermeiden, den Code zu härten und gleichzeitig die Anwendungslieferung zu beschleunigen.
Was ist statische Code-Analyse?
Die statische Code-Analyse oder einfach statische Analyse ist eine Softwaretestaktivität in der Software-Entwicklung. Dabei wird der Quellcode auf Konstrukte untersucht, von denen eine Verbindung mit Softwarefehlern oder Sicherheitsschwachstellen bekannt ist. Bei Entdeckung eines Konstrukts mit hohem Risiko meldet das statische Analysetool einen Verstoß, den der Entwickler anzeigen und beheben kann.
Es gibt einige Hauptarten der statischen Analyse – jede mit ihren eigenen Stärken und Schwächen:
- Musterbasierte statische Analyse: In seiner einfachsten Form scannt ein statisches Analysewerkzeug den Quellcode und prüft ihn anhand einer oder mehrerer Regelwerke. Ingenieure machen beispielsweise manchmal den Fehler, die Zeichenfolge „\0“ zu verwenden, obwohl eigentlich das Null-Zeichen ‚\0‘ gemeint ist. Dieser Fehler kann zu einer Beschädigung des Speichers führen, das Programm zum Absturz bringen oder ähnlich folgenschwere Probleme mit sich bringen. Ein statisches Analysetool sucht nach diesen Mustern im Code und meldet sie als mögliche Fehler. Diese Art der statischen Analyse nennt sich musterbasierte statische Analyse. Bei einigen Mustern handelt es sich um einfache Syntaxprüfungen, ähnlich wie bei einer Rechtschreibprüfung beim Tippen. Andere können sehr viel ausgefeilter sein und komplette Muster mit subtilen Problemen analysieren und erkennen. Bei dieser statischen Analyse kommt es fast nie zu falsch-positiven Ergebnissen. Moderne Software-Entwicklungsstandards wie MISRA (Motor Industry Software Reliability Association) und JSF (Joint Strike Fighter) basieren auf der Idee, dass bestimmte Konstrukte in sicherheitskritischem Code vermieden werden sollten, da der Code in solchen Systemen Probleme verursachen kann.
- Fluss-Analyse: Die Fluss-Analyse, manchmal auch Kontrollfluss- oder Datenfluss-Analyse genannt, verfolgt einen etwas anderen Ansatz, indem sie problematische Konstruktionen anhand einer Reihe von Regeln überprüft. Dabei simuliert sie Entscheidungspfade, um tiefer in die Anwendung einzudringen und schwer aufzufindende Fehler aufzuspüren. Diese Fehler können beispielsweise Nullzeiger-Dereferenzen, Pufferüberläufe und Sicherheitsmängel wie manipulierte Daten sein. Die Fluss-Analyse kann echte Fehler finden, beinhaltet allerdings eine gewisse Anzahl falsch-positiver Ergebnisse.
- Zusätzliche Analysetypen: Weitere Arten der statischen Analyse verfolgen jeweils unterschiedliche Ziele. So messen Metrik-Analysetools beispielsweise Code-Merkmale wie Code-Zeilen und Komplexität. Tools zur Abdeckungsanalyse führen Unit- und Anwendungstests für ein besseres Verständnis der Art des Tests durch. Der gemeinsame Einsatz dieser Analysen als Teil eines automatisierten Entwicklungstestprozesses verschafft einen wichtigen Einblick in die Sicherheit und Zuverlässigkeit der Anwendung.
Risiken einer nicht-durchgeführten statischen Analyse
Der Umfang einer Software wird immer komplexer. So kann ein durchschnittliches Auto heute über 1.000 Code-ausführende MCUs und bis zu 100 Millionen Codezeilen enthalten. Eine so große elektronische Oberfläche, insbesondere bei sicherheitskritischen Anwendungen wie in der Automobilindustrie, in medizinischen Geräten oder in der Luftfahrt, erfordert einen rigorosen technischen Ansatz für die Erhaltung eines fehlerfreien Codes.
Organisationen wie OWASP, CERT und MITRE haben sich der Erforschung und Veröffentlichung von Best Practices für die Programmierung verschrieben. Sie unterstützen so Softwareingenieure bei der erfolgreichen Durchführung ihrer Software-Projekte. Darüber hinaus gibt es branchenspezifische Standardisierungsorganisationen, die Best Practices veröffentlichen, welche von vielen Regulierungsbehörden verlangt werden. Beispielsweise von MISRA, die sich auf Software-Systeme für die Automobilindustrie spezialisiert hat. Die Best Practices können in Tools für die statische Analyse als Regeln kodifiziert und dann als Teil der Unternehmensrichtlinien eingebaut werden, welche die Entwickler befolgen müssen.
Der Einsatz eines statischen Analysetools, das diese Programmierstandards implementieren und gleichzeitig in den Entwicklungsprozess integriert werden kann, ist wichtig. Wer seine Arbeit nicht mit mindestens einem statischen Analysewerkzeug überprüft, erhöht das wirtschaftliche Risiko bei der Freigabe oder Bereitstellung der Anwendungen erheblich. Fehler können zu einem angreifbaren Code führen, über den böswillige Hacker beispielsweise das System zum Absturz bringen oder sensible Daten offenlegen können. Bei sicherheitskritischer Software sind die Folgen von Software-Schwachstellen unter Umständen noch weitaus gravierender.
Vorteile der automatisierten statischen Analyse
Relative Kosten zur Fehlerbehebung, basierend auf dem Zeitpunkt der Entdeckung
© National Institute of Science and TechnologyDas Ausführen der statischen Analyse auf dem Desktop bringt mehrere Vorteile und eignet sich für kleine Teams oder Projekte. Große Organisationen hingegen sollten die statische Analyse auch als Teil von Nightly Builds und der kontinuierlichen Integration automatisieren. Als integraler Bestandteil des Entwicklungsprozesses verschafft die statische Analyse des Codes eine Reihe von Vorteilen, darunter die folgenden:
Kürzere Entwicklungszyklen: Werden statische Analysen konsequent in den frühen Projektphasen ausgeführt, ermöglicht das das Finden und Beheben von systemischen Fehlen, wenn die Kosten für die Beseitigung am niedrigsten sind. Dieser Prozess kann anfangs mehr Zeit in Anspruch nehmen als die schnelle Entwicklung der Software ohne Analyse. Im Laufe des Entwicklungszyklus steigen die Effizienzgewinne aber exponentiell. Die Behebung einiger Fehler ist später nur noch bedingt möglich – das macht ein frühzeitiges Auffinden entscheidend.
Gute statische Analysetools enthalten zudem eine anschauliche Dokumentation über den implementierten Programmierstandard, wodurch sich das Programmierwissen und die berufliche Entwicklung der Softwareingenieure erweitern. Im Laufe der Zeit verbessert das Einhalten dieser Standards die durchschnittliche Qualität des Codes, weil das ständige Feedback die Leistung der Programmierer steigert. Verfügt das statische Analysetool über ein breiteres Ökosystem mit der Möglichkeit zum Priorisieren der Aufgaben zur Fehlerbehebung, kann die Bereitstellung der Software noch schneller erfolgen.
- Niedrigere Fehlerrate: Die statische Analyse hilft beim frühzeitigen Auffinden und Beheben von Fehlern und verhindert dadurch das erneute Auftreten von systemischen Fehlern in der Folgezeit. Wer die Strategie der frühzeitigen Erkennung verfolgt, hat Vorteile bei der Fehlervermeidung. Zudem senkt sie die Fehlerrate im Laufe des Entwicklungszyklus bemerkbar.
- Kontinuierliche Verbesserung: Der Begriff DevOps beschreibt eine Sammlung von Praktiken, die die abteilungsübergreife Zusammenarbeit und Kommunikation erleichtern. Diese ist notwendig, um Unternehmen bei der Optimierung und Beschleunigung ihrer Entwicklungs- und Lieferprozesse zu unterstützen. Durch das Teilen von Fachwissen und Aufgaben über Abteilungsgrenzen hinweg schaffen Unternehmen einen effizienten Prozess zur Beschleunigung des SDLC (Software Development Lifecycle) bei gleichzeitiger Verbesserung der Qualitätsprozesse.
Damit diese Methode effektiv ist, muss jedoch eine automatisierte Feedbackschleife implementiert werden, die die durchgängige Anwendung von Qualitätsrichtlinien auf dem Weg von der Erstellung der Anforderungen zur Produktion ermöglicht.
Die automatisierte statische Analyse ist nicht nur der Mechanismus für die Rückkopplungsschleife. Sie generiert auch die Daten, die andere Abteilungen für den Zugriff und die effektive Zusammenarbeit im Rahmen des DevOps-Modells benötigen. Insbesondere in Verbindung mit Unit- und Regressionstests erfüllt die statische Analyse mehrere Funktionen, darunter
- die Sicherstellung der Codequalität,
- Bereitstellung der zur Verbesserung des Entwicklungsprozesses erforderlichen Big Data,
- die Erleichterung der Mechanismen der automatisierten DevOps-Feedback-Schleife.
Als Ergebnis wird die statische Analyse zu einem Mittel für die kontinuierliche, automatisierte Prozessverbesserung. Sie hilft Entwicklern, die während der Freigabe entdeckten Fehler zu verstehen und zu untersuchen. Zudem kann die Qualitätssicherung feststellen, ob es eine Methode gibt, den Code zu härten, und sie kann die Gefahr beseitigen, dass diese Fehler in Zukunft wieder auftreten.
Lösung für die statische Analyse
Auf dem Markt sind mehrere statische Analysetools verfügbar, die von Open-Source-Dienstprogrammen bis hin zu vollständigen Entwicklungstestsuiten reichen. Darunter bietet die Softwarelösung Parasoft C/C++test eine integrierte Plattform für die Automatisierung eines breiten Spektrums von Softwarequalitätspraktiken für mehrere Programmiersprachen, und liefert zudem aussagekräftige und umfassende Berichte und, unterstützt vom DTP Reportingtool, optionale intelligente Analysen. Für C und C++ bietet sie eine vollständige Palette an statischen Code-Analysefunktionen und über 2.200 Regeln (Höchststand unter den Tools auf dem Markt, basierend auf Implementierungen von MISRA, MISRA C++, Scott Meyers‘ Effective C++, Effective STL und anderen etablierten Quellen). Zusätzlich stellt diese Entwicklungstestlösung eine einheitliche Lösung für das Entwicklungsverfahren bereit.
In punkto Funktionalität generiert und realisiert sie automatisierte Unittests, ermöglicht verschiedene Arten der Code-Abdeckung, einschließlich der Abdeckung von Zeilen, Anweisungen, Blöcken, Pfaden, Entscheidungen bzw. Verzweigungen, einfachen Bedingungen und MC/DC. Sie beinhaltet Laufzeitanalysen und ein Tool-Qualifizierungs-Kit für die Einhaltung funktionaler Sicherheitsstandards. Mit der statischen Analyse von Parasoft können Benutzer Code analysieren, und sie in ihre automatisierten Builds integrieren, um Fehler kontinuierlich und automatisch verhindern.
Um automatisierte Arbeitsabläufe zu erhalten, die die Zusammenarbeit und Effizienz verbessern, lassen sich diese statischen Analyse-Engines in Parasoft DTP integrieren, das Arbeitsabläufe für die Integration von Qualität in den SDLC enthält. Dadurch können Benutzer ihre Entwicklungsrichtlinien definieren und dann automatisch nicht-funktionale Anforderungen durchsetzen. Beispielsweise wird die statische Analyse automatisch während des Builds ausgeführt, Verstöße an DTP gemeldet, wo sie bearbeitet werden, und die Ergebnisse an die IDE des Ingenieurs zurückgeschickt, um sie zur Behebung anzuzeigen.
DTP führt auch intelligente Analysen durch, die es diesen Workflows ermöglichen, die Qualität und das Risiko der Software-Entwicklung automatisch zu bewerten. So kann DTP beispielsweise nach systemischen Problemen im Zusammenhang mit dem Programmierprozess suchen oder eine schwerwiegende Verletzung im von einem Junior-Ingenieur produzierten Code mit einer Reihe von Einheitstests und Abdeckungsinformationen korrelieren, um zu ermitteln, wie hoch das Risiko des Moduls ist. Deutet die Korrelation auf ein Risikoniveau oberhalb eines bestimmten Schwellenwerts hin, kann der Verstoß einen speziellen Workflow zur kontinuierlichen Prozessverbesserung auslösen, der zusätzlich zu den normalen Fehlerbehebungsaufgaben eine Peer-Code-Überprüfung und zusätzliche Analysen umfasst.
Fazit
Der Autor: Arthur Hicken ist in den Bereichen Software-Security und Testautomatisierung bei Parasoft tätig.
© ParasoftDie statische Codeanalyse spielt eine wichtige Rolle, um sicherzustellen, dass Anwendungen wie erwartet funktionieren. Sie erhöht nicht nur die Geschwindigkeit des Entwicklungsteams insgesamt, sondern schmälert auch die mit der Freigabe potenziell gefährlicher Software verbundenen Risiken.

















