82
¿Programación basada en contratos para C++17? ¿Programación basada en contratos para C++17? using std::cpp 2015 J. Daniel Garcia [email protected] Grupo ARCOS Universidad Carlos III de Madrid 18 de noviembre de 2015 cbed J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 1/32

¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿Programación basada en contratos paraC++17?

using std::cpp 2015

J. Daniel [email protected]

Grupo ARCOSUniversidad Carlos III de Madrid

18 de noviembre de 2015

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 1/32

Page 2: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Aviso

c Esta obra está bajo una Licencia Creative CommonsAtribución-NoComercial-SinDerivar 4.0 Internacional.

b Debes dar crédito en la obra en la forma especificadapor el autor o licenciante.

e El licenciante permite copiar, distribuir y comunicar pú-blicamente la obra. A cambio, esta obra no puede serutilizada con fines comerciales — a menos que se ob-tenga el permiso expreso del licenciante.

d El licenciante permite copiar, distribuir, transmitir y co-municar públicamente solamente copias inalteradas dela obra – no obras derivadas basadas en ella.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 2/32

Page 3: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Reconocimientos

Trabajo realizado antes de C++11.Thorsten Ottosen, Lawerence Crowl, Dave Abrahams, . . .

Y después de C++11.Bloomberg: John Lakos, Alisdair Meredith, Nathan Myers,. . .Microsoft: Gabriel Dos Reis, Herb Sutter, . . .Morgan Stanley: Bjarne Stroustrup.Otros: Lawrence Crowl, Walter Brown, . . .UC3M: J. Daniel García.

Y por supuesto, todo empezó con:C.A.R Hoare.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 3/32

Page 4: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Reconocimientos

Trabajo realizado antes de C++11.Thorsten Ottosen, Lawerence Crowl, Dave Abrahams, . . .

Y después de C++11.Bloomberg: John Lakos, Alisdair Meredith, Nathan Myers,. . .Microsoft: Gabriel Dos Reis, Herb Sutter, . . .Morgan Stanley: Bjarne Stroustrup.Otros: Lawrence Crowl, Walter Brown, . . .UC3M: J. Daniel García.

Y por supuesto, todo empezó con:C.A.R Hoare.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 3/32

Page 5: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Reconocimientos

Trabajo realizado antes de C++11.Thorsten Ottosen, Lawerence Crowl, Dave Abrahams, . . .

Y después de C++11.Bloomberg: John Lakos, Alisdair Meredith, Nathan Myers,. . .Microsoft: Gabriel Dos Reis, Herb Sutter, . . .Morgan Stanley: Bjarne Stroustrup.Otros: Lawrence Crowl, Walter Brown, . . .UC3M: J. Daniel García.

Y por supuesto, todo empezó con:C.A.R Hoare.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 3/32

Page 6: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

1 ¿De qué estamos hablando?

2 Diseño

3 Sintaxis

4 Niveles de comprobación

5 Modos

6 Contratos y funciones noexcept

7 Conclusiones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 4/32

Page 7: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Dos propiedades relacionadas

En el diseño de una biblioteca hay una tensión entre dospropiedades: robustez y corrección.

Robustez: Capacidad de un componente software parareaccionar en condiciones anormales.

¿Qué pasa si al añadir un elemento a un contenedor no sepuede obtener memoria dinámica?

Corrección: Grado en el que un componente softwarecumple con sus especificaciones.

¿Qué pasa si se accede a un contenedor fuera de rango?¿Qué pasa si paso un puntero nulo a strcat?

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 5/32

Page 8: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Dos propiedades relacionadas

En el diseño de una biblioteca hay una tensión entre dospropiedades: robustez y corrección.

Robustez: Capacidad de un componente software parareaccionar en condiciones anormales.

¿Qué pasa si al añadir un elemento a un contenedor no sepuede obtener memoria dinámica?

Corrección: Grado en el que un componente softwarecumple con sus especificaciones.

¿Qué pasa si se accede a un contenedor fuera de rango?¿Qué pasa si paso un puntero nulo a strcat?

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 5/32

Page 9: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Dos propiedades relacionadas

En el diseño de una biblioteca hay una tensión entre dospropiedades: robustez y corrección.

Robustez: Capacidad de un componente software parareaccionar en condiciones anormales.

¿Qué pasa si al añadir un elemento a un contenedor no sepuede obtener memoria dinámica?

