A Intel abriu o código do sistema de aprendizado de máquina ControlFlag para identificar bugs no código

A Intel descobriu desenvolvimentos relacionados ao projeto de pesquisa ControlFlag, que visa criar um sistema de aprendizado de máquina para melhorar a qualidade do código. O kit de ferramentas elaborado pelo projeto permite, com base em um modelo treinado em uma grande quantidade de código existente, detectar diversos erros e anomalias em textos fonte escritos em linguagens de alto nível como C/C++. O sistema é adequado para identificar vários tipos de problemas no código, desde a detecção de erros de digitação e combinações incorretas de tipos até a detecção de verificações NULL perdidas em ponteiros e problemas de memória. O código ControlFlag é escrito em C++ e é de código aberto sob a licença MIT.

O sistema é de autoaprendizagem através da construção de um modelo estatístico da matriz de código existente de projetos abertos publicados no GitHub e repositórios públicos semelhantes. Na fase de aprendizagem, o sistema determina padrões típicos para a construção de estruturas no código e constrói uma árvore sintática de links entre esses padrões, que reflete o fluxo de execução do código no programa. Como resultado, forma-se uma árvore de decisão de referência que combina a experiência de desenvolvimento de todos os textos-fonte analisados.

O código testado passa por um processo semelhante de identificação de padrões que são verificados em uma árvore de decisão de referência. Grandes discrepâncias com filiais vizinhas indicam a presença de uma anomalia no modelo testado. O sistema também permite não só identificar um erro no template, mas também sugerir uma correção. Por exemplo, no código OpenSSL foi encontrada a construção “(s1 == NULL) ∧ (s2 == NULL)”, que ocorreu apenas 8 vezes na árvore sintática, enquanto o ramo mais próximo com o valor “(s1 == NULO) || (s2 == NULL)" ocorreu cerca de 7 mil vezes. O sistema também detectou uma anomalia “(s1 == NULL) | (s2 == NULL)" que ocorreu 32 vezes na árvore.

A Intel abriu o código do sistema de aprendizado de máquina ControlFlag para identificar bugs no código

Ao analisar o trecho de código "if (x = 7) y = x;" o sistema determinou que a construção “variável == número” é normalmente usada na instrução “if” para comparar valores numéricos, portanto, com alta probabilidade, a indicação “variável = número” na expressão “if” é causada por um erro de digitação. Os analisadores estáticos tradicionais detectariam tal erro, mas ao contrário deles, o ControlFlag não usa regras prontas nas quais é difícil prever todas as opções possíveis, mas é baseado nas estatísticas do uso de todos os tipos de construções em um grande número de projetos .

Como experimento, utilizando ControlFlag no código-fonte do utilitário cURL, que é frequentemente citado como exemplo de código testado e de alta qualidade, foi detectado um erro despercebido pelos analisadores estáticos ao utilizar o elemento de estrutura "s->keepon", que tinha um tipo numérico, mas foi comparado com o valor booleano TRUE . No código OpenSSL, além do problema acima com "(s1 == NULL) ∧ (s2 == NULL)", também havia anomalias nas expressões "(-2 == rv)" (o sinal de menos foi um erro de digitação ) e "BIO_puts(bp, ":")

Fonte: opennet.ru

Adicionar um comentário