Zum Inhalt gehen

Warum Maschinen die Qualitätssicherung von Code übernehmen sollten

Dr. Eldar Sultanow
02. Dez. 2020

Machine Learning kann Qualität von Code sicherstellen und Fehler bereits in der Entwicklung erkennen.

Drei Generationen SCA, ein Schwachpunkt: die Vorab-Regeldefinition

Die Idee, Maßnahmen zur Qualitätssicherung von Code zu automatisieren, ist nicht neu, die Statische Code Analyse (SCA) reicht bis in die späten Siebziger Jahre zurück. Was sind Statische Code Analysen, kurz SCAs? Statische Code Analysen sind Verfahren die, im Gegensatz zur Dynamischen Code Analyse (DCA) Qualitätsprüfungen an der Software vornehmen, ohne dass diese ausgeführt wird. Dies geschieht während der Kompilierungszeit, d. h. in der Zeitspanne zwischen der Verarbeitung des Inputs bis zum Output. In unserem Fall: Die Zeit, bis überprüft wurde, ob der Code korrekt ist. Je nachdem, wie gut die Regeln und Muster festgelegt sind, erkennt das System vorhandene Fehler schneller oder später und sichert die Qualität des Codes. Allen drei Vorgängergenerationen ist jedoch gemein, dass die qualitätssichernden Regeln von der Software nicht selbstständig erkannt, sondern bereits im Vorfeld definiert sein müssen. Die selbstlernende Maschine hingegen findet die Regeln selbst. Um nicht zu sehr in technische Details abzudriften, seien die drei Generationen an dieser Stelle nur kurz genannt.

  1. Generation: Lint, das erste Tool zur Analyse von Quellcode schaffte nur eine Datei pro Scan
  2. Generation: ganzheitliche Betrachtung des Datenflusses über mehrere Codedateien hinweg
  3. Generation: Continous Integration – die automatisierte Zusammenführung von geändertem Code und zentralem Hauptcode

Alle drei Generationen identifizieren Code-Schwachstellen über Verletzungen vordefinierter Regeln. Heute werden zwar komplexere Regelwerke genutzt, das Prinzip bleibt jedoch gleich. Prüfregeln im Vorfeld zu definieren hat leider einen entscheidenden Nachteil: Die identifizierten Fehler haben meist im Produktivbetrieb zuvor stattgefunden, resultierende Regelsätze sind daraus abgeleitet. Somit ist es quasi unmöglich, Regeln im Vorfeld aufzustellen, die alle – auch zuvor unbekannte – Fehler während der Kompilierungszeit erkennen. Machine Learning kann dieses Defizit gut ausgleichen, dazu ein Beispiel.

Praxisbeispiel: Iteratives Lernen aus Fehlern ist schmerzhaft und kostspielig

Aus Fehlern lernen, nachdem sie aufgetreten sind, kann schmerzlich sein – vor allem je, kritischer und größer das Softwareprojekt ist. Ein Beispiel: Bei einem umfangreichen öffentlichen IT-Verfahren mit 80 Entwicklern, 800.000 Code-Zeilen und zwei Milliarden Euro an monatlichen Transaktionen musste ein Hotfix für einen Fehler im Produktivbetrieb her. Im Flurfunk wurde das Problem thematisiert und es zeigte sich, dass bereits an vier Stellen ähnlicher Code im System vorhanden war und an der verursachenden Stelle lediglich eine Anweisung abwich. Allerdings überblickt man bei 800.000 Zeilen Code derartige Muster nicht mehr ohne Weiteres. Dies brachte uns auf die Idee, Machine Learning als Tool in Betracht zu ziehen. Die resultierende Lösung haben wir im Oktober 2017 entwickelt und sie ist mittlerweile im Einsatz.

4. Generation: Statische Code Analyse mit Hilfe künstlicher Intelligenz

Unser Ansatzpunkt: Müssen Fehler erst passieren, um das Regelwerk erweitern zu können? Maschinelles Lernen (ML) als Teilgebiet der Künstlichen Intelligenz (KI) bietet hier einen Ausweg, da sich das z.B. für eine Warenkorbanalyse beliebte Prinzip der Mustererkennung auch auf SCA anwenden lässt. Die Warenkorbanalyse trifft Aussagen wie „Ein Kunde, der Lachs kauft, kauft mit hoher Wahrscheinlichkeit auch Zitronen“. Der Vorteil solcher Regeln ist die Vorhersehbarkeit. Im Kontext der statischen Codeanalyse bedeutet dies „auf die Codeanweisung X muss die Codeanweisung Y folgen“.

In unserem SCA-Ansatz definieren wir als häufiges Muster ein wiederkehrendes Vorkommnis von Codeanweisungen innerhalb der Transaktionen. Transaktionen sind als Funktionen (Prozeduren) oder bei Java als Methoden definiert. Treten also gleiche Codeanweisungen  innerhalb verschiedener Methoden wiederkehrend auf, sind es häufige Muster im Sinne unseres Ansatzes. Variablen sollten dabei beispielsweise anhand ihres Typs und nicht ihres Namens definiert werden, da letztere in der Programmierung „Schall und Rauch“ sind. Relevante Eigenschaften werden dann im Code via Mining ausgelesen. Der entscheidende Vorteil des Verfahrens: Fehler können bereits implizit aus der gegebenen Codebasis identifiziert werden und müssen nicht erst im Produktivbetrieb auftreten.

Fazit: Leistungs- und ausbaufähiges Potenzial

Die von uns als 4. Generation bezeichnete statische Code-Analyse zeigt bereits heute ihre Vorteile. Entwickler müssen dank maschinellem Lernen nicht mehr alle Prüfregeln im Vorfeld kennen und Vorschläge vereinfachen es, Variablen und Methoden zu benennen. Auch zur Identifizierung von Sicherheitslücken besitzt das Konzept viel Potenzial. Der nächste vielversprechende Schritt ist es, die Vielzahl der gefundenen Regeln zu gewichten, um einen noch besseren Fokus auf die wesentlichen Aspekte zu ermöglichen.

Blog per E-Mail abonnieren

Erhalten Sie regelmäßig Blogposts in Ihrem Posteingang.

Autor

Dr. Eldar Sultanow

Enterprise Architecture
Dr. Eldar Sultanow ist Software-Architekt. Er hat langjährige Praxiserfahrung in der Softwareindustrie, insbesondere in den Bereichen JEE, Electronic/Mobile Commerce, Track-&-Trace und Auto-ID im Pharmabereich. In einem zwischenstaatlichen Projekt hat er eine Plattform mit konzipiert, an der internationale Finanzinstitute angeschlossen sind. Aktuell ist Eldar Sultanow als technischer Chefdesigner in einem der größten öffentlichen IT-Verfahren aktiv, das hunderttausende Transaktionen pro Tag mit einem Jahresvolumen von über 25 Milliarden EUR vollzieht.