Libreria standard del C++
Libreria standard del C


assert.h è il file di intestazione della libreria standard del C che implementa il sistema di asserzione, definendo la macro assert(). Tale macro può essere utilizzata per verificare e controllare l'eventuale verificarsi di casi "impossibili" nel programma.

Descrizione modifica

Nome Descrizione
assert Quando questa macro viene eseguita, essa computa il risultato dell'espressione fornìtale: se essa risulta essere falsa (in altre parole, se il valore finale risulta essere 0), assert scrive alcune informazioni di debug su stderr e, successivamente, richiama la funzione abort(). Le informazioni riportate su stderr includono:
  • il testo dell'espressione che ha fornito il risultato 0
  • il nome del file sorgente (la macro predefinita __FILE__)
  • il numero della linea in cui si è fallita l'asserzione (la macro predefinita __LINE__)

L'utilità della macro assert() risiede nella semplicità con la quale si può verificare un'affermazione che si ritiene, in un dato contesto, banalmente ovvia: ad esempio, ricontrollare il valore di una variabile sulla quale si sono già effettuate delle verifiche. Nel codice che segue, la macro assert() viene utilizzata per controllare che il valore della variabile "scelta" sia effettivamente compreso nel range valido, nonostante l'uscita dal ciclo while implicitamente affermi la veridicità di questa condizione.

int scelta = 0;
 
do {
 /* Visualizzo un menù con 4 scelte numerate da 1 a 4 */
 scanf("%d", &scelta);
} 
while (scelta<1 || scelta>4);
 
/* Primo blocco di operazioni eseguite in base al valore scelto */
 
assert(scelta>=1 && scelta <=4);
 
/* Secondo blocco di operazioni eseguite in base al valore scelto */

Utilizzando assert(), il programmatore si accerta nuovamente che la condizione che aveva provocato l'uscita dal ciclo while sia ancora vera: in questo caso, ad esempio, verifica di non aver accidentalmente modificato il valore della variabile scelta all'interno del primo blocco di operazioni.

L'utilizzo di assert() dovrebbe essere limitato alla sola fase di sviluppo di un programma. Infatti, la mancanza di verifica dell'asserzione provoca l'interruzione immediata dell'applicazione fornendo scarse informazioni in merito all'errore, anche se può essere usato l'operatore virgola per aggiungere informazioni all'espressione stampata, come in assert(("2+2 fa 4", 2 + 2 == 5));. Inoltre, la macro non dovrebbe essere adoperata in casi in cui ci sia una seppur piccola probabilità di fallimento, ad esempio in un'allocazione dinamica della memoria:

int *ptr = malloc(sizeof(int) * 10); 
assert(ptr != NULL);

Quando il programmatore non ha più bisogno delle asserzioni, invece di eliminarle tutte manualmente può definire la costante NDEBUG prima di includere nel file sorgente l'header assert.h: in questo modo, la macro assert() viene espansa semplicemente in: #define assert(ignore)((void) 0), eliminando quindi ogni possibile interazione con il programma. Dunque, in presenza di NDEBUG eventuali espressioni passate a assert() non verranno valutate.

Voci correlate modifica

Altri progetti modifica

Collegamenti esterni modifica