Criando o Primeiro Clang-tidy Check

Como criamos um novo check para a ferramenta clang-tidy?

Vemos isso logo depois de descobrirmos como compilar o compilador LLVM/Clang …

Clonar e compilar o LLVM

Link: https://github.com/llvm/llvm-project

Link: https://clang.llvm.org/get_started.html

O primeiro passo que precisamos realizar é clonar e compilar o repositório do LLVM.

$ git clone https://github.com/llvm/llvm-project
$ cd llvm-project
$ cmake -S llvm -B build -G Ninja \
        -DCMAKE_INSTALL_PREFIX="$HOME/bin/clang" \
        -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" \
        -DCMAKE_BUILD_TYPE=Release \
        -DLLVM_PARALLEL_LINK_JOBS=1
$ cmake --build build

Compilar o repositório inteiro demora um pouco. Porém nas vezes seguintes apenas os arquivos modificados serão recompilados e, portanto, o processo será mais rápido.

O consumo de memória RAM pode ser um problema. Ao linkar são necessário 8 GB de RAM por linker, talvez mais. Para reduzir a memória RAM utilizada durante a compilação fazemos uma build do tipo “Release” e limitamos a um linker executando por vez.

Depois de tudo compilado, pode-se recompilar apenas o clang-tidy com o comando

$ cmake --build build clang-tidy

Além disso, para compilar e executar os testes de unidade do clang-tidy use o comando

$ cmake --build build check-extra-tools

Testar o Clang-tidy Recém Compilado

Agora vamos ter certeza que o executável do clang-tidy está compilado.

$ cd build/bin
$ ./clang-tidy --version

LLVM (http://llvm.org/):
  LLVM version 15.0.0git
  Optimized build.
  Default target: x86_64-unknown-linux-gnu
  Host CPU: ivybridge

Podemos também verificar os checks disponíveis:

$ ./clang-tidy --list-checks --checks="*"

Enabled checks:
    abseil-cleanup-ctad
    abseil-duration-addition
    ...
    readability-use-anyofallof
    zircon-temporary-objects

Criando o Novo Check do Clang-tidy

Link: https://clang.llvm.org/extra/clang-tidy/Contributing.html

Agora vamos criar os arquivos base para o novo check:

  • Módulo: readability
  • Nome do check: awesome-function-names
$ cd clang-tools-extra
$ python3 clang-tidy/add_new_check.py readability awesome-function-names
$ cmake --build build

Veja agora os checks disponíveis no clang-tidy recém compilado:

$ ./clang-tidy --list-checks --checks="*"

Enabled checks:
    ...
    readability-awesome-function-names
    ...

Teste o novo check. O check padrão vai reclamar de qualquer função que não inicie com “awesome_”. Por exemplo:

// FILE.cpp

void func1() {}         // Ocorre warning; e
void awesome_func2() {} // Não ocorre warning.

Vamos executar o clang-tidy com o novo check. O executável deve estar na pasta build/bin/:

$ build/bin/clang-tidy --checks="-*,readability-awesome-function-names" FILE.cpp

Usando ‘–checks=”-*” ‘ desabilitamos todos os checks e, em seguida adicionamos o nosso novo check, chamado “readability-awesome-function-names“.

Use o comando “git status” para ver os arquivos criados e modificados pelo comando “add_new_check.py“.

$ git status

Changes not staged for commit:
	modified:   clang-tidy/readability/CMakeLists.txt
	modified:   clang-tidy/readability/ReadabilityTidyModule.cpp
	modified:   docs/ReleaseNotes.rst
	modified:   docs/clang-tidy/checks/list.rst

Untracked files:
	clang-tidy/readability/AwesomeFunctionNamesCheck.cpp
	clang-tidy/readability/AwesomeFunctionNamesCheck.h
	docs/clang-tidy/checks/readability-awesome-function-names.rst
	test/clang-tidy/checkers/readability-awesome-function-names.cpp

Edite o arquivo AwesomeFunctionNamesCheck.cpp para customizar o seu check. Este passo está além do escopo deste post e vamos terminar por aqui.

Considerações Finais

Neste post vimos como compilar as ferramentas extra do compilador LLVM/Clang e como criar o código base para um check da ferramenta clang-tidy.

Autor: Djones Boni

Engenheiro Eletricista.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *