Sicurezza rispetto alle eccezioni

concetto di programmazione

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

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

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).
  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
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica