Assert.h: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
SuperSecret (discussione | contributi)
sostituito template titolo errato con template titolo minuscolo
sistemo e semplifico
 
(15 versioni intermedie di 12 utenti non mostrate)
Riga 2:
{{titolo minuscolo}}
 
'''assert.h''' è l'il [[headerDirettiva di inclusione|file di intestazione]] della [[libreria standard del C]] che definisceimplementa il sistema di [[Asserzione (informatica)|asserzione]], definendo la macro <code>assert()</code>. QuestaTale macro implementa un sistema di controllo delle [[asserzione logica|asserzioni]], che può essere utilizzatoutilizzata per verificare e controllare l'eventuale verificarsi di casi "impossibili" nel programma.
 
== Descrizione ==
{| {{prettytable}}
{| class="wikitable"
|- bgcolor=#e9e9e9
! Nome || Descrizione
Line 14 ⟶ 15:
|}
L'utilità della macro <code>assert()</code> 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 <code>assert()</code> 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.
<syntaxhighlight lang="c" line="1">
 
int scelta = 0;
do {
/* Visualizzo un menumenù con 4 scelte numerate da 1 a 4 */
scanf("%d", &scelta);
}
assertwhile (scelta>=<1 &&|| scelta <=>4);
/* SecondoPrimo blocco di operazioni eseguite in base al valore scelto */
/* Visualizzo un menu con 4 scelte numerate da 1 a 4 */
scanf("%d", &scelta);
} while assert(scelta<>=1 ||&& scelta> <=4);
/* PrimoSecondo blocco di operazioni eseguite in base al valore scelto */
</syntaxhighlight>
assert(scelta>=1 && scelta <=4);
/* Secondo blocco di operazioni eseguite in base al valore scelto */
 
Utilizzando <code>assert()</code>, 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 <code>scelta</code> all'interno del primo blocco di operazioni.<br>
L'utilizzo di <code>assert()</code> 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 proseguirne l'esecuzione, almeno permettere una salvataggio parziale dello stato del programma. Per questo, un codice simile a:
 
L'utilizzo di <code>assert()</code> 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 <code>assert(("2+2 fa 4", 2 + 2 == 5));</code>. 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]]:<syntaxhighlight lang="c">
int *ptr = malloc(sizeof(int) * 10);
assert(ptr != NULL);
/* utilizzo di ptr */
</syntaxhighlight>
 
Quando il programmatore non ha più bisogno delle asserzioni, invece di eliminarle tutte manualmente può definire la costante <code>NDEBUG</code> prima di includere nel file sorgente l'header <code>assert.h</code>: in questo modo, la macro <code>assert()</code> viene espansa semplicemente in: <code>#define assert(ignore)((void) 0)</code>, eliminando quindi ogni possibile interazione con il programma. Dunque, in presenza di <code>NDEBUG</code> eventuali espressioni passate a <code>assert()</code> non verranno valutate.
non rappresenta un uso ottimale di <code>assert()</code>, perché, anche se raramente, è possibile che un'[[allocazione dinamica della memoria|allocazione dinamica di memoria]] fallisca.
 
Quando il programmatore non ha più bisogno delle asserzioni, invece di eliminarle tutte manualmente può definire la costante <code>NDEBUG</code> prima di includere nel file sorgente l'header <code>assert.h</code>: in questo modo, la macro <code>assert()</code> viene espansa semplicemente in:
#define assert(ignore)((void) 0)
eliminando quindi tutte le possibili interazioni con il programma. Bisogna però far notare che, in questo caso, l'espressione passata ad <code>assert()</code> non viene valutata: eventuali espressioni con effetti collaterali, come ad esempio
assert(*i++);
potrebbero modificare la logica del programma a seconda della definizione o meno della costante <code>NDEBUG</code>. In questo esempio, infatti, al termine della verifica dell'asserzione, il valore del puntatore <code>i</code> risulterebbe incrementato di una unità nel caso <code>NDEBUG</code> non sia definito, mentre resterebbe inalterato nel caso opposto.
 
== Voci correlate ==
Line 51 ⟶ 46:
{{interprogetto|b=C/Appendice/Librerie standard}}
 
== Collegamenti esterni ==
[[Categoria:Libreria standard del C]]
* {{en}} [http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/assert.h.html assert.h] da The Open Group Base Specifications Issue 7
* {{cita web|https://www.gnu.org/software/libc/manual/html_node/Consistency-Checking.html|Consistency Checking - The GNU C Library|lingua=en}}
* {{cita web|1=http://www.cplusplus.com/reference/clibrary/cassert/|2=C Diagnostics Library|lingua=en|accesso=3 luglio 2012|dataarchivio=21 giugno 2012|urlarchivio=https://web.archive.org/web/20120621043500/http://www.cplusplus.com/reference/clibrary/cassert/|urlmorto=sì}}
* [https://web.archive.org/web/20101124224627/http://appuntilinux.mirror.garr.it/mirrors/appuntilinux/a2/a295.htm#almltitle4039 69.2 File «assert.h»] da [[Appunti di informatica libera]]
 
[[Categoria:Libreria standard del C]]
[[en:Assert.h]]
[[es:Assert.h]]
[[ru:Assert.h]]
[[uk:Assert.h]]