La société Intel a publié la première version significative de l'outil ControlFlag 1.0, permettant de détecter des erreurs et des anomalies dans les codes sources en utilisant un système d'apprentissage automatique formé sur une large base de code existant. Contrairement aux analyseurs statiques traditionnels, ControlFlag ne s'appuie pas sur des règles préétablies, qui peinent à couvrir toutes les possibilités, mais se base sur des statistiques d'utilisation de diverses constructions linguistiques à travers un grand nombre de projets existants. Le code de ControlFlag est écrit en C++ et est disponible sous licence MIT.
Le système s'entraîne en construisant un modèle statistique de l'ensemble du code des projets open source publiés sur GitHub et d'autres dépôts publics similaires. Pendant la phase d'apprentissage, le système identifie des modèles types de constructions dans le code et construit un arbre syntaxique des relations entre ces modèles, reflétant le flux d'exécution du code dans le programme. En conséquence, un arbre de décision de référence se forme, intégrant l'expérience de développement de tous les codes sources analysés. Pour le code à vérifier, un processus similaire d'identification des modèles est appliqué, qui est comparé à l'arbre de décision de référence. De grandes divergences avec les branches voisines indiquent la présence d'une anomalie dans le modèle vérifié.

À titre d'exemple des capacités de ControlFlag, les développeurs ont effectué une analyse des codes sources des projets OpenSSL et cURL :
- Dans OpenSSL, des constructions anormales telles que «(s1 == NULL) ∧ (s2 == NULL)» et «(s1 == NULL) | (s2 == NULL)» ont été identifiées, qui ne correspondent pas au modèle habituellement utilisé «(s1 == NULL) || (s2 == NULL)». Des anomalies ont également été découvertes dans les expressions «(-2 == rv)» (le signe moins était une erreur typographique) et «BIO_puts(bp, «:») <= 0)» (dans le contexte de la vérification de l'achèvement réussi de la fonction, cela aurait dû être «== 0»).
- Dans cURL, une erreur non détectée par les analyseurs statiques a été identifiée lors de l'utilisation de l'élément de structure «s->keepon», qui avait un type numérique mais était comparé à une valeur booléenne TRUE.
Parmi les caractéristiques de la version ControlFlag 1.0, on note le support complet des modèles standard pour le langage C et la possibilité de détecter des anomalies dans les expressions conditionnelles «if». Par exemple, lors de l'analyse d'un fragment de code «if (x = 7) y = x;», le système déterminera que, normalement, dans l'instruction «if», on utilise la construction «variable == nombre» pour comparer des valeurs numériques. Par conséquent, il est fort probable que l'instruction «variable = nombre» dans l'expression «if» soit due à une faute de frappe. Un script est fourni pour charger les référentiels existants sur GitHub en langage C et les utiliser pour construire un modèle. Des modèles déjà prêts sont également disponibles, permettant de commencer immédiatement à vérifier le code.
Source : opennet.ru
