Das Unternehmen Intel hat die Arbeiten im Rahmen des Forschungsprojekts ControlFlag aufgenommen, das darauf abzielt, ein System für maschinelles Lernen zu entwickeln, um die Codequalität zu verbessern. Die vom Projekt bereitgestellten Werkzeuge ermöglichen es, basierend auf einem Modell, das auf einer großen Menge bestehenden Codes trainiert wurde, verschiedene Fehler und Anomalien in den Quelltexten zu identifizieren, die in Hochsprachensprachen wie C/C++ verfasst sind. Das System eignet sich zur Identifizierung verschiedener Problemarten im Code, von der Erkennung von Tippfehlern und falschen Typkombinationen bis hin zur Auffindung fehlender NULL-Wertprüfungen in Zeigern und Problemen mit dem Speicher. Der Code von ControlFlag ist in C++ geschrieben und unter der MIT-Lizenz verfügbar.
Das System lernt selbstständig, indem es ein statistisches Modell des vorhandenen Codebestands offener Projekte erstellt, die auf GitHub und ähnlichen öffentlichen Repositories veröffentlicht sind. Während der Trainingsphase identifiziert das System typische Muster beim Aufbau von Konstruktionen im Code und erstellt einen syntaktischen Baum der Verbindungen zwischen diesen Mustern, der den Ablauf der Codeausführung im Programm widerspiegelt. Infolgedessen entsteht ein Referenzbaum für Entscheidungen, der die Entwicklungserfahrungen aller analysierten Quelltexte vereint.
Für den überprüften Code wird ein ähnlicher Prozess zur Mustererkennung durchgeführt, der mit dem Referenzbaum für Entscheidungen verglichen wird. Große Abweichungen von benachbarten Zweigen deuten auf eine Anomalie im überprüften Muster hin. Das System ermöglicht nicht nur die Identifizierung eines Fehlers im Muster, sondern schlägt auch eine Korrektur vor. Zum Beispiel wurde im Code von OpenSSL eine Konstruktion „(s1 == NULL) ∧ (s2 == NULL)“ entdeckt, die im syntaktischen Baum nur 8 Mal vorkam, während der nächstgelegene Zweig mit dem Wert „(s1 == NULL) || (s2 == NULL)“ etwa 7.000 Mal vorkam. Das System identifizierte auch die Anomalie „(s1 == NULL) | (s2 == NULL)“, die im Baum 32 Mal vorkam.

Bei der Analyse des Code-Ausschnitts "if (x = 7) y = x;" hat das System festgestellt, dass in der Regel in der "if"-Anweisung zur Vergleich von Zahlenwerten die Konstruktion "Variable == Zahl" verwendet wird. Daher ist es sehr wahrscheinlich, dass die Angabe "Variable = Zahl" in der "if"-Anweisung durch einen Tippfehler verursacht wurde. Ein solches Fehler hätte auch traditionelle statische Analyzer entdeckt, aber im Gegensatz zu ihnen wendet ControlFlag keine festen Regeln an, in denen es schwierig ist, alle möglichen Varianten zu berücksichtigen, sondern stützt sich auf Statistiken zur Verwendung verschiedener Konstruktionen in einer Vielzahl von Projekten.
Im Rahmen eines Experiments wurden mit Hilfe von ControlFlag im Quellcode des Tools cURL, das oft als Beispiel für qualitativ hochwertigen und geprüften Code herangezogen wird, Fehler entdeckt, die von statischen Analyzern übersehen wurden. Dies betraf das Strukturelement "s->keepon", das vom numerischen Typ war, aber mit dem booleschen Wert TRUE verglichen wurde. Im Code von OpenSSL wurden neben dem bereits erwähnten Problem mit "(s1 == NULL) ∧ (s2 == NULL)" auch Anomalien in den Ausdrücken "(-2 == rv)" (das Minus war ein Tippfehler) und "BIO_puts(bp, ":")" festgestellt.
Quelle: opennet.ru
