Análise estática – da introdução à integração

Cansado de intermináveis ​​revisões ou depuração de código, às vezes você pensa em como simplificar sua vida. E depois de pesquisar um pouco, ou tropeçar acidentalmente nele, você verá a frase mágica: “Análise estática”. Vamos ver o que é e como pode interagir com o seu projeto.

Análise estática – da introdução à integração
Na verdade, se você escreve em qualquer linguagem moderna, então, mesmo sem perceber, você a executa em um analisador estático. O fato é que qualquer compilador moderno fornece, ainda que pequeno, um conjunto de avisos sobre possíveis problemas no código. Por exemplo, ao compilar o código C++ no Visual Studio, você poderá ver o seguinte:

Análise estática – da introdução à integração
Nesta saída vemos que a variável var nunca foi usado em nenhum lugar da função. Então, na realidade, você quase sempre usou um analisador de código estático simples. No entanto, ao contrário dos analisadores profissionais como Coverity, Klocwork ou PVS-Studio, os avisos fornecidos pelo compilador podem indicar apenas uma pequena gama de problemas.

Se você não sabe ao certo o que é análise estática e como implementá-la, leia este artigopara saber mais sobre esta metodologia.

Por que você precisa de análise estática?

Em poucas palavras: aceleração e simplificação.

A análise estática permite encontrar muitos problemas diferentes no código: desde o uso incorreto de construções de linguagem até erros de digitação. Por exemplo, em vez de

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Você escreveu o seguinte código:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

Como você pode ver, há um erro de digitação na última linha. Por exemplo, o PVS-Studio emite o seguinte aviso:

V537 Considere revisar a correção do uso do item 'y'.

Se você quiser descobrir esse erro, tente um exemplo pronto no Compiler Explorer: *clique*.

E como você entende, nem sempre é possível prestar atenção a essas seções do código imediatamente e, por causa disso, você pode ficar sentado depurando por uma boa hora, perguntando-se por que tudo funciona de maneira tão estranha.

No entanto, isso é claramente um erro. E se o desenvolvedor escreveu um código abaixo do ideal porque esqueceu alguma sutileza da linguagem? Ou até mesmo permitiu isso no código comportamento indefinido? Infelizmente, esses casos são completamente comuns e a maior parte do tempo é gasta na depuração de código especificamente funcional que contém erros de digitação, erros típicos ou comportamento indefinido.

É para essas situações que surgiu a análise estática. Este é um assistente do desenvolvedor que irá apontar diversos problemas no código e explicar na documentação porque não é necessário escrever desta forma, o que pode levar e como consertar. Aqui está um exemplo de como pode ser: *clique*.

Você pode encontrar erros mais interessantes que o analisador pode detectar nos artigos:

Agora que você leu este material e está convencido dos benefícios da análise estática, talvez você queira experimentá-la. Mas por onde começar? Como integrar uma nova ferramenta ao seu projeto atual? E como apresentar a equipe a ele? Você encontrará respostas para essas perguntas abaixo.

Nota. A análise estática não substitui ou cancela algo tão útil como as revisões de código. Ele complementa esse processo, ajudando a perceber e corrigir antecipadamente erros de digitação, imprecisões e designs perigosos. É muito mais produtivo focar nas revisões de código em algoritmos e clareza de código, em vez de procurar parênteses ou parênteses mal colocados. leia funções de comparação chatas.

0. Conhecendo a ferramenta

Tudo começa com uma versão de teste. Na verdade, é difícil decidir introduzir algo no processo de desenvolvimento se você nunca viu a ferramenta ao vivo antes. Portanto, a primeira coisa que você deve fazer é baixar versão de teste.

O que você aprenderá nesta fase:

  • Quais são as formas de interagir com o analisador;
  • O analisador é compatível com seu ambiente de desenvolvimento?
  • Que problemas existem atualmente em seus projetos?

Depois de instalar tudo o que você precisa, a primeira coisa que você deve fazer é analisar todo o projeto (Windows, Linux, MacOS). No caso do PVS-Studio no Visual Studio você verá uma imagem semelhante (clicável):

Análise estática – da introdução à integração
O fato é que os analisadores estáticos geralmente emitem um grande número de avisos para projetos com uma grande base de código. Não há necessidade de consertar todos, pois seu projeto já está funcionando, o que significa que esses problemas não são críticos. No entanto, você você pode ver os avisos mais interessantes e corrija-os se necessário. Para fazer isso, você precisa filtrar a saída e deixar apenas as mensagens mais confiáveis. No plugin PVS-Studio para Visual Studio, isso é feito filtrando por níveis de erro e categorias. Para uma saída mais precisa, deixe apenas Alta и Geral (também clicável):

Análise estática – da introdução à integração
Na verdade, 178 avisos são muito mais fáceis de visualizar do que vários milhares...

Em abas Médio и Baixo Muitas vezes há bons avisos, mas essas categorias incluem os diagnósticos que têm menos precisão (confiabilidade). Mais informações sobre níveis de aviso e opções para trabalhar no Windows podem ser encontradas aqui: *clique*.

Ter revisto com sucesso os erros mais interessantes (e corrigi-los com sucesso) vale a pena suprimir avisos restantes. Isso é necessário para que novos avisos não se percam entre os antigos. Além disso, um analisador estático é um assistente do programador e não uma lista de bugs. 🙂

1. Automação

Depois de se familiarizar, é hora de configurar plugins e integrar ao CI. Isso deve ser feito antes dos programadores começarem a usar o analisador estático. O fato é que o programador pode esquecer de habilitar a análise ou nem querer fazê-la. Para fazer isso, você precisa fazer algumas verificações finais de tudo para que o código não testado não possa entrar no ramo de desenvolvimento geral.

O que você aprenderá nesta fase:

  • Quais opções de automação a ferramenta oferece;
  • O analisador é compatível com o seu sistema de montagem?

Como não existe documentação perfeita, às vezes você precisa escrever apoiar. Isso é normal e ficaremos felizes em ajudá-lo. 🙂

Agora vamos passar para os serviços de integração contínua (CI). Qualquer analisador pode ser implementado neles sem problemas sérios. Para fazer isso, você precisa criar um estágio separado no pipeline, que geralmente está localizado após a construção e os testes de unidade. Isso é feito usando vários utilitários de console. Por exemplo, o PVS-Studio fornece os seguintes utilitários:

Para integrar a análise ao CI, você precisa fazer três coisas:

  • Instale o analisador;
  • Executar análise;
  • Entregar resultados.

Por exemplo, para instalar o PVS-Studio no Linux (base Debian), você precisa executar os seguintes comandos:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

Em sistemas que executam Windows, não há como instalar o analisador a partir do gerenciador de pacotes, mas é possível implantar o analisador a partir da linha de comando:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Você pode ler mais sobre a implantação do PVS-Studio em sistemas que executam Windows *aqui*.

Após a instalação, você precisa executar a análise diretamente. No entanto, é recomendado fazer isso somente após a conclusão da compilação e dos testes. Isso ocorre porque a análise estática normalmente leva o dobro do tempo que a compilação.

Como o método de lançamento depende da plataforma e das características do projeto, mostrarei como exemplo a opção para C++ (Linux):

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

O primeiro comando realizará a análise, e o segundo envelopesconverte o relatório em formato texto, exibe-o na tela e retorna um código de retorno diferente de 0 caso haja avisos. Um mecanismo como esse pode ser convenientemente usado para bloquear uma compilação quando houver mensagens de erro. No entanto, você sempre pode remover a sinalização -w e não bloqueie um assembly que contenha avisos.

Nota. O formato do texto é inconveniente. É fornecido simplesmente como exemplo. Preste atenção a um formato de relatório mais interessante - FullHtml. Ele permite que você navegue pelo código.

Você pode ler mais sobre como configurar a análise de CI no artigo "PVS-Studio e Integração Contínua" (Windows) ou "Como configurar o PVS-Studio no Travis CI" (Linux).

Ok, você configurou o analisador no servidor de compilação. Agora, se alguém carregou código não testado, o estágio de verificação falhará e você poderá detectar o problema, porém, isso não é totalmente conveniente, pois é mais eficiente verificar o projeto não após a fusão das ramificações, mas antes dele, no estágio de pull request. A.

Em geral, configurar uma análise de pull request não é muito diferente do lançamento normal de uma análise de CI. Exceto pela necessidade de obter uma lista dos arquivos alterados. Geralmente, eles podem ser obtidos consultando as diferenças entre ramificações usando git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Agora você precisa passar esta lista de arquivos para o analisador como entrada. Por exemplo, no PVS-Studio isso é implementado usando o sinalizador -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Você pode descobrir mais sobre como analisar solicitações pull *aqui*. Mesmo que o seu IC não esteja na lista de serviços mencionada no artigo, você achará útil a seção geral dedicada à teoria desse tipo de análise.

Ao configurar a análise de solicitações pull, você pode bloquear commits contendo avisos, criando assim um limite que o código não testado não pode ultrapassar.

Certamente tudo isso é bom, mas gostaria de poder ver todos os avisos em um só lugar. Não apenas do analisador estático, mas também de testes unitários ou do analisador dinâmico. Existem vários serviços e plugins para isso. O PVS-Studio, por exemplo, possui plugin para integração no SonarQube.

2. Integração em máquinas de desenvolvedores

Agora é hora de instalar e configurar o analisador para uso diário no desenvolvimento. Neste ponto você já está familiarizado com a maioria das formas de trabalhar, então esta pode ser considerada a parte mais fácil.

Como opção mais simples, os desenvolvedores podem instalar eles próprios o analisador necessário. No entanto, isso levará muito tempo e os distrairá do desenvolvimento, então você pode automatizar esse processo usando um instalador e os sinalizadores necessários. Para o PVS-Studio existem vários sinalizadores para instalação automatizada. Porém, sempre existem gerenciadores de pacotes, por exemplo, Chocolatey (Windows), Homebrew (macOS) ou dezenas de opções para Linux.

Então você precisará instalar os plugins necessários, por exemplo para Visual Studio, IDEA, Cavaleiro etc.

3. Uso diário

Nesta fase, é hora de dizer algumas palavras sobre as formas de acelerar o analisador durante o uso diário. Uma análise completa de todo o projeto leva muito tempo, mas com que frequência alteramos o código de todo o projeto de uma só vez? Quase não existe refatoração tão grande que afete imediatamente toda a base de código. O número de arquivos alterados por vez raramente excede uma dúzia, por isso faz sentido analisá-los. Para tal situação existe modo de análise incremental. Só não se assuste, esta não é outra ferramenta. Este é um modo especial que permite analisar apenas arquivos alterados e suas dependências, e isso acontece automaticamente após a construção se você estiver trabalhando em um IDE com o plugin instalado.

Se o analisador detectar problemas no código recentemente alterado, ele reportará isso de forma independente. Por exemplo, o PVS-Studio irá informá-lo sobre isso usando um alerta:

Análise estática – da introdução à integração
É claro que dizer aos desenvolvedores para usarem a ferramenta não é suficiente. Precisamos de alguma forma dizer-lhes o que é e como é. Aqui, por exemplo, estão artigos sobre um início rápido para o PVS-Studio, mas você pode encontrar tutoriais semelhantes para qualquer ferramenta de sua preferência:

Esses artigos fornecem todas as informações necessárias para o uso diário e não demoram muito. 🙂

Ainda na fase de conhecer a ferramenta, suprimimos muitos avisos durante um dos primeiros lançamentos. Infelizmente, os analisadores estáticos não são perfeitos e, de tempos em tempos, apresentam falsos positivos. Geralmente é fácil suprimi-los; por exemplo, no plugin PVS-Studio para Visual Studio você só precisa clicar em um botão:

Análise estática – da introdução à integração
No entanto, você pode fazer mais do que apenas suprimi-los. Por exemplo, você pode relatar um problema ao suporte. Se o falso positivo puder ser corrigido, em atualizações futuras você poderá notar que cada vez há cada vez menos falsos positivos específicos para sua base de código.

Possível integração

Assim, passamos por todos os estágios de integração da análise estática no processo de desenvolvimento. Apesar da importância de configurar tais ferramentas na CI, o local mais importante para executá-las é o computador do desenvolvedor. Afinal, um analisador estático não é um juiz que diz em algum lugar distante de você que o código não é bom. Pelo contrário, é um assistente que avisa se você está cansado e lembra se você esqueceu alguma coisa.

É verdade que, sem uso regular, é improvável que a análise estática simplifique significativamente o desenvolvimento. Afinal, seu principal benefício para um desenvolvedor não reside tanto na busca por seções de código complexas e controversas, mas na sua detecção precoce. Concorde que descobrir um problema após as edições terem sido enviadas para teste não é apenas desagradável, mas também consome muito tempo. A análise estática, quando usada regularmente, analisa cada alteração diretamente no seu computador e relata locais suspeitos enquanto trabalha no código.

E se você ou seus colegas ainda não têm certeza se vale a pena implementar o analisador, sugiro que comecem agora a ler o artigo "Razões para introduzir o analisador de código estático PVS-Studio no processo de desenvolvimento". Ele aborda preocupações típicas dos desenvolvedores de que a análise estática ocupará seu tempo e assim por diante.

Análise estática – da introdução à integração

Se você quiser compartilhar este artigo com um público que fala inglês, use o link de tradução: Maxim Zvyagintsev. Análise estática: do início à integração.

Fonte: habr.com

Adicionar um comentário