Corrección: Grado en el que un componente softwarecumple con sus especificaciones.

¿Qué pasa si se accede a un contenedor fuera de rango?¿Qué pasa si paso un puntero nulo a strcat?

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 5/32

Page 10: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Robustez en la biblioteca estándar de C++

La robustez requiere la identificación y tratamiento desituaciones anormales.

Estas situaciones ocurren en programas totalmentecorrectos.

Buen ejemplo: No se puede obtener memoria dinámica.Abominación: Fin de fichero.

¿De verdad creías que eso no iba a pasar?

¿Qué hace la biblioteca estándar en C++?I Especifica la condición que causa la situación.

II La excepción que se lanzará para notificar de la situación.

Throws: bad_alloc if the storage cannot be obtained.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 6/32

Page 11: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Robustez en la biblioteca estándar de C++

La robustez requiere la identificación y tratamiento desituaciones anormales.

Estas situaciones ocurren en programas totalmentecorrectos.Buen ejemplo: No se puede obtener memoria dinámica.

Abominación: Fin de fichero.

¿De verdad creías que eso no iba a pasar?

¿Qué hace la biblioteca estándar en C++?I Especifica la condición que causa la situación.

II La excepción que se lanzará para notificar de la situación.

Throws: bad_alloc if the storage cannot be obtained.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 6/32

Page 12: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Robustez en la biblioteca estándar de C++

La robustez requiere la identificación y tratamiento desituaciones anormales.

Estas situaciones ocurren en programas totalmentecorrectos.Buen ejemplo: No se puede obtener memoria dinámica.Abominación: Fin de fichero.

¿De verdad creías que eso no iba a pasar?

¿Qué hace la biblioteca estándar en C++?I Especifica la condición que causa la situación.

II La excepción que se lanzará para notificar de la situación.

Throws: bad_alloc if the storage cannot be obtained.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 6/32

Page 13: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Robustez en la biblioteca estándar de C++

La robustez requiere la identificación y tratamiento desituaciones anormales.

Estas situaciones ocurren en programas totalmentecorrectos.Buen ejemplo: No se puede obtener memoria dinámica.Abominación: Fin de fichero.

¿De verdad creías que eso no iba a pasar?

¿Qué hace la biblioteca estándar en C++?I Especifica la condición que causa la situación.

II La excepción que se lanzará para notificar de la situación.

Throws: bad_alloc if the storage cannot be obtained.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 6/32

Page 14: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Robustez en la biblioteca estándar de C++

La robustez requiere la identificación y tratamiento desituaciones anormales.

Estas situaciones ocurren en programas totalmentecorrectos.Buen ejemplo: No se puede obtener memoria dinámica.Abominación: Fin de fichero.

¿De verdad creías que eso no iba a pasar?

¿Qué hace la biblioteca estándar en C++?I Especifica la condición que causa la situación.

II La excepción que se lanzará para notificar de la situación.

Throws: bad_alloc if the storage cannot be obtained.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 6/32

Page 15: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Robustez en la biblioteca estándar de C++

La robustez requiere la identificación y tratamiento desituaciones anormales.

Estas situaciones ocurren en programas totalmentecorrectos.Buen ejemplo: No se puede obtener memoria dinámica.Abominación: Fin de fichero.

¿De verdad creías que eso no iba a pasar?

¿Qué hace la biblioteca estándar en C++?I Especifica la condición que causa la situación.

II La excepción que se lanzará para notificar de la situación.

Throws: bad_alloc if the storage cannot be obtained.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 6/32

Page 16: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Corrección

La corrección está relacionada con encontrar defectos enun programa.

Un programa correcto no tiene defectos.

¿Qué hacen los matemáticos?Definen el dominio y el recorrido de la función.

¿Qué podemos hacer nosotros?Definir las precondiciones bajo las cuales se puedeejecutar de forma segura la operación.Definir las postcondiciones que se cumplirán tras laejecución de la operación.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 7/32

Page 17: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Corrección

La corrección está relacionada con encontrar defectos enun programa.Un programa correcto no tiene defectos.

¿Qué hacen los matemáticos?Definen el dominio y el recorrido de la función.

¿Qué podemos hacer nosotros?Definir las precondiciones bajo las cuales se puedeejecutar de forma segura la operación.Definir las postcondiciones que se cumplirán tras laejecución de la operación.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 7/32

