A Intel lançou pesquisas relacionadas ao projeto de pesquisa ControlFlag, que visa criar um sistema de aprendizado de máquina para melhorar a qualidade do código. A ferramenta preparada pelo projeto permite, com base em um modelo treinado em um grande volume de código existente, identificar diferentes erros e anomalias em textos fonte escritos em linguagens de alto nível, como C/C++. O sistema é adequado para detectar vários tipos de problemas no código, desde a identificação de erros de digitação e combinações de tipos incorretos até a detecção de verificações de valor NULL ausentes em ponteiros e problemas de gerenciamento de memória. O código do ControlFlag é escrito em C++ e é de código aberto sob a licença MIT.
O sistema se auto-treina construindo um modelo estatístico do conjunto de código de projetos abertos publicados no GitHub e repositórios públicos semelhantes. Na fase de treinamento, o sistema define padrões típicos na construção de estruturas no código e constrói uma árvore sintática de relações entre esses padrões, refletindo o fluxo de execução do código no programa. No final, uma árvore de decisão padrão é formada, combinando a experiência de desenvolvimento de todos os textos fonte analisados.
Um processo semelhante é realizado para o código verificado, onde padrões são comparados com a árvore de decisão padrão. Grandes divergências com ramos vizinhos indicam a presença de uma anomalia no padrão verificado. O sistema também permite não apenas identificar um erro no padrão, mas também sugerir uma correção. Por exemplo, no código do OpenSSL, foi identificada a construção "(s1 == NULL) ∧ (s2 == NULL)", que ocorreu na árvore sintática apenas 8 vezes, enquanto o ramo mais próximo com o valor "(s1 == NULL) || (s2 == NULL)" apareceu cerca de 7 mil vezes. O sistema também identificou a anomalia "(s1 == NULL) | (s2 == NULL)", que ocorreu na árvore 32 vezes.

Ao analisar o fragmento de código «if (x = 7) y = x;», o sistema identificou que, normalmente, a construção utilizada para comparar valores numéricos em um operador «if» é «variável == número». Portanto, é muito provável que a notação «variável = número» na expressão «if» tenha sido causada por um erro de digitação. Esse tipo de erro também poderia ser detectado por analisadores estáticos tradicionais, mas, ao contrário deles, o ControlFlag não aplica regras predefinidas, nas quais é difícil prever todas as possibilidades, mas se baseia na estatística de uso de várias construções em um grande número de projetos.
Como experimento, utilizando o ControlFlag nos textos fonte da ferramenta cURL, frequentemente citada como exemplo de código de qualidade e testado, foi descoberta uma falha não detectada por analisadores estáticos ao usar o elemento da estrutura «s->keepon», que tinha um tipo numérico, mas foi comparado com o valor booleano TRUE. No código do OpenSSL, além do problema mencionado com «(s1 == NULL) ∧ (s2 == NULL)», também foram identificadas anomalias nas expressões «(-2 == rv)» (o menos era um erro de digitação) e «BIO_puts(bp, «:»)»
Fonte: opennet.ru
