Uma asserção é uma condição que se deve sempre verificar-se num determinado ponto do programa.
#include <assert.h>
assert( int cond );
cond
for diferente de 0: não faz nadacond
for 0: imprime uma mensagem de erro e termina imediatamente a execução do programaprog: some_file.c:16: some_func: Assertion ... failed.
#include <assert.h>
int main(void) {
int x = 5, y = -3;
assert( 1 + 1 == 2 ); // OK
assert( x*y > 0 ); // Assertion failed
printf("%d\n", x*y); // não executa
}
#include <assert.h>
int factorial(int n) {
assert(n >= 0); // pré-condição
int r = 1;
for(int i = 2; i<=n; i++)
r = r*i;
return r;
}
int main(void) {
...
}
$ gcc -o fact fact.c
$ ./fact
Introduza um inteiro positivo:10
Factorial 10 = 362880
$ ./fact
Introduza um inteiro positivo:-1
fact: fact.c:6: factorial: Assertion `n >= 0' failed.
factorial
podia retornar qualquer resultado para n
negativo!
assert
detecta o erro em vez de imprimir um resultado erradoExprimir condições de entrada de uma função, e.g.:
NULL
.int some_fun( char *ptr, int size )
{
assert( size <= LIMIT );
assert( ptr != NULL );
...
}
int procurar(char str[], char ch);
ch
na cadeiaint procurar(char str[], char ch) {
int i = 0;
while (str[i] != ch) {
if(str[i] == '\0') {
i = -1;
break; // não encontrou
}
i++;
}
assert(i == -1 || (i>=0 && i<strlen(str)));
return i;
}
return
int elimrep(int v[], int n);
v
int elimrep(int vec[], int n) {
int k = 0;
for(int i = 0; i < n; i++) {
assert(0 <= k && k <= i);
assert(0 <= i && i < n);
int val = vec[i];
if(!ocorre(vec, k, val)) {
vec[k++] = val;
// valor não repetido
}
}
return k;
}
Assert failed
em vez de Segmentation Fault
Distinguir entre:
uma situação que não deve ocorrer; por exemplo: usar um índice inválido ou dividir por zero.
uma situação que pode ocorrer e que devemos tratar; por exemplo: um input incompleto do utilizador.
Asserções são um mecanismo para detetar o primeiro tipo de erros — não para tratar os segundos.