In informatica, la sicurezza rispetto alle eccezioni (exception safety) denota l'approccio di un programma in termini di robustezza nella gestione delle eccezioni.
Livelli di sicurezza Quattro livelli di sicurezza rispetto alle eccezioni comunemente considerati sono: No exception safety: il programma non offre alcuna garanzia nel caso venga lanciata un'eccezione. Basic exception safety, anche nota come no-leak guarantee: l'operazione può fallire con effetti collaterali, ma vi è la garanzia che gli invarianti siano preservati e che non avvengano perdite di risorse (ad esempio memory leak). Strong exception safety, anche nota come semantica semantica transazionale: l'operazione può fallire, ma in caso di fallimento vi è la garanzia che l'operazione non abbia alcun effetto collaterale. Raggiungere questo livello di sicurezza tipicamente ha un costo addizionale in termini di tempo di esecuzione e memoria, perché spesso richiede di eseguire copie addizionali dei dati allo scopo di garantire la conservazione degli input originali in caso di fallimento. No-throw/no-fail: il completamento dell'operazione è garantito, e nessuna eccezione verrà lanciata in alcun caso.
Esempio Si consideri l'implementazione dell'operazione di aggiunta di un elemento in un vettore (come std::vector in C++ o ArrayList in Java). La funzione deve aggiungere il nuovo oggetto al contenitore interno, operazione che potrebbe richiedere l'allocazione di nuova memoria se il contenitore non ha sufficiente spazio a disposizione, e aggiornare un contatore del numero di elementi. Il seguente è un possibile esempio di comportamento della funzione per ognuno dei quattro livelli di sicurezza rispetto alle eccezioni.
No exception safety: il fallimento dell'operazione può causare la presenza di contenuto corrotto nel vettore, un valore errato nel contatore di elementi, o un memory leak. Basic exception safety: in caso di fallimento, il contenitore viene lasciato in uno stato coerente (ad esempio, il contatore riflette il numero reale di elementi) e non avviene alcun memory leak. Tuttavia, il nuovo elemento o il contenuto del vettore possono andare perduti. Strong exception safety: l'allocazione di memoria è eseguita inizialmente, e il buffer del vettore viene trasferito solo in caso l'allocazione avvenga con successo. In caso di fallimento, lo stato del vettore è preservato. No-throw/no-fail: in aggiunta al caso precedente, la funzione ha un valore di ritorno che indica se l'operazione sia stata completata con successo o se l'inserimento non sia possibile (ad esempio, per mancanza di risorse).
Note
Collegamenti esterni
Categoria:C++ Categoria:Concetti di programmazione