Red de conocimiento informático - Consumibles informáticos - Ejemplos relacionados de programación defensiva

Ejemplos relacionados de programación defensiva

1. Proteja su programa de entradas ilegales

Un buen programa no generará nada o generará un mensaje de error en caso de entradas ilegales. Hay varias formas de evitar la entrada ilegal:

(1) Verifique el valor de todos los datos de fuentes externas (fuentes externas), como el valor de los datos de la red, el valor de los datos del archivo valor. El propósito de la verificación es garantizar que el valor de los datos esté dentro de un rango permitido.

(2) Verifique el valor del parámetro de entrada de cada rutina (rutina).

Una vez que se descubre una entrada ilegal, se debe manejar de acuerdo con la situación. La mejor forma de programación defensiva es, en primer lugar, no introducir errores.

2. Aserciones

Una aserción suele ser una rutina (rutinas) o una macro (marcos). Cada afirmación suele tomar dos parámetros: una expresión booleana y un mensaje. Lo contrario de una expresión booleana indica un error. La biblioteca estándar de C proporciona una macro de afirmación, que solo toma un parámetro. El uso es el siguiente:

assert(1 == 0); // Tenga en cuenta que la expresión booleana no debe estar entre comillas. p>

Uso La macro de afirmación necesita incluir el archivo de encabezado cassert o afirmar.h. El resultado de ejecutar la declaración anterior es que el programa finaliza y se genera un mensaje similar al siguiente:

Error de aserción: 1 == 0, archivo d:\ Mis documentos\proyectos de Visual Studio\learning\assert\assert.cpp, línea 9

En términos generales, definiremos nuestra propia macro de aserción, que tiene dos Propósitos:

(1) Agregar nuevos parámetros, como agregar un parámetro de mensaje, para que la macro de afirmación genere información más rica.

(2) Cambiar el contenido del comportamiento de afirmar. La macro de afirmación en la biblioteca estándar de C interrumpirá el programa. De hecho, podemos dejar que el programa continúe ejecutándose sin interrumpirlo o ingresar al estado de depuración. Además, también podemos controlar el destino de la salida del mensaje, es decir, controlar si. el mensaje se envía a la consola o a un archivo de texto, incluso se envía a través de Internet.

La siguiente es una aserción implementada en C++:

#ifdef _DEBUG

#define Assert(exp, message) \

{ \

if (!(exp)) \

{ \

std::cout << Aserción fallida: << #exp << \n \

<< Mensaje: << mensaje << \n \

<< línea: << __LINE__ << \n \

<< archivo: < < __FILE__ << \n; \

salir(EXIT_FAILURE \

} \

}

#else

#define Assert(exp, mensaje)

#endif

Ejecutar Assert(1 == 0, Error El resultado es:

Error de aserción: 1 == 0

Mensaje: Error

línea: 24

archivo: d:\Mis documentos\visual studio proyectos\learning\assert\ afirmar .cpp

Algunas cuestiones a las que debes prestar atención al usar aserciones:

1) Usar aserciones para errores inesperados

Lo opuesto a la expresión booleana en el la aserción debe ser Para describir un error inesperado, los siguientes son algunos ejemplos de errores inesperados bajo ciertas circunstancias:

(1) Puntero nulo.

(2) El valor del parámetro de entrada o salida no está dentro del rango esperado.

(3) Matriz fuera de límites.

Los errores inesperados corresponden a errores esperados. Generalmente utilizamos código de manejo de errores para manejar los errores esperados y aserciones para manejar los errores inesperados. Durante la ejecución del código, algunos errores nunca deberían ocurrir. Estos errores son errores inesperados. Las afirmaciones pueden considerarse como comentarios ejecutables en los que no puede confiar para que el código funcione correctamente ("Código completo 2"). Por ejemplo:

int nRes = f(); // nRes está controlado por la función f La función f garantiza que el valor de retorno debe estar entre -100 ~ 100

Aseverar. (-100 <= nRes && nRes <= 100); // Aserción, un comentario ejecutable

Dado que la función f garantiza que el valor de retorno está entre -100 ~ 100, entonces si hay un valor que nRes no está en este rango, indica que se han producido errores inesperados. Hablaremos de "barreras" más adelante y luego tendremos una comprensión más profunda de las afirmaciones.

2) No coloque el código que debe ejecutarse en aserciones.

