Análise estática de código com o Cppcheck

A análise estática de código (do inglês, static code analysis) é um método de depuração examinando o código fonte sem ter que executar o programa (em contraste, por exemplo, com o uso do Valgrind). Essa depuração é realizada automaticamente e ajuda a identificar aspectos de vulnerabilidade do código.

O código submetido para análise é avaliado com relação à um conjunto de regras. Comumente é análise é utilizada usada para cumprir diretrizes de codificação, como o MISRA, e para cumprir os padrões do setor, como a IEC 61508, que ajuda a garantir a segurança de software para a indústria.

Uma opção para fazer a análise estática do código em C/C++ é o Cppcheck. Existe uma versão open-source da ferramenta e que é multiplataforma. A Cppcheck também é uma ferramenta que está integrada com diversas IDEs, como o Codeblocks (veja aqui como instalar o Cppcheck com o Codeblocks), Eclipse, Visual Studio, etc.

Resultado da análise

Eu utilizei o dos últimos códigos que fiz (ele foi feito para o post com o algoritmo para o problemas de Monty Hall). Segue o código abaixo, sendo que o código funciona corretamente.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TOTAL 3000

int main() {
    srand(time(NULL));
    int porta, escolha, revelada, jogadas, vitorias=0;

    for (jogadas=0; jogadas<TOTAL; jogadas++) {
        porta = rand()%3;
        escolha = rand()%3;
        printf("Escolheu %i e era %i. ", escolha, porta);

        if (porta == escolha) {
            printf("Ganhou!\n");
            vitorias++;
        } else {
            printf("Perdeu!\n");
        }

    }
    return 0;
}

Ao analisar o código com o Cppcheck, 3 elementos são retornados, sendo eles mostrados a seguir.

1 - Unused variable: revelada [unusedVariable]
2 - The scope of the variable 'escolha' can be reduced.
3 - The scope of the variable 'porta' can be reduced.

O primeiro item é a indicação que a variável denominada “revelada” não é utilizada no código. Isso é fácil de perceber pois ela foi definida, e em momento algum foi feita qualquer outra operação com ela. A ação corretiva dessa indicação é simplesmente retirar a declaração dessa variável.

As outras duas indicações são similares e indicam que as variáveis “escolha” e “porta” poderiam ser definidas com um escopo reduzido. Isso porque essas duas variáveis somente são utilizadas dentro do laço for, mas são declaradas fora desse laço, lá no início da função main (o que é bastante comum de ser feito). Como ação corretiva é necessário fazer a declaração dessas duas variáveis apenas dentro do laço for.

O código ajustado com as ações corretivas das indicações do Cppcheck é mostrado abaixo. Ele retirou a definição das variáveis “escolha” e “porta” da linha 9 e as colocou na linha 12. Além disso, na linha 9 também foi retirada a definição da variável denominada “revelada”.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TOTAL 3000

int main() {
    srand(time(NULL));
    int jogadas, vitorias=0;

    for (jogadas=0; jogadas<TOTAL; jogadas++) {
        int porta, escolha;
        porta = rand()%3;
        escolha = rand()%3;
        printf("Escolheu %i e era %i. ", escolha, porta);

        if (porta == escolha) {
            printf("Ganhou!\n");
            vitorias++;
        } else {
            printf("Perdeu!\n");
        }

    }
    return 0;
}

Sendo assim, o Cppcheck é útil para a avaliação de alguns aspectos relacionados com a qualidade do código. Neste código avaliado as questões foram pontuais e de pouco impacto, embora já tenha pelo menos reduzido a alocação de uma variável.

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.