Die Firma Intel hat die erste bedeutende Version des Tools ControlFlag 1.0 veröffentlicht, das es ermöglicht, Fehler und Anomalien in Quelltexten aufzuspüren. Dabei nutzt es ein Machine-Learning-System, das auf einer großen Menge bestehender Codebasis trainiert wurde. Im Gegensatz zu herkömmlichen statischen Analysatoren verwendet ControlFlag keine festgelegten Regeln, die oft nicht alle möglichen Varianten abdecken, sondern stützt sich auf die Statistik der Nutzung verschiedener Sprachkonstruktionen in einer Vielzahl existierender Projekte. Der Code von ControlFlag ist in C++ geschrieben und unter der MIT-Lizenz veröffentlicht.
Das System lernt, indem es ein statistisches Modell des vorhandenen Codes aus offenen Projekten erstellt, die auf GitHub und ähnlichen öffentlichen Repositories veröffentlicht sind. In der Lernphase identifiziert das System typische Muster im Codebau und erstellt einen Syntaxbaum, der die Beziehungen zwischen diesen Mustern widerspiegelt und den Ablauf des Codes im Programm darstellt. Am Ende entsteht ein Referenzbaum für Entscheidungen, der die Entwicklungs erfahren aller analysierten Quelltexte kombiniert. Für den zu überprüfenden Code wird ein ähnlicher Prozess zur Mustererkennung durchgeführt, wobei diese mit dem Referenzbaum für Entscheidungen verglichen werden. Größere Abweichungen von benachbarten Verzweigungen weisen auf eine Anomalie im überprüften Muster hin.

Als Beispiel für die Möglichkeiten von ControlFlag wurde von den Entwicklern eine Analyse der Quelltexte der Projekte OpenSSL und cURL durchgeführt:
- In OpenSSL wurden anomale Konstruktionen wie „(s1 == NULL) ∧ (s2 == NULL)“ und „(s1 == NULL) | (s2 == NULL)“ festgestellt, die nicht dem üblichen Muster „(s1 == NULL) || (s2 == NULL)“ entsprechen. Außerdem wurden im Code Anomalien in den Ausdrücken „(-2 == rv)“ (das Minus war ein Tippfehler) und „BIO_puts(bp, “:”) <= 0)“ erkannt, wo im Kontext der Überprüfung des erfolgreichen Abschlusses der Funktion „== 0“ gemeint war.
- In cURL wurde ein nicht von statischen Analyse-Tools erfasstes Problem entdeckt, bei dem das Struktur-Element „s->keepon“ einen numerischen Typ hatte, aber mit dem booleschen Wert TRUE verglichen wurde.
Die Version ControlFlag 1.0 bietet umfassende Unterstützung für Standardvorlagen in der Programmiersprache C und die Möglichkeit, Anomalien in Bedingungen wie "if" zu erkennen. Zum Beispiel wird das System bei der Analyse des Codeausschnitts "if (x = 7) y = x;" feststellen, dass normalerweise im "if"-Operator die Vergleichsstruktur "Variable == Zahl" verwendet wird. Daher deutet die Verwendung von "Variable = Zahl" in der Bedingung "if" mit hoher Wahrscheinlichkeit auf einen Tippfehler hin. Im Lieferumfang befindet sich ein Skript, das es ermöglicht, vorhandene C-Quellcode-Repositories von GitHub zu laden und sie zum Aufbau eines Modells zu verwenden. Zudem sind bereits fertige Modelle verfügbar, die sofort für die Codeüberprüfung genutzt werden können.
Quelle: opennet.ru
