La empresa Intel ha revelado avances relacionados con el proyecto de investigación ControlFlag, cuyo objetivo es crear un sistema de aprendizaje automático para mejorar la calidad del código. Las herramientas desarrolladas por el proyecto permiten, basándose en un modelo entrenado con una gran cantidad de código existente, identificar diversos errores y anomalías en textos fuentes escritos en lenguajes de alto nivel como C/C++. El sistema es adecuado para detectar diferentes tipos de problemas en el código, desde errores tipográficos y combinaciones incorrectas de tipos hasta la identificación de verificaciones faltantes de valores NULL en punteros y problemas de gestión de memoria. El código de ControlFlag está escrito en C++ y se publica bajo la licencia MIT.
El sistema se autoentrena mediante la construcción de un modelo estadístico del conjunto de código de proyectos abiertos publicados en GitHub y repositorios públicos similares. Durante la etapa de entrenamiento, el sistema determina patrones típicos de construcción de estructuras en el código y construye un árbol sintáctico de relaciones entre estos patrones, que refleja el flujo de ejecución del código en el programa. Como resultado, se forma un árbol de decisiones de referencia que combina la experiencia de desarrollo de todos los textos fuente analizados.
Para el código verificado, se realiza un proceso similar de detección de patrones que se comparan con el árbol de decisiones de referencia. Grandes discrepancias con ramas vecinas indican la presencia de una anomalía en el patrón verificado. El sistema también permite no solo identificar un error en el patrón, sino también sugerir una corrección. Por ejemplo, en el código de OpenSSL se detectó la construcción «(s1 == NULL) ∧ (s2 == NULL)», que aparecía en el árbol sintáctico solo 8 veces, mientras que la rama más cercana con el valor «(s1 == NULL) || (s2 == NULL)» apareció alrededor de 7 mil veces. El sistema también identificó la anomalía «(s1 == NULL) | (s2 == NULL)», que se encontró en el árbol 32 veces.

Al analizar el fragmento de código «if (x = 7) y = x;», el sistema determinó que, por lo general, en la estructura «if» se utiliza la construcción «variable == número» para comparar valores numéricos, por lo que es muy probable que la indicación «variable = número» en la expresión «if» sea un error tipográfico. Este tipo de error también lo hubieran detectado los analizadores estáticos tradicionales, pero a diferencia de ellos, ControlFlag no aplica reglas predefinidas que son difíciles de anticipar para todos los posibles casos, sino que se basa en estadísticas del uso de diversas construcciones en un gran número de proyectos.
Como experimento, mediante ControlFlag se detectó un error no advertido por los analizadores estáticos en el código fuente de la utilidad cURL, que a menudo se presenta como un ejemplo de código de calidad y verificado, en el uso del elemento de estructura «s->keepon», el cual tenía un tipo numérico pero se comparaba con el valor booleano TRUE. En el código de OpenSSL, además del problema mencionado de «(s1 == NULL) ∧ (s2 == NULL)», también se identificaron anomalías en las expresiones «(-2 == rv)» (el signo menos era un error tipográfico) y «BIO_puts(bp, «:»)»
Fuente: opennet.ru
