Category: Programação

Assert() é só para debug!

Tenho visto, no meu dia-a-dia, vários programas cheios de assert() no meio do código. Acho legal utilizar a macro assert() para depurar o código, o problema quando o uso desta começa ficar banal e a fazer parte da lógica do programa. Já vi utilizarem assert() para fazer programação defensiva, por exemplo. O assert() é uma ferramenta de depuração e deve ser usado somente durante o desenvolvimento e eliminado após essa fase.

Em sistemas embarcado, onde o tamanho da memória RAM e da Flash são limitados, eliminar os assert()’s pode fazer toda a diferença. A seguir tem um programinha de exemplo que utiliza um assert().

#include <stdio.h>
#include <assert.h>
int main()
{
        int *p = NULL;
        ...
        assert(p != NULL);
        ...
        return 0;
}

Compilando o programa acima com e sem o assert() é possível notar a diferença de tamanho.

[veiga@gandalf]$size test test.assert
text    data     bss     dec     hex filename
796     264       4    1064     428 test
906     268       4    1178     49a test.assert

Essa diferença é para apenas 1 assert(), aumentando o numero para 10, pose-se notar o quão problematico isso pode se tornar.

 [veiga@gandalf]$size test test.assert
   text    data     bss     dec     hex filename
    780     264       4    1048     418 test
   1274     268       4    1546     60a test.assert

O uso do comando strip em programas que contém o assert() não faz muita diferença já que cada macro é substituída por uma string do tipo:

"assertion \"%s\" failed: file \"%s\", line %d\n", \
                               "expression", __FILE__, __LINE__);

Uma maneira de eliminar todos os assert()’s em tempo de compilação é utilizar a opção -DNDEBUG (que elimina as macros de depuração). Por isso, é importante não utilizar o assert() para implementar funcionalidades do programa.

 [veiga@gandalf]$gcc -o test test.c -Wall -DNDEBUG

-veiga

Para mais informações sobre o assert(): http://www.hmug.org/man/3/assert.php