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.
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++.
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:
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.
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
.
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;
}
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:
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