Las aserciones se utilizan para el desarrollo y mantenimiento de software y, por lo general, no se incluyen en la versión de lanzamiento.

Es incorrecto poner código que debe ejecutarse en aserciones, porque en las versiones de lanzamiento, estos códigos generalmente no se ejecutan, por ejemplo:

Assert(f()); // La función f generalmente no se ejecuta en la versión de lanzamiento

Es más seguro usar el siguiente método:

res = f();

Aseverar (res); // Seguridad

3) Utilice aserciones para datos confiables de sistemas internos en lugar de datos externos no confiables. Para datos externos no confiables, se debe usar código de manejo de errores. Nuevamente, piense en las afirmaciones como comentarios ejecutables.

Condiciones previas (precondiciones) y poscondiciones (postcondiciones)

Las condiciones previas son condiciones que el código de llamada debe garantizar que sean verdaderas antes de llamar a rutinas (rutinas) o crear instancias de objetos. Las poscondiciones son condiciones que deben cumplirse. se cumple después de ejecutar la rutina o después de crear una instancia de la clase. El siguiente es un ejemplo:

//Condición previa, donde los valores de nNum1 y nNum2 están restringidos por el código anterior y se garantiza que estarán entre -50 ~ 50

Assert( -50 < = nNum1 && nNum1 <= 50, Add_nNum1);

Assert(-50 <= nNum2 && nNum2 <= 50, Add_nNum2);

int nRes = add(nNum1 , nNum2) ;

//Post-condición

Assert(-100 <= nRes && nRes <= 100, Add_nRes);

Tenga en cuenta que desde nNum1 y nNum2 tienen valores El rango ha sido restringido, por lo que se pueden usar aserciones, pero si los valores de nNum1 y nNum2 provienen de un sistema externo no confiable, se debe usar código de manejo de errores en lugar de aserciones.

3. Tecnología de manejo de errores

Aquí describimos principalmente cómo manejar los errores esperados.

(1) Finalizar el programa en ejecución

Algunos errores son muy graves. Si ocurren, lo mejor que puede hacer es finalizar el programa y dejar que el usuario lo reinicie. Por ejemplo, para un programa de gráficos que muestra rayos X, es mucho mejor cerrar el programa si los datos son erróneos que mostrar datos erróneos.

(2) Continuar ejecutando el programa

A veces ocurre un error, pero no es necesario cerrar el programa, por lo que existen dos soluciones:

a. Manejo de errores en rutinas

Por ejemplo, dejar que la rutina devuelva un valor neutral es un método viable. Los valores neutrales se describen en algunos idiomas como "valores predeterminados de tipos", como. como números enteros El valor neutro de un puntero es 0 y el valor neutro de un puntero es NULL (o nulo, etc.)

b Manejo de errores fuera de la rutina

También es posible devolver un código de error. Devolver el código de error. Esto significa que el error será manejado por otras partes del programa en lugar de esta rutina.

Si se produce un error sin finalizar el programa, puede agregar un mensaje de advertencia al archivo de registro.

Elección: Corrección y Robustez

Algunos programas requieren una corrección muy alta, mientras que otros programas requieren una alta robustez. Generalmente solo podemos elegir uno de los dos.

(1) Corrección significa que el resultado siempre es correcto. Si se produce un error, es mejor no dar un resultado que dar un valor inexacto.

(2) Robustez significa tomar algunas medidas para garantizar que el software pueda ejecutarse normalmente, incluso si a veces aparecen algunos valores inexactos.

4. Barricadas

Las barricadas en sí son un conjunto de códigos de manejo de errores. Para las clases internas, solo necesita usar aserciones sin usar códigos de manejo de errores. Cuando la afirmación es falsa, indica que el problema radica en el programa y no en los datos, y es necesario modificar el código para eliminar el problema. Aquí, se invita a los lectores a pensar en el comienzo de este artículo: "Protección de su programa contra entradas no válidas".