Sicurezza rispetto alle eccezioni

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

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]

  1. No exception safety: il programma non offre alcuna garanzia nel caso venga lanciata un'eccezione.
  2. 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).
  3. 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.
  4. 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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]

  1. ^ David Abrahams, Exception-Safety in Generic Components, su boost.org. URL consultato il 29 agosto 2008.
  2. ^ 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.
  3. ^ 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]

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica