É uma pena as opiniões sobre analisadores de código estático

As ferramentas de análise de código estático avançaram muito. Estes não são de forma alguma os "linters" que foram usados ​​ativamente 20 anos atrás. No entanto, muitos ainda se referem a eles como ferramentas muito simples. É uma vergonha. É uma pena tanto para a metodologia de análise de código em geral quanto para a ferramenta PVS-Studio.







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







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 .



All Articles