Las garantías de seguridad de excepciones , originalmente [ cita requerida ] formalizadas por David Abrahams , [1] [2] son un conjunto de pautas contractuales que los implementadores de bibliotecas y los clientes pueden usar cuando razonan sobre la seguridad del manejo de excepciones en cualquier lenguaje de programación que use excepciones, particularmente C ++ .
Hay varios niveles de seguridad de excepción (en orden decreciente de seguridad): [3]
- Garantía de no tirar , también conocida como transparencia de fallas : las operaciones están garantizadas para tener éxito y satisfacer todos los requisitos incluso en situaciones excepcionales. Si ocurre una excepción, será manejada internamente y no observada por los clientes.
- Seguridad de excepción sólida , también conocida como semántica de confirmación o reversión : las operaciones pueden fallar, pero se garantiza que las operaciones fallidas no tendrán efectos secundarios, dejando intactos los valores originales. [4]
- Seguridad de excepción básica , también conocida como garantía de no fugas : la ejecución parcial de operaciones fallidas puede provocar efectos secundarios, pero todos los invariantes se conservan y no hay pérdidas de recursos (incluidas las pérdidas de memoria ). Cualquier dato almacenado contendrá valores válidos que pueden diferir de los valores originales.
- Seguridad sin excepción : No se ofrecen garantías.
Por lo general, se requiere al menos una seguridad básica de excepción para escribir código robusto en dichos lenguajes. A veces, puede ser difícil lograr niveles más altos de seguridad y pueden incurrir en gastos generales debido al copiado adicional. Un mecanismo clave para la seguridad de las excepciones es una finally
cláusula, o una sintaxis similar de manejo de excepciones , que asegura que cierto código siempre se ejecute cuando se sale de un bloque, incluidas las excepciones. Varias lenguas tienen construcciones que simplifican esto, sobre todo mediante el patrón de disponer , nombrado como using
, with
, o try
-con-recursos.
Ejemplo
Considere un tipo de vector inteligente, como C ++ o Java . Cuando se agrega un elemento a un vector , el vector debe agregarse a la lista interna de objetos y actualizar un campo de conteo que indique cuántos objetos hay . También es posible que deba asignar nueva memoria si la capacidad existente no es suficiente.std::vector
ArrayList
x
v
x
v
Alternativas de seguridad de excepción:
- Garantía de no tirar
- Se implementa asegurándose de que la asignación de memoria nunca falle, o definiendo el
insert
comportamiento de la función en caso de falla de asignación (por ejemplo, haciendo que la función devuelva un resultado booleano que indique si la inserción tuvo lugar). - Fuerte seguridad de excepción
- Implementado haciendo primero cualquier asignación necesaria, y luego intercambiando búferes si no se encuentran errores (el lenguaje copy-and-swap
x
en se realizav
correctamente ov
permanece sin cambios a pesar del error de asignación. ). En este caso, la inserción de - Seguridad básica de excepción
- Implementado asegurando que se garantiza que el campo de recuento refleje el tamaño final de
v
. Por ejemplo, si se encuentra un error, lainsert
función podría desasignar completamentev
y restablecer su campo de recuento a cero. En caso de falla, no se filtran recursos, perov
el valor anterior no se conserva. - Seguridad sin excepción
- Un error de inserción puede provocar contenido dañado
v
, un valor incorrecto en el campo de recuento o una pérdida de recursos .
Referencias
- ^ David Abrahams . "Excepción-Seguridad en Componentes Genéricos" . Consultado el 29 de agosto de 2008 .
- ^ Dave Abrahams (2000). Excepción de seguridad en componentes genéricos . Programación genérica . Apuntes de conferencias en Ciencias de la Computación . 1766 . Springer . págs. 69–79. doi : 10.1007 / 3-540-39953-4_6 . ISBN 978-3-540-41090-4.
- ^ Bjarne Stroustrup . "Apéndice E: Seguridad de excepción de biblioteca estándar en" El lenguaje de programación C ++ " " (3ª ed.). Addison-Wesley. ISBN 0-201-88954-4. Falta o vacío
|url=
( ayuda ) - ^ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc
enlaces externos
- Herb Sutter: C ++ excepcional: 47 acertijos de ingeniería, problemas de programación y soluciones, 2000
- Jon Kalb: Codificación segura para excepciones en C ++ , ¡con C ++ ahora! Presentaciones de 2012 sobre seguridad excepcional.
- Discusión relacionada sobre Stackoverflow: C ++: ¿(realmente) escribe código seguro de excepción