Geração de casos de teste usando Bounded Model Checking - Menezes, Rafael Sá (Universidade Federal do Amazonas, 2021)
A geração automática de casos de teste consiste na geração de entradas para um algoritmo que sejam capazes de explorar todos os caminhos de um programa, maximizando a cobertura. Comumente, técnicas como fuzzing são utilizadas para isso por sua performance alta e de custo baixo. Entretanto, técnicas formais, como execução simbólica, vêm ganhando espaço nesse domínio, entre elas, a Bounded Model Checking (BMC). BMC é uma técnica de verificação que codifica uma propriedade em caminhos de um sistema de transição até um limite k, resultando em uma única fórmula lógica que, caso contenha uma violação, irá gerar uma prova. Essa prova - embora reduzida - contém informações que podem ser utilizadas como base para a geração de um caso de teste. A dificuldade de usar BMC em casos de teste está na complexidade de tempo/espaço da técnica e nas simplificações feitas para tentar contornar isso (simplificações, estratégias). Incremental BMC é uma estratégia que, de forma incremental, aumenta esse limite k até que uma violação seja encontrada ou que o sistema seja completamente verificado. Entretanto, cada caminho do sistema é reverificado a cada incremento, o que adiciona tempo e consumo de memória para resolver a instância atual. Para resolver esses problemas, este trabalho propõe duas contribuições: (1) algoritmo de geração de casos de teste a partir de provas e (2) um sistema de cache que utiliza soluções de instâncias menores através de (A) uso direto das instâncias anteriores; e (B) uso indireto através de fórmulas de outros sistemas. Essas contribuições foram implementadas no Efficient SMT-based Bounded Model Checker (ESBMC), sendo testadas em situações de Integração Contínua (CI) e sobre benchmarks públicos de programas em C, obtendo a primeira colocação na competição TestComp’21 na categoria reach-error e reduzindo o tempo do CI.