Page 18: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Corrección

La corrección está relacionada con encontrar defectos enun programa.Un programa correcto no tiene defectos.

¿Qué hacen los matemáticos?Definen el dominio y el recorrido de la función.

¿Qué podemos hacer nosotros?Definir las precondiciones bajo las cuales se puedeejecutar de forma segura la operación.Definir las postcondiciones que se cumplirán tras laejecución de la operación.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 7/32

Page 19: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Corrección

La corrección está relacionada con encontrar defectos enun programa.Un programa correcto no tiene defectos.

¿Qué hacen los matemáticos?Definen el dominio y el recorrido de la función.

¿Qué podemos hacer nosotros?Definir las precondiciones bajo las cuales se puedeejecutar de forma segura la operación.Definir las postcondiciones que se cumplirán tras laejecución de la operación.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 7/32

Page 20: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Aproximaciones frente a la corrección

Entonces ¿Qué podemos hacer con la corrección?

No hacer nada.Más habitual de lo que uno pueda creer.

Documentar las precondiciones y postcondiciones.Muy habitual.Es lo que hace la biblioteca estándar de C++.No deja de ser documentación (ni más, ni menos)

Comprobar de forma defensiva las precondiciones ypostcondiciones.

¡No te fíes de tus clientes!Llevada al extremo puede suponer un sobrecosteimportante.Se puede hacer condicionalmente solamente en modo dedepuración. (todo lleno de assert()).

