Análise estática do Clang

Boas novas: Se você quer fazer o build com o plugin Mozilla Clang (localizado em /build/clang-plugin e associado com o MOZ_CLANG_PLUGIN e os atributos em /mfbt/Attributes.h), é muito mais fácil que isso: apenas adicionar --enable-clang-plugin ao seu mozconfig!

O Clang tem um analisador estático embutido. A ideia principal é você adicionar um empacotador no compilador que direciona todos os resultados da análise estácica para um local comum. No fim do build, esses relatórios são juntos em um documento único mostrando todos os possíveis problemas.

Essas instruções irão apenas funcionar onde o Mozilla já compila com o Clang. No momento que isto é escrito, o Mac OS X e o GNU/Linux tem um suporte mais forte. Por favor, perceba que a maior parte do esforço do analisador estático no Clang são majoritariamente feitos em clang-tidy, uma vez que os verificadores são muito mais fáceis de escrever.

Idealmente, a análise estática seria feita independentemente da compilação. Veja bug 663442 para localizar uma solução alternativa que facilita a análise estática.

Instalando o Clang

O primeiro passo para executar uma análise estática é instalando o Clang. Atualmente, ele está disponível para a maioria das distribuições GNU/Linux mas também está disponível com Xcode como o compilador padrão.

Configurando o ambiente de build

Uma vez que você tiver o build do seu Clang pronto, você irá precisar preparar ferramentas para usá-lo. Veja um .mozconfig totalmente funcional para o navegador desktop:

. $topsrcdir/browser/config/mozconfig
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-ff-dbg

ac_add_options --enable-debug

Tentativas de usar o ccache irá muito provavelmente resultar em falhas de compilação. É também necessário evitar builds otimizados, uma vez que estes irão modificar as macros no que resulta em muitos falso-positivos.

Nessa altura, o ambiente build do seu Mozilla deve estar configurado para compilar através do analisador estático do Clang!

Realizando scan no build

Não é o suficiente simplesmente iniciar o build do forma normal. Em vez disso, você precisa executar o build através de um script utilitário do Clang que irá acompanhar toda a análise produzida e consolidá-la automaticamente.

Esse scritp é o scan-build. Você pode encontrá-lo em $clang_source/tools/scan-build/scan-build.

Tente executar o seu build com o scan-build:

$ cd /path/to/mozilla/source

# Blow away your object directory because incremental builds don't make sense
$ rm -rf obj-dir

# To start the build:
scan-build --show-description ./mach build -v

# The above should execute without any errors. However, it should take longer than
# normal because all compilation will be executing through Clang's static analyzer,
# which adds overhead.

Se tudo estiver ocorrendo bem, você deve ver muitas informações no console, assim como qualquer build.

Na primeira vez que você rodar o scan-build, dê CTRL+C depois que alguns arquivos forem compilados. Você deve ver uma saída como essa:

scan-build: 3 bugs found.
scan-build: Run 'scan-view /Users/gps/tmp/mcsb/2011-12-15-3' to examine bug reports.

Se você ver uma mensagem como essa:

scan-build: Removing directory '/var/folders/s2/zc78dpsx2rz6cpc_21r9g5hr0000gn/T/scan-build-2011-12-15-1' because it contains no reports.

ou nenhum resultado de análise estática está disponível ainda ou seu ambiente não está configurado corretamente.

Por padrão, scan-build produz resultados em um diretório em uma localização pseudo-temporária. Você pode controlar onde os resultados vão ao passar o argumento -o /path/to/output no script scan-build.

Você pode também querer executar scan-build --help para ver todas as opções disponíveis. É possível habilitar ou desabilitar seletivamente analisadores individuais, por exemplo.

Analisando a saída

Uma vez que o build estiver completado, o script scan-build irá produzir um relatório resumindo tudo que foi encontrado. Este é chamado de index.html no diretório de saída. Você pode executar o scan-view (em $clang_source/tools/scan-view/scan-view) como a saída do scan-build sugere; isso meramente ativa um servidor HTTP local. Ou você deve poder abrir o index.html diretamente no seu navegador.

Falso-positivos

Há muitos falso-positivos atualmente no analisador estático. Muitos deles são devido ao analisador ter dificuldades em seguir o relativamente complicado tratamento de erros em várias macros do pré-processador. Por exemplo, a maioria das nossas macros ASSERT() chamam outras funções as quais elas chamam assert() ou fazem alguma outra coisa.

A longo-prazo, nós devemos adicionar um conjunto de macros habilidados via #ifdef o que fornece simples e compreensíveis macros. Há também algumas pragmas e extensões do compilador que podemos investigar usando avisos silenciosos.

Veja também

Etiquetas do documento e colaboradores

 Colaboradores desta página: ygormaximo
 Última atualização por: ygormaximo,