Asserts
Los asserts realizarán comprobaciones dinámicas del código cuando el programa está en ejecución.
Funciones
void | cassert (...) |
void | cassert_msg (...) |
void | cassert_fatal (...) |
void | cassert_fatal_msg (...) |
void | cassert_no_null (...) |
void | cassert_no_nullf (...) |
void | cassert_default (void) |
void | cassert_set_func (...) |
Los asserts son sentencias distribuidas por el código fuente que realizan un Análisis dinámico intensivo, ayudando a detectar errores en tiempo de ejecución. Cuando la condición de un assert se vuelve FALSE
, la ejecución del programa se detiene y se muestra una ventana de aviso (Figura 1).
- Utiliza cassert para introducir una comprobación dinámica en tu código.
- Utiliza cassert_no_null para vez que tengas que acceder al contenido de un puntero.
1 2 3 4 5 6 |
void layout_vmargin(Layout *layout, const uint32_t row, const real32_t margin) { cassert_no_null(layout); cassert_msg(row < layout->num_rows, "'row' out of range"); ... } |
En este momento tenemos tres alternativas:
- Debug: Depurar el programa: Acceso a la pila de llamadas, inspeccionar variables, etc. Más en Depurando el programa.
- Continue: Continuar con la ejecución, ignorando el assert.
- Exit: Salir del programa.
Para no volver a mostrar esta ventana en próximos asserts, desactivar el check 'Show this window in next assert'
. Futuras incidencias serán dirigidas a un archivo de log. También puedes omitir volcados en este log, desactivando 'Write assert info in log'
.
Los asserts proveen información muy importante sobre una anomalía del programa y nunca deben ser ignorados.
En el ejemplo anterior hemos visto un assert "continuable", esto es, la ejecución del programa puede seguir si pulsamos [Continue]
. No obstante, como ya indicamos, no deben ignorarse indefinidamente. Por otro lado tenemos los asserts críticos (Figura 2). Normalmente están relacionados con problemas de violación de segmento ("Segmentation Fault"), donde no será posible continuar con la ejecución del programa.
cassert ()
Sentencia assert elemental. Si la condificón se evalua a FALSE
, se lanzará un assert "continuable". El mensaje mostrado será el literal de la propia condición.
void cassert(bool_t cond);
1 2 3 |
// "row < arrpt_size(layout->rows)" // will be shown in the assert window cassert(row < arrpt_size(layout->rows)); |
cond | Expresión booleana. |
cassert_msg ()
Igual que la sentencia cassert()
, pero utilizando un mensaje personalizado, en lugar del literal de la condición.
void cassert_msg(bool_t cond, const char_t *msg);
1 2 3 |
// "'row' out of range" // will be shown in the assert window cassert_msg(layout < layout->num_rows, "'row' out of range"); |
cond | Expresión booleana. |
msg | Mensaje relacionado con el assert. |
cassert_fatal ()
Igual que la sentencia cassert()
, pero lanzando un assert crítico (no "continuable").
void cassert_fatal(bool_t cond);
1 2 3 |
// "gravity > 0." // will be shown in the assert window cassert_fatal(gravity > 0.); |
cond | Expresión booleana. |
cassert_fatal_msg ()
Igual que la sentencia cassert_msg()
, pero lanzando un assert crítico (no "continuable".
void cassert_fatal_msg(bool_t cond, const char_t *msg);
1 2 3 |
// "'gravity' can't be negative." // will be shown in the assert window cassert_fatal_msg(gravity > 0., "'gravity' can't be negative"); |
cond | Expresión booleana. |
msg | Mensaje relacionado con el assert. |
cassert_no_null ()
Lanza un assert crítico si un puntero tiene valor NULL
.
void cassert_no_null(void *ptr);
ptr | Puntero a evaluar. |
cassert_no_nullf ()
Lanza un assert crítico si un puntero a función tiene valor NULL
.
void cassert_no_nullf(void *fptr);
fptr | Puntero a evaluar. |
cassert_default ()
Lanza un assert "continuable" si la sentencia switch alcanza el estado default:
Útil para asegurar que, por ejemplo, todos los valores de un enum han sido considerados.
void
cassert_default(void);
1 2 3 4 5 6 7 8 9 10 |
switch(align) { case LEFT: // Do something break; case RIGHT: // Do something break; // Others are not allowed. cassert_default(); } |
cassert_set_func ()
Establece una función personalizada para que ejecute un código alternativo cuando se produce un assert. Por defecto, en aplicaciones de escritorio, se muestra una ventana informativa (Figura 1) y se guarda el mensaje en una fichero Log.
void cassert_set_func(void *data, FPtr_assert func_assert);
data | Datos de usuario o contexto de aplicación. |
func_assert | Función callback llamada tras la activación de un assert. |
Observaciones
Al utilizar esta función se desactivará la gestión de asserts previa.