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