PVS-Studio para Visual Studio


Muitos de nossos artigos são dedicados a qualquer coisa, mas não à própria ferramenta PVS-Studio. Mas fazemos muito para tornar conveniente que os desenvolvedores usem nossa ferramenta. Mas é exatamente isso que costuma acontecer nos bastidores. Decidi corrigir essa situação e falar sobre o plug-in PVS-Studio para Visual Studio. Se você estiver usando o Visual Studio, este artigo é para você.

O que é análise de código estático e por que é necessário


A análise do código estático é o processo de identificação de erros e deficiências no código fonte dos programas. A análise estática pode ser considerada como um processo automatizado de revisão de código. Uma revisão de código colaborativa é uma ótima metodologia. Mas também tem uma desvantagem significativa - alto custo. É necessário reunir regularmente vários programadores para revisar o novo código ou revisá-lo novamente depois de fazer recomendações.

Por um lado, quero revisar regularmente o código. Por outro lado, é muito caro. O tradeoff são ferramentas de análise de código estático. Eles processam incansavelmente o código fonte dos programas e dão recomendações ao programador para prestar maior atenção a determinadas seções do código. Obviamente, o programa não substitui uma revisão completa do código executado por uma equipe de programadores. No entanto, a relação benefício / preço torna o uso da análise estática uma prática muito útil para muitas empresas. Se o leitor estiver interessado em números específicos, proponho que me familiarize com o artigo " PVS-Studio ROI ".

Há um grande número de analisadores de código estático comerciais e gratuitos. Uma grande lista de analisadores estáticos está disponível na Wikipedia: Lista de ferramentas para análise de código estático . A lista de linguagens para as quais existem analisadores de código estático também é bastante grande (C, C ++, C #, Java, Ada, Fortran, Perl, Ruby, ...). Naturalmente, falaremos sobre o analisador PVS-Studio .

A principal vantagem da análise estática é a possibilidade de uma redução significativa no custo de eliminação de defeitos no programa. Quanto mais cedo o erro for identificado, menor será o custo de corrigi-lo. Portanto, de acordo com os dados fornecidos no livro de McConnell "Perfect Code", corrigir um erro no estágio de teste custará dez vezes mais do que no estágio de construção (gravação):

Figura 1. O custo médio de correção de defeitos, dependendo do tempo de sua introdução e detecção (os dados para a tabela são retirados do livro por S. McConnell "Perfect Code").

Figura 1. O custo médio da correção de defeitos, dependendo do tempo de sua introdução e detecção (os dados para a tabela são retirados do livro por S. McConnell "Perfect Code").

As ferramentas de análise estática permitem identificar um grande número de erros na fase de design, o que reduz significativamente o custo de desenvolvimento de todo o projeto. Por exemplo, o analisador de código estático do PVS-Studio pode iniciar em segundo plano imediatamente após a compilação e, se um erro em potencial for encontrado, ele notificará o programador. Mais sobre este modo será descrito abaixo.

Analisador de código estático PVS-Studio


O PVS-Studio é um analisador estático que detecta erros e possíveis vulnerabilidades no código fonte dos aplicativos em C, C ++ (extensões também são suportadas: C ++ / CLI e C ++ / CX ), C # e Java nas plataformas Windows, Linux e macOS. O analisador se integra perfeitamente ao Visual Studio 2010 - 2019 e ao IntelliJ IDEA. Neste artigo, examinaremos mais de perto o trabalho do PVS-Studio para verificar o código em C, C ++ e C #. Você pode ler sobre como usar o PVS-Studio para testar o código Java no IntelliJ IDEA aqui .

Após instalar o PVS-Studio e integrar-se ao Visual Studio, os usuários recebem um item adicional “PVS-Studio” no menu principal e uma janela para trabalhar com mensagens de diagnóstico (consulte a Figura 2).

Figura 2. Os principais elementos adicionados pelo analisador PVS-Studio durante a integração no Visual Studio.

Figura 2. Os principais elementos adicionados pelo analisador PVS-Studio durante a integração no Visual Studio.

Configurações iniciais


O analisador está pronto para operação imediatamente após a instalação. Na maioria dos casos, você não precisa configurar nada para concluir a primeira execução. A única configuração que você pode precisar no início é a exclusão de bibliotecas de terceiros. Afinal, você ainda não editará nada nos arquivos de origem, por exemplo, na biblioteca jpeg, portanto, não há necessidade de verificar isso. Além disso, a exclusão de pastas extras reduzirá o tempo de análise do projeto. Os diretórios excluídos da análise são definidos aqui: PVS-Studio> Opções ...> Não verificar arquivos> PathMasks (consulte a Figura 3).

Figura 3. Editando uma lista de diretórios que o analisador não verificará.

Figura 3. Editando uma lista de diretórios que o analisador não verificará.

Se um dos nomes especificados estiver no caminho completo do arquivo, a análise não será executada. Por padrão, os nomes de alguns diretórios já estão incluídos na lista. No entanto, no seu projeto, a pasta com a biblioteca ZLib não pode ser chamada de "zlib", mas, por exemplo, "zip_lib". Portanto, você deve editar esta lista. Para começar a editar, clique no botão com três pontos.

Exemplos de máscaras válidas para a lista PathMasks:

  • c: \ Libs \ - todos os arquivos de projeto localizados nesta pasta e suas subpastas serão excluídos.
  • \ Libs \ ou * \ Libs \ * - todos os arquivos localizados em diretórios cujo caminho para o qual contém uma subpasta "Libs" será excluído. Se os caracteres "*" não forem especificados, eles ainda serão adicionados automaticamente, portanto, as duas opções de gravação são as mesmas.
  • Libs ou * Libs * - todos os arquivos serão excluídos, o caminho para o qual contém uma subpasta que possui 'Libs' como um nome ou um fragmento de um nome. Também nesse caso, os arquivos que contêm Libs no nome serão excluídos, por exemplo, c: \ project \ mylibs.cpp. Para evitar confusão, recomendamos que você sempre use barras.

Além de excluir pastas inteiras, você pode especificar máscaras para excluir arquivos individuais. Para isso, há uma configuração FileNameMasks. Para obter mais detalhes sobre como trabalhar com listas de exclusão, consulte a documentação: Configurações: Não verifique arquivos .

Verificação do Projeto


Após a conclusão das configurações iniciais, você pode começar a verificar o projeto. O PVS-Studio para Visual Studio oferece suporte à verificação de projetos em C ++ (.vcxproj) e C # (.csproj). Você também pode tentar verificar imediatamente uma solução que contém projetos desses tipos em sua totalidade. Para fazer isso, selecione o item de menu Extensões> PVS-Studio> Verificar> Solução (veja a Figura 4).

Figura 4. Verificação da solução usando o analisador PVS-Studio.

Figura 4. Verificação da solução usando o analisador PVS-Studio.

Se houver alguma dificuldade com a verificação, recomendamos que você consulte a seção " Não é possível verificar? " Em nosso site. Estes não são tomadas “sem noção”, verifique se o plugue está conectado na tomada. A seção descreve situações típicas com as quais os usuários nos contataram e sugeriu opções de ação.

Trabalhando com uma lista de mensagens de diagnóstico


Após a verificação, todas as mensagens de diagnóstico serão exibidas em uma janela especial. Uma janela tem muitos controles. Todos eles servem para mostrar exatamente as mensagens de diagnóstico que são do interesse do usuário. No entanto, a princípio, a janela pode parecer complicada. Vamos dar uma olhada em todos os controles (veja a Figura 5).

Figura 5. Uma janela com mensagens de diagnóstico.

Figura 5. Uma janela com mensagens de diagnóstico.

  1. Na verdade, a janela PVS-Studio.
  2. Menu adicional. Permite acessar opções como: marcar um aviso como falso, ocultar mensagens, adicionar arquivos a exceções (mais sobre isso abaixo).
  3. O botão inclui a mensagem "algo deu errado". Por exemplo, você não pode pré-processar um dos arquivos.
  4. Vá para a mensagem anterior / seguinte. Isso abre o arquivo correspondente e o cursor é colocado na linha com um erro em potencial. Você também pode sempre selecionar diagnósticos da lista clicando duas vezes. Você pode atribuir teclas de atalho para pular para a mensagem anterior / seguinte. Por padrão, esses são Alt + '[' e Alt + ']'.
  5. Botões que incluem alertas em diferentes níveis. Agora, os dois primeiros níveis de diagnóstico estão incluídos. Ao mesmo tempo, 90 avisos do primeiro nível e 6700 avisos do segundo nível são exibidos na janela. O nível da mensagem é mostrado no lado esquerdo da janela, na forma de uma barra correspondente à cor da barra no botão do nível correspondente. Por que existem tantos pontos positivos? De onde são os 6700 avisos? Para demonstrar os recursos da interface, está incluído um conjunto de regras MISRA , que é contra-indicado para aplicativos comuns :).
  6. Conjuntos ativos de regras de diagnóstico. Geral - diagnóstico de uso geral, Otimização - microoptimização, diagnóstico de 64 bits - 64 bits, diagnóstico padrão MISRA - MISRA C e MISRA C ++. Agora a janela exibe todos os tipos de alertas.
  7. Mostra o número de mensagens marcadas como alarmes falsos. Você pode ativar / desativar a exibição de mensagens marcadas nas configurações, PVS-Studio> Opções ...> Configurações específicas do analisador> Exibir alarmes falsos.
  8. Filtros rápidos. Por exemplo, você pode deixar na lista apenas mensagens com o código V501 e que estejam no projeto XYZ.
  9. Alguns diagnósticos sugerem prestar atenção não a uma, mas a várias linhas. Nesse caso, são exibidas reticências próximas ao número da linha. Ao clicar com o mouse, você pode ver uma lista de linhas e selecionar uma delas.

