A análise estática é o processo de analisar um software sem executá-lo. Isso é muito bom e recomendado, mas você deve ter em mente que
- diferentes ferramentas de análise estática têm uma compreensão diferente do código que estão estudando, portanto, podem sinalizar (ou não sinalizar) problemas diferentes. Uma ferramenta pode fornecer um relatório limpo e a outra pode reclamar de um milhão de coisas.
- uma ferramenta dinâmica (para citar um exemplo, pense em valgrind) pode encontrar muitos outros problemas, ao preço de uma carga séria no consumo de recursos (tempo, uso de memória). Isso ocorre porque geralmente você está executando uma versão instrumentada do software. Observe que, ao ser instrumentado de alguma forma (substitua seu malloc por um malloc de depuração), ele não é exatamente idêntico ao seu software (como você pode ver nos tempos de execução)
Ambas as abordagens sofrem com a falta de contexto: elas não sabem o que o sw deve alcançar.
A revisão do código é feita por outro codificador, que supostamente o conhece e pode verificar
- se o código estiver correto
- se o software estiver semanticamente correto.
É muito mais caro e tem um grau variável de repetibilidade, mas é uma grande ajuda.
Como sempre, não há uma única bala de prata que conserte todos os erros e evite todos os problemas. Aplicação - o máximo possível, considerando o local, o código, a hora e as três formas de verificação (estática, dinâmica, mais olhos (e cérebros) realmente olhando para o código).
ps: Devo observar que geralmente é muito melhor aplicar as ferramentas do zero. Converter um sistema legado é uma experiência muito menos agradável, devido a falsos positivos. Se você começar do zero e sempre tentar manter a ferramenta de análise limpa, provavelmente evitará muitos problemas.
pps: quanto às ferramentas, isso depende do idioma. No mundo C e C ++, você pode começar observando o próprio Visual Studio, que contém uma ferramenta de análise estática interna. Uma lista relativamente completa pode ser encontrada na Wikipedia.
ppps: a análise estática é mais adequada para linguagens estáticas, como C ou C ++. Para Python, pode ser realmente difícil dizer se um nome que se refere a uma lista em um momento se refere a uma lista para o restante do programa, devido às suas propriedades dinâmicas. Isso não significa que nada possa ser feito, como mostra um esforço de JIT, como mostra o PyPy .