Algumas ferramentas interessantes do projeto Clang

- por Sergio Prado

Categorias: Linguagem C Tags: ,

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

  • George Tavares

    Fico cada vez mais impressionado com essa suite do CLang. Nao eh a toa que muitos projetos estao migrando para ela.
    Conforme o Sergio fala, a extensibilidade é um ponto forte. Compilei ja o chromium e ele tem preferencia a usar o CLang, inclusive ele utiliza essas extensoes para fazer mais verificacoes de codigo,validando as diretrizes do projeto.

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.