A tabela com mensagens de diagnóstico é dividida nas seguintes colunas:

  • Nível. Nível de confiabilidade em que o erro foi encontrado. 1º nível (vermelho) - os lugares mais suspeitos. 3º nível (amarelo) - provavelmente uma pequena imprecisão no código.
  • Asterisk Ela não tem um propósito específico. O usuário pode interpretá-lo a seu critério. Por exemplo, ele pode apontar os avisos mais interessantes para uma análise mais cuidadosa. Uma analogia é marcar letras com um asterisco em um programa de email como o Thunderbird ou o Outlook.
  • ID Número de mensagem exclusivo. Pode ser útil ao trabalhar com uma lista grande. Por exemplo, você pode acessar a mensagem com um número específico (consulte o item "Navegar para ID ..." no menu de contexto ).
  • Código Código da mensagem Se você clicar com o mouse, uma página com uma descrição do aviso será aberta.
  • CWE. Identifica um aviso usando o código CWE (Common Weakness Enumeration). Ao clicar no link, você pode ver uma descrição desse CWE na rede.
  • Misra. O mesmo que acima, mas apenas para o padrão MISRA .
  • Mensagem O texto da mensagem de diagnóstico.
  • Projeto Nome do projeto (você pode desativar esta coluna usando o menu de contexto).
  • Ficheiro Nome do arquivo
  • Linha Número da linha Importante! Observe que, depois de algumas linhas, há reticências. Exemplo: "123 (...)". Ao clicar neste número, você obterá uma lista de todas as linhas de código relacionadas a esta mensagem. Nesse caso, é possível ir para cada uma das linhas da lista.

Sim, ler tudo isso foi cansativo. No entanto, garanto que, começando a usá-lo, você rapidamente se sente confortável com a ferramenta. E você raramente pressiona algo para configurar.

Menu de contexto


Portanto, clicando duas vezes na mensagem, você acessa o fragmento de código desejado. Pressionando o botão direito do mouse, um menu de contexto é aberto.

O menu é bastante simples e você não deve sobrecarregar o artigo com uma descrição de cada um dos itens. Se algo não estiver claro, você pode espiar na documentação.

No entanto, quero me debruçar sobre um recurso muito útil. Lembre-se de que nas configurações você pode adicionar pastas / arquivos para exclusão (veja a Figura 2). Então, adicionar algo é muito mais fácil do que parece!

Preste atenção ao item "Não verifique arquivos e oculte todas as mensagens de ...". Quando você clica nele, pode ser adicionada uma lista de caminhos que podem ser adicionados à exceção (consulte a Figura 6).

Figura 6. Excluindo arquivos da verificação.


Figura 6. Excluindo arquivos da verificação.