Dar soporte al análisis estático de código.Éxito variable en distintos lenguajes (Eiffel, Spark, Ada2012,C#, . . . ).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 8/32

Page 21: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Aproximaciones frente a la corrección

Entonces ¿Qué podemos hacer con la corrección?No hacer nada.

Más habitual de lo que uno pueda creer.

Documentar las precondiciones y postcondiciones.Muy habitual.Es lo que hace la biblioteca estándar de C++.No deja de ser documentación (ni más, ni menos)

Comprobar de forma defensiva las precondiciones ypostcondiciones.

¡No te fíes de tus clientes!Llevada al extremo puede suponer un sobrecosteimportante.Se puede hacer condicionalmente solamente en modo dedepuración. (todo lleno de assert()).

Dar soporte al análisis estático de código.Éxito variable en distintos lenguajes (Eiffel, Spark, Ada2012,C#, . . . ).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 8/32

Page 22: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Aproximaciones frente a la corrección

Entonces ¿Qué podemos hacer con la corrección?No hacer nada.

Más habitual de lo que uno pueda creer.Documentar las precondiciones y postcondiciones.

Muy habitual.Es lo que hace la biblioteca estándar de C++.No deja de ser documentación (ni más, ni menos)

Comprobar de forma defensiva las precondiciones ypostcondiciones.

¡No te fíes de tus clientes!Llevada al extremo puede suponer un sobrecosteimportante.Se puede hacer condicionalmente solamente en modo dedepuración. (todo lleno de assert()).

Dar soporte al análisis estático de código.Éxito variable en distintos lenguajes (Eiffel, Spark, Ada2012,C#, . . . ).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 8/32

Page 23: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Aproximaciones frente a la corrección

Entonces ¿Qué podemos hacer con la corrección?No hacer nada.

Más habitual de lo que uno pueda creer.Documentar las precondiciones y postcondiciones.

Muy habitual.Es lo que hace la biblioteca estándar de C++.No deja de ser documentación (ni más, ni menos)

Comprobar de forma defensiva las precondiciones ypostcondiciones.

¡No te fíes de tus clientes!Llevada al extremo puede suponer un sobrecosteimportante.Se puede hacer condicionalmente solamente en modo dedepuración. (todo lleno de assert()).

Dar soporte al análisis estático de código.Éxito variable en distintos lenguajes (Eiffel, Spark, Ada2012,C#, . . . ).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 8/32

Page 24: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

Aproximaciones frente a la corrección

Entonces ¿Qué podemos hacer con la corrección?No hacer nada.

Más habitual de lo que uno pueda creer.Documentar las precondiciones y postcondiciones.

Muy habitual.Es lo que hace la biblioteca estándar de C++.No deja de ser documentación (ni más, ni menos)

Comprobar de forma defensiva las precondiciones ypostcondiciones.

¡No te fíes de tus clientes!Llevada al extremo puede suponer un sobrecosteimportante.Se puede hacer condicionalmente solamente en modo dedepuración. (todo lleno de assert()).

Dar soporte al análisis estático de código.Éxito variable en distintos lenguajes (Eiffel, Spark, Ada2012,C#, . . . ).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 8/32

Page 25: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

¿Qué hace la biblioteca estándar de C++?

Sección 17.4.6.11:

Violation of the preconditions specified in a function’s Re-quires: paragraph results in undefined behavior unless thefunctions Throws: paragraph specifies throwing an excep-tion when the precondition is violated.

Efecto práctico → dos enfoques.Algunas veces se lanza una excepción.Otras veces se llega a comportamiento no definido.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 9/32

Page 26: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

¿Qué es un contrato?

Conjunto de precondiciones, postcondiciones e invariantesasociadas a las operaciones de un programa.

Precondiciones: Deben satisfacerse antes de invocar unaoperación.

Para el cliente: Requisitos que debe cumplir antes de lainvocación.Para la operación: Asunciones que puede hacer laimplementación.

Postcondiciones: Deben satisfacerse tras la ejecución de laoperación.

Para el cliente: Asunciones que puede hacer el cliente trasla invocación.Para la operación: Requisitos que debe cumplir después definalizar.

Invariantes: Deben satisfacerse siempre.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 10/32

Page 27: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

¿Qué puede pasar si no se cumple el contrato?

El programa finaliza de forma anormal (program crashversus system crash).

Podría ser peor.

Mala prensa (p.ej.: filtración de seguridad).Podría ser peor.

Desastre económico.Podría ser peor.

Pérdida de vidas.

Y además: comportamiento no definido.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 11/32

Page 28: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

¿Qué puede pasar si no se cumple el contrato?

El programa finaliza de forma anormal (program crashversus system crash).

Podría ser peor.

Mala prensa (p.ej.: filtración de seguridad).Podría ser peor.

Desastre económico.Podría ser peor.

Pérdida de vidas.

Y además: comportamiento no definido.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 11/32

Page 29: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

¿Qué puede pasar si no se cumple el contrato?

El programa finaliza de forma anormal (program crashversus system crash).

Podría ser peor.

Mala prensa (p.ej.: filtración de seguridad).Podría ser peor.

Desastre económico.Podría ser peor.

Pérdida de vidas.

Y además: comportamiento no definido.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 11/32

Page 30: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

¿Qué puede pasar si no se cumple el contrato?

El programa finaliza de forma anormal (program crashversus system crash).

Podría ser peor.

Mala prensa (p.ej.: filtración de seguridad).Podría ser peor.

Desastre económico.Podría ser peor.

Pérdida de vidas.

Y además: comportamiento no definido.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 11/32

Page 31: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

¿De qué estamos hablando?

¿Qué puede pasar si no se cumple el contrato?

El programa finaliza de forma anormal (program crashversus system crash).

Podría ser peor.

Mala prensa (p.ej.: filtración de seguridad).Podría ser peor.

Desastre económico.Podría ser peor.

Pérdida de vidas.

Y además: comportamiento no definido.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 11/32

Page 32: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Diseño

1 ¿De qué estamos hablando?

2 Diseño

3 Sintaxis

4 Niveles de comprobación

5 Modos

6 Contratos y funciones noexcept

7 Conclusiones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 12/32

Page 33: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Diseño

Principios de diseño

Soporte de lenguaje para programación basada encontratos.

Demasiado tiempo intentando una solución de biblioteca.Una solución de lenguaje permite análisis estático,optimizaciones y anti-optimizaciones.

Un programa correcto al que se le eliminan todos loscontratos debería comportarse exactamente igual.

Debe poder usarse especialmente en sistemas críticoscon restricciones.

Nos guste o no hay sistemas donde no se pueden usarexcepciones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 13/32

Page 34: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Diseño

Principios de diseño

Soporte de lenguaje para programación basada encontratos.

Demasiado tiempo intentando una solución de biblioteca.Una solución de lenguaje permite análisis estático,optimizaciones y anti-optimizaciones.

Un programa correcto al que se le eliminan todos loscontratos debería comportarse exactamente igual.

Debe poder usarse especialmente en sistemas críticoscon restricciones.

Nos guste o no hay sistemas donde no se pueden usarexcepciones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 13/32

Page 35: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Diseño

Principios de diseño

Soporte de lenguaje para programación basada encontratos.

Demasiado tiempo intentando una solución de biblioteca.Una solución de lenguaje permite análisis estático,optimizaciones y anti-optimizaciones.

Un programa correcto al que se le eliminan todos loscontratos debería comportarse exactamente igual.

Debe poder usarse especialmente en sistemas críticoscon restricciones.

Nos guste o no hay sistemas donde no se pueden usarexcepciones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 13/32

Page 36: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Diseño

Elementos de diseño

¿Cómo se especifican los contratos? ¿En la declaración?¿En la definición?¿Cuándo se comprueban los contratos?¿Puede haber múltiples niveles de comprobación?¿Qué pasa cuando se rompe un contrato?¿Qué ocurre con las funciones noexcept?

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 14/32

Page 37: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

1 ¿De qué estamos hablando?

2 Diseño

3 Sintaxis

4 Niveles de comprobación

5 Modos

6 Contratos y funciones noexcept

7 Conclusiones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 15/32

Page 38: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Idea general

Sintaxis basada en atributos.No alteran semánticamente el programa.

Precondiciones:[[ expects: condicion]]

Postcondiciones:[[ ensures: condicion]]

Invariantes: No consideradas.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 16/32

Page 39: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Idea general

Sintaxis basada en atributos.No alteran semánticamente el programa.

Precondiciones:[[ expects: condicion]]

Postcondiciones:[[ ensures: condicion]]

Invariantes: No consideradas.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 16/32

Page 40: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Idea general

Sintaxis basada en atributos.No alteran semánticamente el programa.

Precondiciones:[[ expects: condicion]]

Postcondiciones:[[ ensures: condicion]]

Invariantes: No consideradas.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 16/32

Page 41: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Idea general

Sintaxis basada en atributos.No alteran semánticamente el programa.

Precondiciones:[[ expects: condicion]]

Postcondiciones:[[ ensures: condicion]]

Invariantes: No consideradas.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 16/32

Page 42: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Precondiciones en la declaración

La declaración de una operación puede incluirprecondiciones.

template <typename T>T & mi_vector::operator[](int i )

[[ expects: 0<=i && i<size() ]]{

return v[ i ];}

La precondición se evalúa lógicamente en el contexto delllamante.

Solamente puede usar la interfaz pública.No debería tener efectos laterales.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 17/32

Page 43: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Precondiciones en la declaración

La declaración de una operación puede incluirprecondiciones.

template <typename T>T & mi_vector::operator[](int i )

[[ expects: 0<=i && i<size() ]]{

return v[ i ];}

La precondición se evalúa lógicamente en el contexto delllamante.

Solamente puede usar la interfaz pública.No debería tener efectos laterales.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 17/32

Page 44: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Postcondiciones en la declaración

Las declaración de una operación puede incluirpostcondiciones.

void queue::push(int val)[[ expects: ! full () ]][[ ensures: !empty() ]];

La postcondición se evalúa lógicamente en el contexto delllamante.

Solamente puede usar la interfaz pública.No debería tener efectos laterales.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 18/32

Page 45: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Postcondiciones en la declaración

Las declaración de una operación puede incluirpostcondiciones.

void queue::push(int val)[[ expects: ! full () ]][[ ensures: !empty() ]];

La postcondición se evalúa lógicamente en el contexto delllamante.

Solamente puede usar la interfaz pública.No debería tener efectos laterales.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 18/32

Page 46: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Comprobaciones en la implementación

El cuerpo de una operación puede incluir comprobaciones.

int f (const vector<int> & v) {int r=0;for (auto x : v) {

[[ check: x>=0]];r = max(r,x);

}}

Razones para usar comprobaciones en la implementación:

Las comprobaciones requieren acceso a detalles deimplementación no visibles en la interfaz pública.La comprobación en la implementación requiere una menorcomplejidad computacional.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 19/32

Page 47: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Sintaxis

Comprobaciones en la implementación

El cuerpo de una operación puede incluir comprobaciones.

int f (const vector<int> & v) {int r=0;for (auto x : v) {

[[ check: x>=0]];r = max(r,x);

}}

Razones para usar comprobaciones en la implementación:

Las comprobaciones requieren acceso a detalles deimplementación no visibles en la interfaz pública.La comprobación en la implementación requiere una menorcomplejidad computacional.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 19/32

Page 48: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Niveles de comprobación

1 ¿De qué estamos hablando?

2 Diseño

3 Sintaxis

4 Niveles de comprobación

5 Modos

6 Contratos y funciones noexcept

7 Conclusiones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 20/32

Page 49: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Niveles de comprobación

Niveles

Se puede realizar la compilación con distintos niveles decomprobación:

off: No se realiza ninguna comprobación.min: Comprobaciones críticas y poco costosas.default: La mayoría de las comprobaciones.max: Incluye todas las comprobaciones.

El nivel de comprobación es un parámetro de compilaciónque se pude fijar por unidad de traducción.

Se podría hacer por módulo (si/cuando tengamosmódulos).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 21/32

Page 50: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Niveles de comprobación

Niveles

Se puede realizar la compilación con distintos niveles decomprobación:

off: No se realiza ninguna comprobación.min: Comprobaciones críticas y poco costosas.default: La mayoría de las comprobaciones.max: Incluye todas las comprobaciones.

El nivel de comprobación es un parámetro de compilaciónque se pude fijar por unidad de traducción.

Se podría hacer por módulo (si/cuando tengamosmódulos).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 21/32

Page 51: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Niveles de comprobación

Especificando el nivel del contrato

Se puede especificar el nivel de comprobación de uncontrato.

Si no se indica nada, el nivel es default

double ∗ find(double ∗ v, int sz)[[ expects: v!=nullptr ; level :min]][[ expects: sz>0]][[ expects: is_sorted(v,v+sz); level :max]];

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 22/32

Page 52: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

1 ¿De qué estamos hablando?

2 Diseño

3 Sintaxis

4 Niveles de comprobación

5 Modos

6 Contratos y funciones noexcept

7 Conclusiones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 23/32

Page 53: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Efectos de la violación de un contrato

Terminación rápida (fail-fast) o terminación (terminate).Lo único que puedes hacer en algunos sistemas.

Tratar y continuar.Registrar defectos menores en archivo de log.Gestión de defectos en plug-ins.Guardar estado en un fichero y terminar limpiamente.

Informar lanzando una excepción predefinida(broken_contract).

Informar lanzando una excepción especificada por elcontrato.

El efecto es una propiedad del sistema de construcción yno se puede alterar desde el código.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 24/32

Page 54: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Efectos de la violación de un contrato

Terminación rápida (fail-fast) o terminación (terminate).Lo único que puedes hacer en algunos sistemas.

Tratar y continuar.Registrar defectos menores en archivo de log.Gestión de defectos en plug-ins.Guardar estado en un fichero y terminar limpiamente.

Informar lanzando una excepción predefinida(broken_contract).

Informar lanzando una excepción especificada por elcontrato.

El efecto es una propiedad del sistema de construcción yno se puede alterar desde el código.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 24/32

Page 55: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Efectos de la violación de un contrato

Terminación rápida (fail-fast) o terminación (terminate).Lo único que puedes hacer en algunos sistemas.

Tratar y continuar.Registrar defectos menores en archivo de log.Gestión de defectos en plug-ins.Guardar estado en un fichero y terminar limpiamente.

Informar lanzando una excepción predefinida(broken_contract).

Informar lanzando una excepción especificada por elcontrato.

El efecto es una propiedad del sistema de construcción yno se puede alterar desde el código.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 24/32

Page 56: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Efectos de la violación de un contrato

Terminación rápida (fail-fast) o terminación (terminate).Lo único que puedes hacer en algunos sistemas.

Tratar y continuar.Registrar defectos menores en archivo de log.Gestión de defectos en plug-ins.Guardar estado en un fichero y terminar limpiamente.

Informar lanzando una excepción predefinida(broken_contract).

Informar lanzando una excepción especificada por elcontrato.

El efecto es una propiedad del sistema de construcción yno se puede alterar desde el código.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 24/32

Page 57: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Efectos de la violación de un contrato

Terminación rápida (fail-fast) o terminación (terminate).Lo único que puedes hacer en algunos sistemas.

Tratar y continuar.Registrar defectos menores en archivo de log.Gestión de defectos en plug-ins.Guardar estado en un fichero y terminar limpiamente.

Informar lanzando una excepción predefinida(broken_contract).

Informar lanzando una excepción especificada por elcontrato.

El efecto es una propiedad del sistema de construcción yno se puede alterar desde el código.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 24/32

Page 58: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de precondiciones

Se aplica en el contexto del código cliente.

1. Se evalúan los argumentos de la función.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se ejecuta el cuerpo de la función.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 25/32

Page 59: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de precondiciones

Se aplica en el contexto del código cliente.

1. Se evalúan los argumentos de la función.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se ejecuta el cuerpo de la función.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 25/32

Page 60: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de precondiciones

Se aplica en el contexto del código cliente.

1. Se evalúan los argumentos de la función.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se ejecuta el cuerpo de la función.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 25/32

Page 61: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de precondiciones

Se aplica en el contexto del código cliente.

1. Se evalúan los argumentos de la función.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se ejecuta el cuerpo de la función.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 25/32

Page 62: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de precondiciones

Se aplica en el contexto del código cliente.

1. Se evalúan los argumentos de la función.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se ejecuta el cuerpo de la función.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 25/32

Page 63: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de postcondiciones

Se aplica en el contexto del código cliente.

1. Se ejecuta el cuerpo de la función y se evalúa al expresiónde return.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se continúa la ejecución en el código cliente.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 26/32

Page 64: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de postcondiciones

Se aplica en el contexto del código cliente.

1. Se ejecuta el cuerpo de la función y se evalúa al expresiónde return.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se continúa la ejecución en el código cliente.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 26/32

Page 65: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de postcondiciones

Se aplica en el contexto del código cliente.

1. Se ejecuta el cuerpo de la función y se evalúa al expresiónde return.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se continúa la ejecución en el código cliente.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 26/32

Page 66: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de postcondiciones

Se aplica en el contexto del código cliente.

1. Se ejecuta el cuerpo de la función y se evalúa al expresiónde return.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se continúa la ejecución en el código cliente.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 26/32

Page 67: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Modos

Comprobación de postcondiciones

Se aplica en el contexto del código cliente.

1. Se ejecuta el cuerpo de la función y se evalúa al expresiónde return.

2. Se evalúa cada condición cuyo nivel es igual o inferior queel de la unidad de traducción.

3. Si alguna condición se viola se opta por el efectoestablecido para la unidad de traducción.

4. Se continúa la ejecución en el código cliente.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 26/32

Page 68: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Contratos y funciones noexcept

1 ¿De qué estamos hablando?

2 Diseño

3 Sintaxis

4 Niveles de comprobación

5 Modos

6 Contratos y funciones noexcept

7 Conclusiones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 27/32

Page 69: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Contratos y funciones noexcept

Funciones noexcept

C++11 trajo el marcado noexcept que resuelve problemascon la semántica de movimiento.

Además abre la puerta a optimizaciones.

¿Podemos especificar el contrato de una funciónnoexcept?

template <typename T>T & my_vector::operator[](int i ) noexcept

[[ expects: 0<=i && i<size() ]]{

return buf[ i ];}

La violación de un contrato en una función noexceptsiempre termina la aplicación (terminate() o fail-fast).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 28/32

Page 70: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Contratos y funciones noexcept

Funciones noexcept

C++11 trajo el marcado noexcept que resuelve problemascon la semántica de movimiento.

Además abre la puerta a optimizaciones.

¿Podemos especificar el contrato de una funciónnoexcept?

template <typename T>T & my_vector::operator[](int i ) noexcept

[[ expects: 0<=i && i<size() ]]{

return buf[ i ];}

La violación de un contrato en una función noexceptsiempre termina la aplicación (terminate() o fail-fast).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 28/32

Page 71: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Contratos y funciones noexcept

Funciones noexcept

C++11 trajo el marcado noexcept que resuelve problemascon la semántica de movimiento.

Además abre la puerta a optimizaciones.

¿Podemos especificar el contrato de una funciónnoexcept?

template <typename T>T & my_vector::operator[](int i ) noexcept

[[ expects: 0<=i && i<size() ]]{

return buf[ i ];}

La violación de un contrato en una función noexceptsiempre termina la aplicación (terminate() o fail-fast).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 28/32

Page 72: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Contratos y funciones noexcept

Funciones noexcept

C++11 trajo el marcado noexcept que resuelve problemascon la semántica de movimiento.

Además abre la puerta a optimizaciones.

¿Podemos especificar el contrato de una funciónnoexcept?

template <typename T>T & my_vector::operator[](int i ) noexcept

[[ expects: 0<=i && i<size() ]]{

return buf[ i ];}

La violación de un contrato en una función noexceptsiempre termina la aplicación (terminate() o fail-fast).

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 28/32

Page 73: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

1 ¿De qué estamos hablando?

2 Diseño

3 Sintaxis

4 Niveles de comprobación

5 Modos

6 Contratos y funciones noexcept

7 Conclusiones

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 29/32

Page 74: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

Resumen

Visión general de contratos.

Se pueden añadir muchos detalles una vez se alcanceconsenso en la visión general.

Ventajas de una solución basada en el lenguaje.

Permite eliminar comprobaciones innecesarias.Permite prevenir optimizaciones con problemas deseguridad.Mejora importante para el análisis estático de código.Compatible con sistemas que no pueden usar excepciones.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 30/32

Page 75: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

Resumen

Visión general de contratos.Se pueden añadir muchos detalles una vez se alcanceconsenso en la visión general.

Ventajas de una solución basada en el lenguaje.

Permite eliminar comprobaciones innecesarias.Permite prevenir optimizaciones con problemas deseguridad.Mejora importante para el análisis estático de código.Compatible con sistemas que no pueden usar excepciones.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 30/32

Page 76: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

Resumen

Visión general de contratos.Se pueden añadir muchos detalles una vez se alcanceconsenso en la visión general.

Ventajas de una solución basada en el lenguaje.

Permite eliminar comprobaciones innecesarias.Permite prevenir optimizaciones con problemas deseguridad.Mejora importante para el análisis estático de código.Compatible con sistemas que no pueden usar excepciones.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 30/32

Page 77: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

Resumen

Visión general de contratos.Se pueden añadir muchos detalles una vez se alcanceconsenso en la visión general.

Ventajas de una solución basada en el lenguaje.Permite eliminar comprobaciones innecesarias.

Permite prevenir optimizaciones con problemas deseguridad.Mejora importante para el análisis estático de código.Compatible con sistemas que no pueden usar excepciones.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 30/32

Page 78: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

Resumen

Visión general de contratos.Se pueden añadir muchos detalles una vez se alcanceconsenso en la visión general.

Ventajas de una solución basada en el lenguaje.Permite eliminar comprobaciones innecesarias.Permite prevenir optimizaciones con problemas deseguridad.

Mejora importante para el análisis estático de código.Compatible con sistemas que no pueden usar excepciones.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 30/32

Page 79: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

Resumen

Visión general de contratos.Se pueden añadir muchos detalles una vez se alcanceconsenso en la visión general.

Ventajas de una solución basada en el lenguaje.Permite eliminar comprobaciones innecesarias.Permite prevenir optimizaciones con problemas deseguridad.Mejora importante para el análisis estático de código.

Compatible con sistemas que no pueden usar excepciones.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 30/32

Page 80: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

Resumen

Visión general de contratos.Se pueden añadir muchos detalles una vez se alcanceconsenso en la visión general.

Ventajas de una solución basada en el lenguaje.Permite eliminar comprobaciones innecesarias.Permite prevenir optimizaciones con problemas deseguridad.Mejora importante para el análisis estático de código.Compatible con sistemas que no pueden usar excepciones.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 30/32

Page 81: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

Lista incompleta de referencias

C.A.R Hoare. Hints on programming language design.Technical Report, Stanford University, CA, USA. 1973.J. Daniel García. Exploring the design space ofcontracts specification for C++. N4110. Julio 2014.J. Daniel García. C++ language support for contractprogramming. N4293. Noviembre 2014.Gabriel Dos Reis, J. Daniel García, Francesco Logozzo,Manuel Fahndrich, Shuvendu Lahri. Simple contracts forC++. N4415. Abril 2015.J. Daniel García. Three interesting questions aboutcontracts. P0166R0. Noviembre 2015.

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 31/32

Page 82: ¿Programación basada en contratos para C++17? - using std::cpp … · 2015-11-30 · ¿Programación basada en contratos para C++17? Aviso Esta obra está bajo una Licencia Creative

¿Programación basada en contratos para C++17?

Conclusiones

¿Programación basada en contratos paraC++17?

using std::cpp 2015

J. Daniel [email protected]

Grupo ARCOSUniversidad Carlos III de Madrid

18 de noviembre de 2015

cbed – J. Daniel Garcia – ARCOS@UC3M ([email protected] – @usingstdcpp – @jdgarciauc3m) 32/32