Assert.h
Template:LIBRERIA-STANDAR-C Template:TITOLO MINUSCOLO
ASSET.H È L'HEADER FILE DELLA LIBRERIA STANDARD DEL C CHE DEFINISCE LA MACRO ASSET()
. QUESTA MACRO IMPLEMENTA UN SISTEMA DI CONTROLLO DELLE ASSERZIONI, CHE PUÒ ESSERE UTILIZZATO PER VERIFICARE E CONTROLLARE L'EVENTUALE VERIFICARSI DI CASI "IMPOSSIBILI" NEL PROGRAMMA.
NOME | DESCRIZIONE |
---|---|
ASSET |
QUANDO QUESTA MACRO VIENE ESEGUITA, ESSA COMPUTA IL RISULTATO DELL'ESPRESSIONE FRONTALE: SE ESSA RISULTA ESSERE FALSA (IN ALTRE PAROLE, SE IL VALORE FINALE RISULTA ESSERE 0), ASSET SCRIVE ALCUNE INFORMAZIONI DI DEBUG SU STDERR E, SUCCESSIVAMENTE, RICHIAMA LA FUNZIONE ABORT() . LE INFORMAZIONI RIPORTATE SU STDERR INCLUDONO:
|
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 IL VALORE DELLA VARIABILE "SCELTA" SIA EFFETTIVAMENTE COMPRESO NEL RANGER VALIDO, NONOSTANTE L'USCITA DAL CICLO WHILE IMPLICITAMENTE AFFERMI LA VERIDICITÀ DI QUESTA CONDIZIONE.
INT SCELTA = 0; do { /* VISUALIZZO UN MENU CON SCELTE NUMERATE da 1 a 4 */ SCANF("%d", &SCELTA); } WHILE (SCELTA<1 || SCELTA>4); /* PRIMO BLOCCO DI OPERAZIONI ESEGUITE IN BASE AL VALORE SCELTO */ ASSET(SCELTA>=1 && SCELTA <=4); /* SECONDO BLOCCO DI OPERAZIONI ESEGUITE IN in BASE AL VALORE SCELTO */
UTILIZZANDO ASSERT()
, IL PROGRAMMATORE SI ACCERTA NUOVAMENTE CHE LA CONDIZIONE CHE AVEVA PROVOCATO L'USCITA DAL CICLO CICLO WHITE 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: PER LA BRUTALITÀ DEL METODO DI CHIUSURA DELL'ESEGUIBILE E PER LA SCARSEZZA DI INFORMAZIONI SULL'ERRORE FORNITE A VIDEO, RISULTEREBBE ABBASTANZA FRUSTRANTE PER L'UTENTE FINALE SE UTILIZZATO NELLA VERSIONE DEFINITIVA DI UN APPLICATIVO. BUONA PROGRAMMAZIONE VORREBBE, INFATTI, CHE VENGA SPIEGATO ALL'UTENTE QUALE CAUSA ABBIA SCATENATO IL PROBLEMA E, NEL CASO NON FOSSE POSSIBILE PROSEGUIRE L'ESECUZIONE, ALMENO PERMETTERE UN SALVATAGGIO PARZIALE DELLO STATO DEL PROGRAMMA. PER QUESTO, UN CODICE SIMILE A:
INT *PTR = MALLOC(SIZEOF(INT) * 10); ASSERT(PTR!= NULL); /* UTILIZZO DI PTR */
NON RAPPRESENTA UN USO OTTIMALE DI ASSERT()
, PERCHÉ, ANCHE SE RARAMENTE, È POSSIBILE CHE UNALLOCAZIONE DINAMICA DI MEMORIA FALLISCA.
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 TUTTE LE POSSIBILI INTERAZIONI CON IL PROGRAMMA. BISOGNA QUINDI FAR NOTARE CHE, IN
QUESTO CASO, L'ESPRESSIONE PASSATA AD ASSERT()
NON VIENE VALUTATA. COME ESPRESSIONI INSERITE ALL'INTERNO DI ASSERT()
VANNO QUINDI ASSOLUTAMENTE EVITATE QUELLE CON EFFETTI COLLATERALI, COME AD ESEMPIO
ASSERT(*I++);
CHE FINIREBBERO PER MODIFICARE LA LOGICA DEL PROGRAMMA A SECONDA DELLA DEFINIZIONE O MENO DELLA COSTANTE NDEBUG
. IN QUESTO ESEMPIO, INFATTI, AL TERMINE DELLA VERIFICA DELL'INSERZIONE, IL VALORE DEL PUNTATORE i
RISULTEREBBE INCREMENTATO DI UNA UNITÀ NEL CASO NDEBUG
NON SIA DEFINITO, MENTRE RESTEREBBE INALTERATO NEL CASO OPPOSTO.
Voci correlate
Altri progetti
Collegamenti esterni
- (EN) assert.h da The Open Group Base Specifications Issue 7
- (EN) Consistency Checking - The GNU C Library, su gnu.org.
- (EN) C Diagnostics Library, su cplusplus.com.
- 69.2 File «assert.h» da Appunti di informatica libera