Você pode selecionar um único arquivo ou um dos diretórios. A figura mostra que a pasta "SDL2-2.0.9 \ src \ haptic \ windows" está selecionada. Isso significa que todos os arquivos nesta pasta e todas as subpastas serão excluídos da análise. Além disso, todas as mensagens relacionadas a esses arquivos desaparecerão imediatamente da lista. Muito confortável Você não precisa reiniciar a análise para remover todas as mensagens relacionadas ao teste.

Modo de análise incremental


A introdução ao PVS-Studio ficará incompleta se você não falar sobre um dos recursos mais importantes - a análise incremental de código.

Quanto mais cedo o erro for encontrado, mais barato será corrigi-lo. É ideal enfatizar imediatamente os erros no texto editado do programa. No entanto, é tecnicamente difícil e consome muitos recursos. Portanto, o PVS-Studio inicia em segundo plano no momento em que o código corrigido foi compilado com êxito. Assim, os erros são pesquisados ​​no código recém-modificado. O fato de a análise estar ocorrendo pode ser julgado pelo ícone na área de notificação do sistema.

Quando um erro é encontrado, uma janela pop-up aparece avisando sobre o perigo (veja a Figura 7).

Figura 7. Uma mensagem pop-up de que locais suspeitos foram encontrados nos arquivos editados.

Figura 7. Uma mensagem pop-up de que locais suspeitos foram encontrados nos arquivos editados.

Se você clicar no ícone, o IDE será aberto com o resultado da verificação do projeto (consulte a Figura 2) e será possível examinar os fragmentos de código suspeitos.

De fato, do que descrever esse modo, é mais fácil tentar trabalhar com ele. Você escreve o código como antes. E, se necessário, o analisador irá incomodá-lo. Experimente!

Nós mesmos constantemente usamos esse modo. Sim, às vezes também cometemos erros de codificação. E a capacidade de corrigi-los imediatamente reduz significativamente o tempo para detectar um defeito e uma tentativa de entender por que o programa não se comporta conforme o planejado. É uma pena gastar 15 a 20 minutos depurando e depois encontrar um erro de digitação no índice. Aqui está um dos casos em que o PVS-Studio encontrou um erro no PVS-Studio logo após aparecer no código:

if (in[0] == '\\' && in[1] == '.' && in[1] == '\\') { in += 2; continue; } 

Mas estas, é claro, são flores. O analisador PVS-Studio às vezes pode ser muito mais útil. Aqui está uma das opiniões sobre o nosso analisador: " Um exemplo de uso de um analisador estático ". O texto faz você pensar.

Eu resumo. A análise incremental é algo que você definitivamente deveria tentar. Você o amará assim que encontrar alguns erros no código novo.

Recursos do PVS-Studio


Vamos ser breves. É impossível descrever de forma concisa todos os diagnósticos disponíveis no PVS-Studio. Uma lista completa de diagnósticos e suas descrições detalhadas podem ser encontradas na documentação: Descrição dos erros diagnosticados . Nós nos restringimos a uma tabela na qual os diagnósticos são agrupados por tipo. Alguns diagnósticos estão incluídos em mais de um grupo. O fato é que a divisão é muito arbitrária. Por exemplo, um erro de digitação pode levar ao uso de memória não inicializada. Pelo contrário, alguns erros não encontraram um lugar na tabela, pois são muito específicos. No entanto, a tabela como um todo dá uma idéia da funcionalidade de um analisador de código estático (veja a Figura 8).

Figura 8. Recursos do PVS-Studio.

Figura 8. Recursos do PVS-Studio.

Como você pode ver, o analisador se manifesta o máximo possível em áreas como a busca por erros que ocorreram devido a erros de digitação, copiar e colar. Ele diagnostica problemas relacionados à segurança do código.

Você pode descobrir como tudo isso funciona na prática, observando o banco de dados de erros . Coletamos nesse banco de dados todos os erros que encontramos ao verificar vários projetos de código aberto.

SAST


O PVS-Studio é uma ferramenta para testes de segurança de aplicativos estáticos (Static Application Security Testing, SAST) - o analisador pode identificar possíveis vulnerabilidades no código do projeto e mostrar o identificador de erro correspondente em uma determinada classificação.

