Como Fazer Análise Estática de C/C++ com Cppcheck

Enxerga falhas que nem você e nem seu compilador conseguem encontrar.


Como Fazer Análise Estática de C/C++ com Cppcheck


As linguagens de programação C e C++ existem diversas ferramentas opcionais que: sabendo usá-las, serão essenciais para escrever um código seguro.

Por isso são linguagens recomendadas para profissionais da área, caso contrário, a pessoa deve procurar linguagens mais fáceis e que gerenciam coisas de forma automática onde muitas vezes o programador(a) nem sabe o que realmente está fazendo. C e C++ é como um painel de controle de um avião, e as vezes as pessoas estão querendo usá-las como um controle de TV.

Uma das formas essenciais de não trocar “gato por lebre” é fazer: ANÁLISE ESTÁTICA.


O que é Análise Estática?

Análise Estática, em resumo, é encontrar bugs no seu código sem executá-lo. Por isso tem esse nome: estático, se fizermos as análises durante a execução do programa seria uma análise dinâmica.

Geralmente essas análises são feitas por programas adicionais que conseguem enxergar detalhes que nem você e nem seu compilador identifica.

Nesse artigo veremos como utilizar o Cppcheck que é uma das ferramentas mais conhecidas e fáceis de usar para análise estática em códigos escritos em C/C++.


Sobre o Cppcheck

Cppcheck é uma ferramenta de análise de código estático para as linguagens de programação C e C++ . É uma ferramenta versátil que pode verificar códigos não padronizados. Cppcheck é um software livre feito sob a licença GNU General Public License.

Cppcheck oferece suporte a uma ampla variedade de verificações estáticas que podem não ser cobertas pelo próprio compilador. Essas verificações são análises estáticsa que podem ser executadas no nível do código-fonte.

Algumas das verificações suportadas incluem:

  • Verificação automática de variáveis
  • Verificação de limites para saturações de matriz
  • Verificação de classes (por exemplo, funções não utilizadas, inicialização de variáveis e duplicação de memória)
  • Uso de funções obsoletas ou substituídas de acordo com o Open Group
  • Verificação de segurança de exceção, por exemplo, uso de alocação de memória e verificações de destruidor
  • Vazamentos de memória, por exemplo, devido à perda de escopo sem desalocação
  • Vazamentos de recursos, por exemplo, devido ao esquecimento de fechar um identificador de arquivo
  • Uso inválido de funções e idiomas da biblioteca de modelos padrão
  • Eliminação de código morto usando a opção usedFunction
  • Diversos erros estilísticos e de desempenho

O projeto está ativamente em desenvolvimento e é mantido em diferentes sistemas operacionais. Ele encontrou bugs válidos em vários projetos populares como o kernel Linux e o MPlayer.


Instalação

Você pode instalar utilizando o gerenciador de pacotes do seu sistema operacional, exemplos: winget, choco, apt, pacman, emerge e entre outros. Exemplos:

winget install -e --id Cppcheck.Cppcheck # Windows
brew install cppcheck # macOS
sudo apt install cppcheck # Ubuntu, Debian, Mint e similares
emerge cppcheck # Gentoo, Funtoo e similares

Ou também pode instalar direto do código-fonte disponível no GitHub, assim:

git clone git://github.com/danmar/cppcheck
cd cppcheck
make
sudo make install

Após instalação confirme se está tudo correto verificando a versão:

cppcheck --version
Cppcheck 2.9

Nesse caso, de acordo com a data de publicação desse artigo, sua versão atual é a 2.9.


Utilização

Suponhamos que você possua esse código abaixo: main.cpp:

#include <iostream>
#include <memory>

class Test {
  typedef std::string String;
  String name;

  public:
    Test(String iname) : name(iname){}
    String getName(){
      return name;
    }
};

int main(){
  auto t = std::make_unique<Test>("Terminal Root");
  std::cout << t->getName() << '\n';
  return 0;
}

Você consegue encontrar erros nesse código?

A verdade é que nem o compilador consegue, mesmo se habilitarmos todas as flags necessárias para debug, exemplo:

g++ -Wall -Wextra -Werror -Wpedantic main.cpp

Note que compilará sem avisar nem um warning se quer e ainda executará normalmente.

Agora vamos fazer a ANÁLISE ESTÁTICA com cppcheck com o seguinte comando:

cppcheck --enable=all main.cpp

Veja a imagem abaixo os erros que ele listou:

cppcheck --enable=all main.cpp

Que loucura, né?! 😃

Agora vamos corrigir nosso código adicionando explicit ao nosso construtor como ele indicou e também o parâmetro: const String& iname

#include <iostream>
#include <memory>

class Test {
  typedef std::string String;
  String name;

  public:
    explicit Test(const String& iname) : name(iname){}
    String getName(){
      return name;
    }
};

int main(){
  auto t = std::make_unique<Test>("Terminal Root");
  std::cout << t->getName() << '\n';
  return 0;
}

Ao rodar novamente o mesmo comando notaremos que resolvemos todos os erros, menos o erro:

nofile:0:0: information: Cppcheck cannot find all the include files (use --check-config for details) [missingIncludeSystem]

Esse erro não é bem um erro e sim o caminho da biblioteca padrão que pode ter inúmeros locais dependendo do sistema operacional e até mesmo do compilador. Logo, podemos ignorá-lo.

Mas, com esse exemplo, notamos o quão útil a análise estática com cppcheck pode lhe ajudar no dia a dia. Lembrando que gastamos mais tempo debugando que escrevendo o código em si, logo, essas análises lhe pouparão muito trabalho e também dores de cabeça.

Existem plugins para o Cppcheck para diversos IDEs e Editores tais como: Vim, Neovim, Emacs, Eclipse, Code:Blocks, Qt Creator, Kdevelop e muitos outros!

Para mais informações acesse o repositório no GitHub e a página no Source Forge.


memtool cpp linguagemc cppdaily


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo

Artigos Relacionados




Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!