Sicurezza rispetto alle eccezioni
In informatica, la sicurezza rispetto alle eccezioni (exception safety) denota l'approccio di un programma in termini di robustezza nella gestione delle eccezioni.[1][2]
Livelli di sicurezza
[modifica | modifica wikitesto]Quattro livelli di sicurezza rispetto alle eccezioni comunemente considerati sono:[3]
- 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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]- ^ David Abrahams, Exception-Safety in Generic Components, su boost.org. URL consultato il 29 agosto 2008.
- ^ David Abrahams, Exception-Safety in Generic Components, in Generic Programming, Lecture Notes in Computer Science, vol. 1766, Springer, 2000, pp. 69–79, DOI:10.1007/3-540-39953-4_6, ISBN 978-3-540-41090-4.
- ^ Bjarne Stroustrup, Appendix E: Standard-Library Exception Safety in "The C++ Programming Language", 3rd, Addison-Wesley, ISBN 0-201-88954-4.
Collegamenti esterni
[modifica | modifica wikitesto]- How to: Design for exception safety, su docs.microsoft.com, Microsoft, 19 novembre 2019.
- Jon Kalb, Exception-Safe Coding in C++, su exceptionsafecode.com.