Algumas ferramentas interessantes do projeto Clang
- por Sergio Prado
O Clang é um compilador C, C++, Objective C e OpenCL C baseado no projeto LLVM. Para quem quiser conhecer um pouco mais sobre ele, há algum tempo escrevi um artigo sobre como compilar o kernel Linux com o Clang.
O Clang possui algumas ferramentas bem interessantes que podem ser utilizadas de forma isolada ou em conjunto com outras ferramentas para auxiliar no desenvolvimento de aplicações C/C++, incluindo analisador estático de código, formatador de código, refatorador de código, etc.
Algumas destas ferramentas são mantidas no repositório oficial do LLVM, mas a maioria está disponível no repositório clang-tools-extra. Caso queira instalar as ferramentas a partir do codigo-fonte, basta clonar os repositórios de código-fonte do Clang conforme abaixo e seguir os procedimentos de compilação descritos no site do projeto.
$ git clone http://llvm.org/git/llvm.git $ git clone http://llvm.org/git/clang-tools-extra.git |
Para quem não quiser instalar as ferramentas a partir do código-fonte, é possível instalar o Clang e suas ferramentas a partir do respositório de pacotes da distribuição Linux (a maioria das distribuições possuem o Clang em seu repositório de pacotes). Por exemplo, para instalar o Clang e algumas de suas ferramentas no Ubuntu:
$ sudo apt-get install clang clang-tidy clang-format |
ClangCheck
O ClangCheck é uma ferramenta básica de checagem de syntaxe de um código C/C++.
Dado um programa em C:
1 2 3 4 5 6 7 8 9 10 11 12 |
struct Info { int val; } int main(int argc, const char *argv[]) { Info i; i.val = 10; return 0; } |
Basta executar a ferramenta clang-check no código-fonte, conforme abaixo:
$ clang-check -analyze main.c -- /opt/build/temp/main.c:3:2: error: expected ';' after struct } ^ ; /opt/build/temp/main.c:7:2: error: must use 'struct' tag to refer to type 'Info' Info i; ^ struct 2 errors generated. |
Perceba que a ferramenta identificou a ausência do ponto-e-vírgula na declaração da estrutura, além da ausência da palavra-chave “struct” para declarar a variável “i”. A lista completa de checagens está disponível no site do projeto.
ClangTidy
O ClangTidy é uma ferramenta completa de análise estática de código. Quem quiser conhecer mais sobre análise estática de código, pode dar uma olhada nos artigos “Análise estática de código” e “Analisando código-fonte C/C++ com a ferramenta Cppcheck“.
Dado um programa em C:
1 2 3 4 5 6 7 8 9 10 11 12 |
int main(void) { int buf[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int result; int i; for (i = 0; i <= 9; i++) { result += buf[i]; } return 0; } |
Basta executar a ferramenta clang-tidy no código-fonte, conforme abaixo:
$ clang-tidy main.c -- 1 warning generated. /opt/build/temp/main.c:8:10: warning: The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage [clang-analyzer-core.uninitialized.Assign] result += buf[i]; ^ /opt/build/temp/main.c:4:2: note: 'result' declared without an initial value int result; ^ /opt/build/temp/main.c:7:2: note: Loop condition is true. Entering loop body for (i = 0; i <= 9; i++) { ^ /opt/build/temp/main.c:8:10: note: The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage result += buf[i]; ^ |
Perceba que a ferramenta identificou por exemplo o uso de uma variável não inicializada na linha 8 do código-fonte.
ClangFormat
O ClangFormat é uma ferramenta de formatação de código-fonte, parecida com a antiga (mas ainda útil) ferramenta indent do GNU.
Dado o mesmo programa em C utilizado no teste anterior, podemos utilizar a ferramenta clang-format para formatar o código-fonte para o padrão Mozilla:
$ clang-format -style=Mozilla main.c |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int main(void) { int buf[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int result; int i; for (i = 0; i <= 9; i++) { result += buf[i]; } return 0; } |
Os estilos de formatação disponíveis e outras opções estão documentadas no site do projeto.
O mais legal é que a ferramenta clang-format pode ser estendida facilmente para que você possa utilizar o estilo de codificação adotado por sua empresa ou projeto.
Na verdade, todas estas ferramentas podem ser adaptadas e estendidas conforme nossa necessidade. E este é o poder do software livre, nos dando a possibilidade de criar um código confiável e robusto utilizando ferramentas abertas e livres.
Um abraço,
Sergio Prado