Muitos de nossos artigos estão focados em qualquer coisa, mas não na ferramenta PVS-Studio em si. Considerando que fazemos muito para tornar seu uso conveniente para os desenvolvedores. No entanto, nossos esforços costumam ser escondidos nos bastidores. Decidi remediar essa situação e falar sobre o plug-in PVS-Studio para Visual Studio. Se você usa o Visual Studio, este artigo é para você.
O que é análise de código estático e por que precisamos dela
A análise de código estático é o processo de detecção de erros e falhas no código fonte dos programas. A análise estática pode ser considerada como um processo de revisão automatizada de código. A
revisão conjunta de
código é uma metodologia maravilhosa. No entanto, tem uma desvantagem significativa - alto custo. É necessário reunir vários programadores para revisar o código recém-escrito ou reescrito após as modificações feitas nele.
Por um lado, queremos revisar o código regularmente. Por outro lado, é muito caro. A solução de compromisso são ferramentas de análise estática. Eles analisam seriamente o código fonte dos programas e dão recomendações aos programadores sobre a revisão de certos fragmentos de código. Obviamente, um programa não substituirá uma revisão de código completa, feita por uma equipe de desenvolvedores. No entanto, a relação preço / benefício torna a análise estática uma prática bastante útil, aplicada por muitas empresas. Se o leitor estiver interessado em números precisos, sugiro que você leia o artigo "
PVS-Studio ROI ".
Existem muitos 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 é bastante grande (C, C ++, C #, Java, Ada, Fortran, Perl, Ruby, ...). Escusado será dizer que falaremos sobre o
analisador PVS-Studio.
A principal vantagem da análise de código estático é a oportunidade de reduzir bastante o custo de eliminar defeitos em um programa. Quanto mais cedo um erro for detectado, menos caro será corrigi-lo. Assim, de acordo com o livro “Code Complete” de McConnell, a detecção de erros no estágio de teste de código é dez vezes mais cara do que no estágio de criação de código (codificação):
Figura 1. Custo médio de correção de defeitos, dependendo do tempo de sua aparência e detecção no código (os dados na tabela são retirados do livro 'Code Complete' de S. McConnell)As ferramentas de análise estática permitem detectar um grande número de erros, típicos do estágio de criação do código, o que reduz significativamente o custo de todo o desenvolvimento do projeto. Por exemplo, o analisador de código estático do PVS-Studio pode ser executado em modo de segundo plano logo após a compilação e, no caso de encontrar possíveis erros, notificará o programador. Mais sobre este modo será apresentado abaixo.
Analisador de código estático PVS-Studio
O PVS-Studio é um analisador estático que detecta bugs e possíveis vulnerabilidades no código-fonte dos aplicativos em C, C ++ (outras extensões suportadas:
C ++ / CLI e
C ++ / CX ), C # e Java nas plataformas Windows, Linux e macOS. O analisador é soberbamente integrado aos IDEs do Visual Studio 2010 - 2019 e do IntelliJ IDEA. Neste artigo, veremos mais de perto o PVS-Studio, verificando o código nas linguagens C, C ++ e C #. Você pode ler sobre como usar o PVS-Studio para verificar o código Java no IntelliJ IDEA
aqui .
Após a instalação do PVS-Studio e sua integração no Visual Studio, os usuários recebem um item adicional "PVS-Studio" no menu principal e na janela para trabalhar com mensagens de erro:
Figura 2. Os principais itens que o analisador PVS-Studio adiciona ao integrar ao Visual Studio.Configurações iniciais
O analisador está pronto para funcionar logo após a instalação. Na maioria dos casos, você não precisa configurar nada para a primeira execução. A única configuração que você pode precisar no início é a exclusão de bibliotecas de terceiros. Você não vai consertar nada nos arquivos originais, por exemplo, na biblioteca jpeg, portanto não há necessidade de verificar isso. Além disso, a exclusão de pastas desnecessárias acelerará a análise do projeto. As exceções do diretório são definidas 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á.Se no nome completo do arquivo houver um dos nomes especificados, a análise não será realizada para esse arquivo. Por padrão, os nomes de alguns diretórios já estão incluídos na lista. No entanto, no seu projeto, o diretório com a biblioteca ZLib pode ser chamado não de "zlib", mas, por exemplo, "zip_lib". Portanto, esta lista deve ser editada. Para começar a editar, você precisa clicar em um botão com três pontos.
Exemplos de máscaras aceitáveis para a lista PathMasks:
- c: \ Libs \ - todos os arquivos deste diretório e seus subdiretórios serão excluídos.
- \ Libs \ ou * \ Libs \ * - todos os arquivos nos diretórios, o caminho ao qual contém o subdiretório "Libs" será excluído. Se os símbolos "*" não forem especificados, eles serão adicionados automaticamente de qualquer maneira, portanto as duas opções serão iguais.
- Libs ou * Libs * - todos os arquivos, cujo caminho contém o subdiretório, cujo nome é igual ou contém 'Libs'. Também neste caso, todos os arquivos que contêm Libs em seus nomes, por exemplo, c: \ project \ mylibs.cpp, serão excluídos. Para evitar confusão, recomendamos sempre usar barras.
Além de excluir diretórios inteiros, você pode definir máscaras para excluir arquivos individuais. Para fazer isso, existe a configuração FileNameMasks. Saiba mais sobre como trabalhar com listas de exceções na documentação:
Configurações: Não verifique arquivos .
Verificação do projeto
Ao concluir as 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 a solução inteira, que contém projetos desses tipos. Para fazer isso, selecione o item de menu Extensões Extensões> PVS-Studio> Verificar> Solução (consulte a Figura 4).
Figura 4. Verifique uma solução usando o analisador PVS-Studio.Se houver alguma dificuldade com a verificação, recomendamos consultar a seção "
PVS-Studio: Solução de problemas " em nosso site. Essas não são recomendações estúpidas no espírito de "verificar se o plugue está inserido no soquete". A seção descreve situações típicas das solicitações dos usuários e sugere opções.
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. A janela possui muitos componentes de controle. Todos eles servem para mostrar exatamente as mensagens de diagnóstico que são interessantes para o usuário. No entanto, no primeiro momento, a janela pode parecer complicada. Vejamos todos os componentes de controle (veja a Figura 5).
Figura 5. Uma janela com mensagens de diagnóstico.- Bem, aqui está a janela do PVS-Studio.
- Menu adicional. Permite acessar opções como marcar avisos como falsos, ocultar mensagens e adicionar arquivos a exceções (leia sobre isso abaixo).
- O botão ativa as mensagens "algo deu errado". Por exemplo, um dos arquivos não pode ser pré-processado.
- Vá para a mensagem anterior / seguinte. Isso abre o arquivo relevante e o cursor é colocado na linha com um erro em potencial. Além disso, você sempre pode selecionar um diagnóstico da lista com um clique duplo. Você pode definir teclas de atalho para transições para a mensagem anterior / seguinte. Por padrão, são Alt + '[' e Alt + ']'.
- Botões que incluem avisos de diferentes níveis. Os dois primeiros níveis de diagnóstico estão agora ativados. Ao mesmo tempo, a janela mostra 90 avisos do primeiro nível, 6700 avisos do segundo nível. O nível da mensagem é mostrado no lado esquerdo da janela como uma faixa, correspondendo à cor da faixa no botão de nível correspondente. Por que existem tantos disparos? Por que 6700 avisos? Para demonstrar as habilidades da interface, um conjunto de regras MISRA está ativado, o que é inadequado para aplicativos regulares :).
- Conjuntos ativos de regras de diagnóstico. Geral - diagnóstico geral, Otimização - micro-otimização, diagnóstico de 64 bits - 64 bits, diagnóstico dos padrões MISRA - MISRA C e MISRA C ++. Todos os tipos de avisos agora são exibidos na janela.
- O indicador mostra o número de avisos marcados como falsos (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.
- Filtros rápidos. Por exemplo, você pode encurtar a lista para apenas mensagens com o código V501 e as do projeto XYZ.
- Alguns diagnósticos sugerem prestar atenção não a uma, mas a várias linhas. Nesse caso, pontos aparecem ao lado do número da linha. Clicando nele, você pode ver a lista de linhas e escolher uma delas.
A tabela com mensagens de diagnóstico é dividida nas seguintes colunas:
- Nível O nível de certeza que indica que foi encontrado um erro, não um cheiro de código. O nível 1 (vermelho) mostra os locais mais suspeitos. O nível 3 (amarelo) é provavelmente uma imprecisão não essencial no código.
- Estrela Não tem um objetivo específico. Os usuários podem interpretá-lo como desejarem. Por exemplo, um usuário pode marcar os avisos mais interessantes para uma análise mais cuidadosa. A analogia é a marca principal de emails em clientes de email como o Thunderbird ou o Outlook.
- ID Número de mensagem exclusivo. Pode ser útil ao lidar com uma lista grande. Por exemplo, você pode acessar uma mensagem com um número específico (consulte "Navegue até o ID ..." no menu de contexto ).
- Código Código da mensagem. Se você clicar nele, abrirá uma página descrevendo o aviso.
- CWE. Permite identificar um aviso pelo 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 para o padrão MISRA .
- Mensagem O texto da mensagem de diagnóstico.
- Projeto Nome do projeto (você pode desativar esta coluna usando um menu de contexto).
- Ficheiro Nome do arquivo
- Linha Número da linha Importante! Observe que algumas linhas terminam com pontos. Exemplo: "123 (...)". Ao clicar neste número, você obterá uma lista de todas as linhas de código relacionadas a esta mensagem. Ao mesmo tempo, você pode ir para cada uma das linhas da lista.
Sim, foi exaustivo ler tudo. No entanto, garanto que, depois de começar a usá-lo, você se acostumará rapidamente à ferramenta. E você raramente clica em algo para configurar.
Menu de contexto
Portanto, clicando duas vezes na mensagem, você acessa o trecho de código relevante. Com o clique do botão direito do mouse, o menu de contexto é aberto.
O menu é bastante simples e não vou desarrumar o artigo com a descrição de cada item. Se algo não estiver claro, você pode consultar a documentação.
No entanto, gostaria de me debruçar sobre um recurso muito útil. Você se lembra que nas configurações você pode adicionar pastas / arquivos a serem excluídos? O fato é que adicionar algo é muito mais simples do que parece!
Preste atenção à opção de menu "Não verifique arquivos e oculte todas as mensagens de ...". Ao clicar nele, você obtém uma lista de caminhos que você pode adicionar às exceções (veja a figura 6).
Figura 6. Excluindo arquivos da verificação.Você pode escolher um arquivo separado ou um dos diretórios. A imagem mostra que a pasta "SDL2-2.0.9 \ src \ haptic \ windows" foi escolhida. 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 da lista imediatamente. Muito conveniente. Você não precisa reiniciar a análise para remover todas as mensagens relacionadas aos testes.
Modo de análise incremental
A introdução ao PVS-Studio será incompleta, se ocultarmos um dos recursos mais importantes -
a análise incremental de código .
Quanto mais cedo um erro for detectado, menos caro será eliminá-lo. A melhor opção é destacar erros no texto do programa editado imediatamente. No entanto, é tecnicamente difícil e consome muitos recursos. É por isso que o PVS-Studio é executado no modo de segundo plano quando o código fixo é compilado com sucesso. Ao fazer isso, você procura por erros no código que acabou de ser alterado. O ícone na área de notificação do sistema indica que a análise está em execução.
Quando um erro é encontrado, uma janela pop-up aparece, alertando sobre o perigo (veja a Figura 7).
Figura 7. Uma mensagem pop-up informando que locais suspeitos foram encontrados nos arquivos editados.Se você clicar no ícone, abrirá o IDE com o resultado da verificação do projeto (veja a Figura 2) e poderá cavar fragmentos de código suspeitos.
De fato, é mais fácil tentar trabalhar nesse modo do que descrevê-lo. Você escreve o código como antes. Quando necessário, o analisador irá incomodá-lo. Experimente!
Usamos esse modo o tempo todo. Sim, às vezes também cometemos erros de codificação. A capacidade de corrigi-los imediatamente reduz significativamente o tempo para detectar o defeito e tentar entender por que o programa não está se comportando como planejado. É muito perturbador gastar 15 a 20 minutos depurando para eventualmente 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; }
Bem, o mais interessante ainda está por vir. O analisador PVS-Studio às vezes pode ser muito mais útil que isso. Aqui está uma das opiniões sobre o nosso analisador: "
A experiência do usuário de trabalhar com o analisador ". O texto me faz pensar.
Deixe-me resumir. A análise incremental é algo que você definitivamente deveria tentar. Você vai adorar assim que encontrar alguns erros no código novo.
Recursos do PVS-Studio
Sejamos breves. É impossível descrever sucintamente 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 bugs detectados . Vamos resolver a tabela na qual os diagnósticos são agrupados por tipo. Alguns diagnósticos estão em mais de um grupo. O fato é que a classificação é bastante formal. Por exemplo, um erro de digitação pode resultar no uso de memória não inicializada. Alguns dos erros, pelo contrário, não cabiam em nenhum dos grupos, porque eram muito específicos. No entanto, esta tabela fornece informações sobre o funcionamento do analisador de código estático.
Figura 8. Recursos do PVS-Studio.Como você vê, o analisador é especialmente útil em áreas como procurar bugs de copiar e colar. É ótimo na detecção de problemas relacionados à segurança do código.
Para ver esses diagnósticos em ação, consulte a
base de erros . Coletamos todos os erros que encontramos, verificando vários projetos de código aberto com o PVS-Studio.
SAST
O PVS-Studio é uma ferramenta estática de teste de segurança de aplicativos. O analisador pode detectar possíveis vulnerabilidades no código do projeto e mostrar o identificador de erro apropriado em uma determinada classificação.
O PVS-Studio suporta as seguintes classificações de erro:
- CWE
- SEI CERT
- Misra
Você pode ativar a exibição de códigos CWE no menu de contexto da janela do analisador, no caminho Mostrar colunas> CWE
Figura 9. Menu de contexto e o exemplo de saída CWE.Ou no menu principal (Extensões> PVS-Studio> Exibir códigos CWE na janela Saída)

Figura 10. Menu de extensão.O diagnóstico MISRA é ativado separadamente nas configurações:

Figura 11. Uma lista de erros detectados.Você pode ler mais sobre essas classificações
aqui .
Verificando projetos na linha de comando
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 automatizar a análise. O programa está 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: arquivo de projeto ou solução que precisa ser verificado.
- --output: arquivo plog no qual o relatório precisa ser gravado.
- --progress: mostra o progresso de uma verificação.
Aqui está a aparência da execução:

Figura 12. Saída do programa PVS-Studio_Cmd.exe.Após a execução, obteremos um arquivo de plug-in com um relatório, um caminho especificado nas opções de execução. Você pode converter este relatório em outros formatos usando o utilitário PlogConverter.exe. Para visualizar o relatório no IDE, clique duas vezes em um arquivo plog no localizador.
Também é possível abrir o arquivo de relatório no menu de extensão pelo caminho Extensões> PVS-Studio> Abrir / Salvar> Abrir relatório de análise ...
Informações detalhadas sobre o utilitário e seus parâmetros podem ser encontradas na
documentação .
Supressão de falsos positivos
Algumas mensagens emitidas pelo analisador serão inevitavelmente falsas. Não há nada que possamos fazer sobre isso. Um analisador estático é apenas um programa que não possui inteligência artificial e não pode identificar se é um bug real ou não.
Para combater os falsos positivos, o analisador fornece um conjunto de mecanismos diferentes. Eles são detalhados nas seguintes seções da documentação:
- Ajuste fino .
- Um método aproximado que permite trabalhar apenas com avisos relacionados a código novo ou modificado.
Conclusão
Obviamente, não contamos tudo sobre a ferramenta. 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 trabalho na documentação e outros artigos em nosso
site . A propósito, existem muitas coisas interessantes para os programadores. Venha e fique por aqui.
Vale ressaltar 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. Você pode descobrir mais na
documentação .
Desejo a você um código incorreto e espero que você goste do PVS-Studio. Se houver alguma dúvida, sempre ajudaremos e daremos conselhos.
Escreva para nós .
Links adicionais:
- Revisão de código .
- Análise de código estático .
- Ferramentas de análise de código estático .
- SAST .
- Tecnologias usadas no analisador PVS-Studio .
- Faça o download e experimente o PVS-Studio.
- Suporte do Visual Studio 2019 .
- Discuta o preço do analisador PVS-Studio para sua equipe e como comprá-lo: compre o PVS-Studio .
- Exemplo de uso de um analisador estático .
- Respostas a perguntas freqüentemente feitas em conferências.
- Como executar o PVS-Studio Java
- Como executar o PVS-Studio no Linux e macOS