O PVS-Studio suporta as seguintes classificações de erro:

  1. CWE
  2. SEI CERT
  3. Misra

Você pode ativar a exibição de códigos CWE usando o menu de contexto na janela do analisador em Mostrar colunas> CWE

Figura 9. Menu de contexto e um exemplo da saída dos códigos CWE.

Figura 9. Menu de contexto e um exemplo da saída dos códigos CWE.

Ou no menu acima (Extensões> PVS-Studio> Exibir códigos CWE na janela Saída)

Figura 10. O menu de extensão.

Figura 10. O menu de extensão.

Os diagnósticos MISRA estão incluídos separadamente nas configurações:

Figura 11. Lista de erros detectados.

Figura 11. Lista de erros detectados.

Leia mais sobre essas classificações aqui .

Verificando Projetos na Linha de Comandos


PVS-Studio_Cmd.exe é um utilitário para verificar projetos C ++ / C # Visual Studio (.vcxproj / .csproj) e .sln na linha de comando. Pode ser útil para automatizar a análise. O programa está localizado no diretório em que a instalação foi feita - por padrão, é 'C: \ Arquivos de Programas (x86) \ PVS-Studio'.

O programa tem muitos parâmetros , mas primeiro precisamos de apenas três deles:

  • --target: o arquivo do projeto ou solução a ser verificado.
  • --output: o arquivo de plug-in em que você deseja escrever o relatório.
  • --progress: mostra o progresso da verificação.

É assim que o lançamento será:

Figura 12. A saída do programa PVS-Studio_Cmd.exe

Figura 12. A saída do programa PVS-Studio_Cmd.exe

Após a execução, obteremos um arquivo plog com o relatório, o caminho especificado nas opções de inicialização. Este relatório pode ser convertido para outros formatos usando o utilitário PlogConverter.exe e, para visualizar o relatório no IDE, clique duas vezes no arquivo plog no Explorer.

Você também pode abrir o arquivo de relatório no menu de extensão em Extensões> PVS-Studio> Abrir / Salvar> Abrir relatório de análise ...

Quadro 4


Informações detalhadas sobre o utilitário e seus parâmetros podem ser encontradas na documentação .

Supressão de falsos avisos


Algumas mensagens emitidas pelo analisador serão inevitavelmente falsas. Nada pode ser feito sobre isso. Um analisador estático é apenas um programa que não possui inteligência artificial e não pode determinar exatamente se encontrou um erro real ou não.

Para combater os falsos positivos, o analisador fornece um conjunto de mecanismos diferentes. Eles são descritos em detalhes nas seguintes seções da documentação:


Conclusão


Obviamente, aqui não falamos tudo sobre o instrumento. Se você contar tudo, o artigo se transformará em documentação. O objetivo era mostrar como é fácil trabalhar com a ferramenta no ambiente do Visual Studio. Você pode ler sobre outros ambientes e modos de operação na documentação e outros artigos localizados em nosso site . A propósito, existem muitas coisas interessantes para programadores. Venha passear.

Note-se que o PVS-Studio não funciona apenas no ambiente da Microsoft. Também suportamos a linguagem Java, podemos trabalhar no Linux e macOS, integrar no CMake e muito mais. Para mais informações, consulte a documentação .

Desejo-lhe um código sem código e espero que você goste do PVS-Studio. Se você tiver alguma dúvida, sempre ajudaremos e informaremos. Escreva para nós .

Recursos adicionais:


  1. Revisão de código
  2. Análise de código estático .
  3. Ferramentas de análise de código estático .
  4. SAST .
  5. Tecnologias usadas no analisador PVS-Studio .
  6. Baixe o PVS-Studio e experimente.
  7. Suporte para o Visual Studio 2019 .
  8. Discuta o preço do analisador PVS-Studio para sua equipe e como comprá-lo: compre o PVS-Studio .
  9. Um exemplo de uso de um analisador estático .
  10. Respostas a perguntas freqüentes em conferências.
  11. Como iniciar o PVS-Studio Java
  12. Como executar o PVS-Studio no Linux e macOS



Se você deseja compartilhar este artigo com um público que fala inglês, use o link para a tradução: Sergey Larin. PVS-Studio para Visual Studio

Source: https://habr.com/ru/post/pt458070/


All Articles