Em um dos artigos aqui do blog nós publicamos sobre o clang-format, hoje vamos conhecer outra ferramenta da coleção de aplicativos do Clang/LLVM: clang-tidy
.
Clang-Tidy é um linter para C++. Sua finalidade é fornecer uma estrutura extensível para diagnosticar e corrigir erros típicos de programação, como violações de estilo, uso indevido de interface ou bugs que podem ser deduzidos por meio de análise estática.
Para instalar o clang-tidy
basta usar os mesmos procedimentos descritos no artigo do clang-format.
A maneira mais simples de verificar seu código com clang-tidy
é: suponhamos que você possui o código abaixo que imprime um ponteiro em vez da referência ou o dado propriamente dito:
main.cpp
#include <iostream>
int main(){
const char* str {};
std::cout << *str << '\n';
}
Mesmo que você compile com os devidos parâmetros do seu compilador para detectar falhas não conseguirá detectar o
warning
.
Usando o comando abaixo com clang-tidy
você poderá detectar:
clang-tidy main.cpp -- -Imy_project/include -DMY_DEFINES ...
Vai aparecer a saída:
1 warning generated.
main.cpp:5:16: warning: Dereference of null pointer (loaded from variable 'str') [clang-analyzer-core.NullDereference]
std::cout << *str << '\n';
^~~~
main.cpp:4:3: note: 'str' initialized to a null pointer value
const char* str {};
^~~~~~~~~~~~~~~
main.cpp:5:16: note: Dereference of null pointer (loaded from variable 'str')
std::cout << *str << '\n';
^~~~
clang-tidy tem suas próprias verificações e também pode executar verificações do Clang Static Analyzer. Cada verificação tem um nome e as verificações a serem executadas podem ser escolhidas usando a opção -checks=
, que especifica uma lista separada por vírgulas e -
, por exemplo:
clang-tidy main.cpp -checks=-*,clang-analyzer-*,-clang-analyzer-cplusplus*
Esse comando desabilitará todas as verificações padrão (
-*
) e habilitará todasclang-analyzer-*
excetoclang-analyzer-cplusplus*
.
Em resumo, é uma ferramenta útil e utilizada como padrão na maioria das configurações para LSP.
Para mais informações use clang-tidy --help
e leia a documentação oficial.
clang-tidy
: