2008-10-31 42 views

Respuesta

34

Las afirmaciones son una forma de verificar explícitamente las suposiciones que hace su código, lo que le ayuda a rastrear muchos errores al limitar cuáles podrían ser los posibles problemas. Por lo general, solo se evalúan en una versión especial de "depuración" de su aplicación, por lo que no ralentizarán la versión de lanzamiento final.

Digamos que usted escribió una función que tomó un puntero como argumento. Hay una buena posibilidad de que su código suponga que el puntero no es NULL, entonces ¿por qué no verificarlo explícitamente con una aserción? Así es como:

#include <assert.h> 

void function(int* pointer_arg) 
{ 
    assert(pointer_arg != NULL); 

    ... 
} 

Una cosa importante a tener en cuenta es que las expresiones puedes reclamar ningún caso pueden haber efectos secundarios, ya que no estarán presentes en la versión de lanzamiento. Así que nunca hacer algo como esto:

assert(a++ == 5); 

Algunas personas también les gusta añadir pequeños mensajes en sus afirmaciones para ayudarles a dar sentido. Desde una cadena siempre evaulates a verdadero, se podría escribir esto:

assert((a == 5) && "a has the wrong value!!"); 
+0

No he visto el anding con una cuerda antes. ¡Realmente útil! –

+0

Ese tipo de truco (o una variación similar) se usa todo el tiempo en Perl-land, es decir, usando el ejemplo dado: a == 5 || morir ("a tiene el valor incorrecto"); Hurra por tipear booleanos sueltos. –

+0

Otro truco a lo largo de las líneas de esta cadena es cuando se validan valores en el código de liberación, pero se afirman en el código de depuración. Por ejemplo, use primero una comprobación if (x> 10) y luego, si pasa la condición errónea, simplemente haga una afirmación (! "X out of bounds") y luego imprima en un archivo de registro, etc. – Marcin

6

Las aserciones son expresiones booleanas que siempre deberían ser verdaderas.

Se utilizan para garantizar que lo que espera es también lo que sucede.

void some_function(int age) 
{ 
    assert(age > 0); 
} 

usted escribió la función para hacer frente a las edades, también 'saber' para asegurarse de que siempre está pasando argumentos sensatos, a continuación, utiliza una aserción. Es como decir "sé que esto nunca puede salir mal, pero si lo hace, quiero saber", porque, bueno, todos cometemos errores.

Por lo tanto, no es para comprobar la entrada del usuario sensible, si hay situaciones donde algo puede salir mal, no use una afirmación. Haz verificaciones reales y lidia con los errores.

Las afirmaciones son típicamente solo para compilaciones de depuración, así que no coloque código con efectos secundarios en las afirmaciones.

1

Una afirmación es algo que agrega a su programa que hace que el programa se detenga inmediatamente si se cumple una condición y muestra un mensaje de error. Generalmente los usa para cosas que cree que nunca pueden suceder en su código.

0

Aquí es una definition de lo que es una afirmación y here es un código de ejemplo. En pocas palabras, una afirmación es una forma para que un desarrollador pruebe sus suposiciones sobre el estado del código en cualquier punto dado. Por ejemplo, si estuviera haciendo el siguiente código:

mypointer->myfunct(); 

es probable que desee afirmar que mypointer no es NULL, porque ese es su suposición - que mypointer nunca habrá NULL antes de la llamada.

2

Las afirmaciones son afirmaciones que le permiten probar cualquier suposición que pueda tener en su programa. Esto es especialmente útil para documentar la lógica de su programa (condiciones previas y posteriores). Las afirmaciones que fallan generalmente arrojan errores de tiempo de ejecución, y son señales de que algo está muy mal con tu programa: tu afirmación falló porque algo que creías que era cierto no lo era. Las razones usuales son: hay un error en la lógica de su función, o la persona que llama de su función le pasó datos erróneos.

6

Las aserciones se utilizan para verificar supuestos de diseño, generalmente en términos de parámetros de entrada y resultados de devolución. Por ejemplo

// Given customer and product details for a sale, generate an invoice 

Invoice ProcessOrder(Customer Cust,Product Prod) 
{ 
    assert(IsValid(Cust)); 
    assert(IsValid(Prod); 
' 
' 
' 
    assert(IsValid(RetInvoice)) 
    return(RetInvoice); 

} 

no se requieren las declaraciones de aserción para el código de correr, pero que comprueban la validez de la entrada y la salida. Si la entrada no es válida, hay un error en la función de llamada. Si la entrada es válida y la salida no es válida, hay un error en este código. Ver design by contract para más detalles de este uso de aseveraciones.

Editar: Como se señaló en otras publicaciones, la implementación predeterminada de assert no está incluida en el tiempo de ejecución de la versión. Una práctica común que muchos usarían, incluyéndome a mí, es reemplazarla por una versión incluida en la compilación de lanzamiento, pero solo se llama en un modo de diagnóstico. Esto permite realizar pruebas de regresión adecuadas en compilaciones de lanzamiento con verificación de aserción completa. Mi versión es la siguiente;

extern void _my_assert(void *, void *, unsigned); 

#define myassert(exp)        \ 
{             \ 
    if (InDiagnostics)        \ 
     if (!(exp))        \ 
      _my_assert(#exp, __FILE__, __LINE__); \ 
}             \ 

Hay una pequeña sobrecarga en tiempo de ejecución de esta técnica, pero se hace el seguimiento de los errores que han hecho en el campo mucho más fácil.

3

Use las aserciones para comprobar si hay situaciones en las que no se puede pasar.

Uso típico: verifique los argumentos inválidos/imposibles en la parte superior de una función.

Rara vez se ha visto, pero sigue siendo útil: invariantes de bucle y postcondiciones.

1

Esto no se refiere a la instalaciónafirman que ha llegado hasta nosotros desde los primeros días de C, pero también debe ser consciente de Boost StaticAssert funcionalidad, en caso de que sus proyectos pueden usar Boost.

El estándar C/C++ assert funciona durante el tiempo de ejecución. La función Boost StaticAssert le permite realizar algunas clases de aserciones en tiempo de compilación, detectando errores lógicos y similares incluso antes.

Cuestiones relacionadas