Intel hat die erste bedeutende Version von ControlFlag 1.0 veröffentlicht, einem Toolkit, das mithilfe eines maschinellen Lernsystems, das anhand einer großen Menge vorhandenen Codes trainiert wurde, Fehler und Anomalien im Quellcode erkennen kann. Im Gegensatz zu herkömmlichen statischen Analysatoren verwendet ControlFlag keine vorgefertigten Regeln, bei denen es schwierig ist, alle möglichen Optionen vorherzusehen, sondern basiert auf Statistiken zur Verwendung aller Arten von Sprachkonstrukten in einer großen Anzahl bestehender Projekte. Der ControlFlag-Code ist in C++ geschrieben und steht unter der MIT-Lizenz als Open Source zur Verfügung.
Das System wird durch den Aufbau eines statistischen Modells des vorhandenen Open-Source-Projektcodes trainiert, der auf GitHub und ähnlichen öffentlichen Repositorien veröffentlicht ist. In der Trainingsphase identifiziert das System typische Muster für die Strukturbildung im Code und erstellt einen syntaktischen Verbindungsbaum zwischen diesen Mustern, der den Ablauf der Codeausführung im Programm widerspiegelt. Dadurch entsteht ein Referenzentscheidungsbaum, der die Entwicklungserfahrung aller analysierten Quelltexte kombiniert. Ein ähnlicher Prozess zur Definition von Mustern wird für den zu prüfenden Code durchgeführt und mit dem Referenzentscheidungsbaum verglichen. Große Abweichungen zu benachbarten Zweigen weisen auf eine Anomalie im geprüften Muster hin.

Als Beispiel für die Fähigkeiten von ControlFlag analysierten die Entwickler die Quelltexte der OpenSSL- und cURL-Projekte:
- In OpenSSL wurden anomale Konstrukte in "(s1 == NULL) ∧ (s2 == NULL)" und "(s1 == NULL) | (s2 == NULL)" gefunden, die nicht dem allgemein verwendeten Muster "(s1 == NULL) || (s2 == NULL)" entsprechen. Der Code wies außerdem Anomalien in den Ausdrücken "(-2 == rv)" (das Minuszeichen war ein Tippfehler) und "BIO_puts(bp, ":") <= 0)" auf (im Kontext der Überprüfung auf Funktionserfolg hätte es "== 0" lauten müssen).
- In cURL wurde ein Fehler gefunden, der von statischen Analysatoren nicht erkannt wurde, wenn das Strukturelement „s->keepon“ verwendet wurde, das einen numerischen Typ hatte, aber mit dem booleschen Wert TRUE verglichen wurde.
Zu den Funktionen von ControlFlag 1.0 gehören die vollständige Unterstützung typischer Vorlagen für die Programmiersprache C und die Fähigkeit, Anomalien in bedingten Ausdrücken „if“ zu erkennen. Beispielsweise stellt das System bei der Analyse eines Codefragments „if (x = 7) y = x;“ fest, dass im „if“-Operator üblicherweise die Konstruktion „Variable == Zahl“ zum Vergleich numerischer Werte verwendet wird. Daher ist es sehr wahrscheinlich, dass die Angabe „Variable = Zahl“ im „if“-Ausdruck durch einen Tippfehler verursacht wird. Das Kit enthält ein Skript, mit dem Sie vorhandene C-Repositories auf GitHub herunterladen und zum Erstellen eines Modells verwenden können. Es sind auch vorgefertigte Modelle verfügbar, sodass Sie sofort mit der Überprüfung Ihres Codes beginnen können.
Source: opennet.ru
