
O motivo de um pouco de tristeza foi o comentário a um de nossos artigos. Neste artigo, foi escrito que o analisador detecta um erro de digitação emitindo um aviso para o seguinte código:
if (A[0] == 0)
{
X = Y;
if (A[0] == 0)
....
}
O analisador diz que a segunda condição é sempre verdadeira. Na verdade, se você examinar o corpo da função, ficará claro que outro elemento da matriz deve ser verificado.
Sobre isso, um comentário foi recebido aproximadamente da seguinte forma:
Sim, o analisador indica um erro aqui. Mas, em geral, esse aviso está incorreto. Afinal, entre duas verificações idênticas, o valor do elemento pode mudar, e então a segunda verificação fará sentido.Estou triste. Os programadores ainda acham que os analisadores de código são baseados em expressões regulares. Supostamente encontrou dois idênticos aninhados se e juro.
Naturalmente, qualquer analisador estático moderno monitora as mudanças no valor das variáveis. Se a variável não mudar, haverá uma mensagem. Se mudar, não haverá mensagem. Para isso, utiliza-se a tecnologia de análise de fluxo de dados.
Isso é exatamente o que o analisador estático PVS-Studio faz. Vamos dar uma olhada no seguinte exemplo sintético:
char get();
int foo(char *p, bool arg)
{
if (p[1] == 1)
{
if (arg)
p[0] = get();
if (p[1] == 1) // Warning
return 1;
}
if (p[2] == 2)
{
if (arg)
p[2] = get();
if (p[2] == 2) // Ok
return 2;
}
return 3;
}
O código contém dois blocos semelhantes. Em um, a variável que está sendo verificada não muda, e no segundo ela muda. Portanto, o analisador emite um aviso apenas para o primeiro bloco: V547 A expressão 'p [1] == 1' é sempre verdadeira.
Os programadores não precisam se preocupar. As ferramentas modernas são avançadas e só emitem avisos para códigos realmente suspeitos. Existem falsos positivos, mas, via de regra, estão associados à presença de código confuso, que pode ser difícil até mesmo para uma pessoa entender.

Links adicionais
- Exemplos de erros detectados pelo diagnóstico V547 .
- Análise estática e expressões regulares (por que é uma má ideia :).
- Tecnologias usadas no analisador de código PVS-Studio para encontrar bugs e vulnerabilidades potenciais .

Se você deseja compartilhar este artigo com um público que fala inglês, por favor, use o link de tradução: Andrey Karpov. Opiniões desagradáveis sobre analisadores estáticos .