A empresa Intel lançou a primeira versão significativa da ferramenta ControlFlag 1.0, que permite detectar erros e anomalias em códigos-fonte, utilizando um sistema de aprendizado de máquina treinado em um grande volume de código existente. Diferentemente dos analisadores estáticos tradicionais, o ControlFlag não utiliza regras fixas, que são difíceis de prever em todas as situações, mas se baseia na estatística de uso de várias construções linguísticas em um grande número de projetos. O código do ControlFlag é escrito em C++ e está disponível sob a licença MIT.
O sistema é treinado construindo um modelo estatístico do conjunto de código de projetos abertos publicados no GitHub e em repositórios públicos semelhantes. Durante a fase de treinamento, o sistema identifica padrões típicos de construção de construções 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. Como resultado, forma-se uma árvore de decisão de referência, que reúne a experiência de desenvolvimento de todos os códigos-fonte analisados. Para o código verificado, um processo semelhante de identificação de padrões é realizado, que são comparados com a árvore de decisão de referência. Grandes divergências com ramos vizinhos indicam a presença de uma anomalia no padrão verificado.

Como exemplo das capacidades do ControlFlag, os desenvolvedores realizaram uma análise dos códigos-fonte dos projetos OpenSSL e cURL:
- No OpenSSL, foram identificadas construções anômalas "(s1 == NULL) ∧ (s2 == NULL)" e "(s1 == NULL) | (s2 == NULL)", que não correspondem ao padrão normalmente utilizado "(s1 == NULL) || (s2 == NULL)". No código, também foram identificadas anomalias nas expressões "(-2 == rv)" (o sinal negativo era um erro de digitação) e "BIO_puts(bp, ":") <= 0)" (no contexto de verificar a conclusão bem-sucedida da função deveria ser "== 0").
- No cURL, foi identificada um erro não detectado pelos analisadores estáticos ao utilizar o elemento da estrutura "s->keepon", que tinha um tipo numérico, mas era comparado com o valor booleano TRUE.
Entre as características da versão ControlFlag 1.0, destaca-se o suporte total a modelos típicos para a linguagem C e a capacidade de identificar anomalias em expressões condicionais 'if'. Por exemplo, ao analisar um trecho de código 'if (x = 7) y = x;', o sistema determinará que, geralmente, em uma instrução 'if', para comparação de valores numéricos, utiliza-se a construção 'variável == número', portanto, é muito provável que a expressão 'variável = número' em 'if' seja resultado de um erro de digitação. Um script é fornecido para carregar repositórios existentes no GitHub escritos em C e utilizá-los para construir o modelo. Modelos prontos também estão disponíveis, permitindo iniciar a verificação de código imediatamente.
Fonte: opennet.ru
