De tempos em tempos, os programadores que começam a se familiarizar com o analisador de código PVS-Studio perguntam: "Existe uma lista de avisos que indicam com precisão erros?" Não existe uma lista desse tipo pelo motivo de que avisos desinteressantes (falsos) em um projeto e em outro se revelam muito importantes e úteis. No entanto, é possível começar a familiarizar o analisador com os avisos mais interessantes. Vamos dar uma olhada mais de perto neste tópico.
O problema é que, durante os primeiros lançamentos, o programador, via de regra, recebe um grande número de avisos nos quais "se afoga". Naturalmente, ele deseja se familiarizar com os avisos mais interessantes para entender se deve passar todo esse tempo. Bem, aqui estão três etapas simples que permitirão que você se familiarize com as respostas mais interessantes.
Etapa 1
Desative todos os tipos de alertas, exceto geral (GA). Um erro comum: ative todos os tipos de avisos. Para usuários inexperientes, parece que quanto mais você ativá-lo, melhor. Isto não é assim! Existem conjuntos de diagnósticos, como verificações de 64 bits e regras MISRA, que devem ser usadas apenas com uma idéia clara do que é e como trabalhar com eles. Por exemplo, ao ativar o diagnóstico MISRA para um programa de aplicativo comum, você se afogará em dezenas, milhares ou centenas de milhares de mensagens como:
- V2506 . Misra. Uma função deve ter um único ponto de saída no final.
- V2507 . Misra. O corpo de uma instrução loop \ condicional deve ser colocado entre chaves.
- V2523 . Misra. Todas as constantes inteiras do tipo não assinado devem ter o sufixo 'u' ou 'U'.
A maioria dos avisos MISRA não indica erros, mas o cheiro do código. Naturalmente, uma pessoa começa a fazer perguntas. Como encontrar algo interessante na massa de todos esses avisos? Diagnóstico sob quais números ele deve procurar? Estas são as perguntas erradas. Você só precisa desativar o kit MISRA. Esse é o padrão para escrever código de qualidade para dispositivos incorporados. A essência do padrão: tornar o código extremamente simples e compreensível. Não tente aplicá-lo onde for inapropriado.
Nota Sim, existem regras no padrão MISRA destinadas a identificar erros reais. Exemplo:
V2538 - O valor da variável não inicializada não deve ser usado. Mas não tenha medo de desativar o padrão MISRA. Você não vai perder nada. Erros reais ainda serão encontrados nos diagnósticos de uso geral (GA). Por exemplo, uma variável não inicializada será encontrada graças ao diagnóstico
V614 .
Etapa 2
Qualquer analisador estático gera falsos positivos durante as primeiras partidas e requer uma determinada configuração. Nada pode ser feito com isso, mas não é tão assustador quanto pode parecer. Mesmo uma configuração rápida e simples permite remover a maioria dos avisos falsos e começar a se familiarizar com um relatório já bastante adequado. Não falaremos sobre isso com mais detalhes, já que escrevi sobre isso muitas vezes, por exemplo, neste artigo: "
Características do analisador PVS-Studio usando o exemplo das bibliotecas principais da EFL, 10-15% dos falsos positivos ".
Passe um pouco de tempo desativando alertas obviamente irrelevantes e combatendo falsos positivos devido a macros. As macros geralmente são a principal fonte de falsos positivos, pois um aviso aparece sempre que uma macro com falha é usada. Para suprimir avisos em macros, um tipo especial de comentário pode ser colocado ao lado de sua declaração. O formato para escrever comentários é discutido em mais detalhes na
documentação .
Sim, a configuração inicial levará um pouco de tempo, mas melhorará drasticamente a percepção do relatório, eliminando ruídos perturbadores. Tire algum tempo para isso. Se houver alguma dificuldade ou dúvida, estamos sempre prontos para ajudar e sugerir a melhor forma de configurar o analisador. Sinta-se livre para
escrever e fazer perguntas.
Etapa 3
Comece a aprender avisos a partir do nível 1. E só então veja os 2 e 3. Os níveis de aviso nada mais são do que a confiabilidade do aviso. Os avisos de nível 1 têm maior probabilidade de indicar um erro verdadeiro que 2.
Podemos dizer que, ao escolher “assistir nível 1”, você pressiona o botão “assistir os erros mais interessantes”.
A classificação dos alertas do PVS-Studio por níveis é descrita em mais detalhes no artigo “
Como e por que os analisadores estáticos lidam com falsos positivos ”.
Então, por que ainda não existe uma lista?
No entanto, uma ideia com uma lista dos avisos mais úteis ainda pode parecer razoável. Deixe-me mostrar por exemplo prático que a utilidade do diagnóstico é relativa e depende do projeto.
Considere o aviso
V550 . Um aviso revela um erro em potencial devido ao fato de o operador == ou! = Ser usado para comparar números de ponto flutuante.
A maioria dos desenvolvedores com quem conversei acredita que esse diagnóstico é de pouca utilidade e o desativa, pois todos os aspectos positivos do projeto são falsos. E é por isso que esse diagnóstico tem baixa confiabilidade e está localizado no 3º nível.
De fato, na maioria das aplicações, os tipos float / double são usados em algoritmos muito simples. E muitas vezes uma comparação com uma constante é usada apenas para verificar se um valor padrão está definido ou se ele foi alterado. Nesse caso, uma verificação precisa é bastante apropriada. Vou explicar isso com pseudo-código.
float value = 1.0f; if (IsUserInputNewValue()) value = GetUserValue(); if (value == 1.0f) DefaultBehavior(); else Foo(value);
Aqui a comparação
(valor == 1.0f) é correta e segura.
Isso significa que o V550 é um diagnóstico desinteressante? Não. Tudo depende do projeto. Vou citar um fragmento do artigo "
Como testamos a análise estática em nosso projeto de um simulador de treinamento de cirurgia endovascular "
, escrito por um de nossos usuários.
Então, o que o analisador estático chama nossa atenção aqui:
V550 Uma comparação precisa e estranha: t! = 0. Provavelmente é melhor usar uma comparação com precisão definida: fabs (A - B)> Epsilon. objectextractpart.cpp 3401
D3DXVECTOR3 N = VectorMultiplication( VectorMultiplication(V-VP, VN), VN); float t = Qsqrt(Scalar(N, N)); if (t!=0) { N/=t; V = V - N * DistPointToSurface(V, VP, N); }
Erros semelhantes são repetidos com bastante frequência nesta biblioteca. Não direi que isso me surpreendeu. Já encontrei anteriormente um trabalho incorreto com números de ponto flutuante neste projeto. No entanto, não havia recursos para verificar sistematicamente as fontes para isso. De acordo com os resultados da verificação, ficou claro que você precisa fornecer ao desenvolvedor algo para ler para ampliar seus horizontes em termos de trabalhar com números de ponto flutuante. Eu joguei links para alguns bons artigos. Vejamos o resultado. É difícil dizer sem ambiguidade se esse erro causa problemas reais no programa. A solução atual define uma série de requisitos para a rede poligonal inicial de artérias, ao longo da qual a propagação de uma substância radiopaca é simulada. Se os requisitos não forem atendidos, o programa poderá falhar ou operação obviamente incorreta. Alguns desses requisitos são obtidos analiticamente e outros empiricamente. É possível que essa segunda parte dos requisitos cresça apenas com o trabalho incorreto com números de ponto flutuante. Deve-se observar que nem todos os casos encontrados de comparação exata de números de ponto flutuante foram um erro.
Como você pode ver, o que não é interessante em alguns projetos é interessante em outros. Isso torna impossível criar uma lista dos "mais interessantes".
Nota É possível definir o nível de aviso usando as configurações. Por exemplo, se você acha que o diagnóstico do V550 merece muita atenção, é possível movê-lo do terceiro nível para o primeiro. Esse tipo de configuração é descrito na
documentação (consulte "Como definir seu nível para diagnósticos específicos").
Conclusão
Agora você sabe como começar a estudar os avisos do analisador, considerando os mais interessantes. E não se esqueça de procurar na documentação para se familiarizar com a descrição detalhada dos avisos. Às vezes acontece que, por trás de uma advertência despreocupada, à primeira vista, o inferno é um inferno. Um exemplo desses diagnósticos:
V597 ,
V1026 . Obrigado pela atenção.

Se você deseja compartilhar este artigo com um público que fala inglês, use o link para a tradução: Andrey Karpov.
Como verificar rapidamente avisos interessantes fornecidos pelo analisador PVS-Studio para códigos C e C ++?