SDK Multiplataforma en C logo

SDK Multiplataforma en C

Asserts

❮ Anterior
Siguiente ❯

Los asserts realizarán comprobaciones dinámicas del código cuando el programa está en ejecución.


Funciones

voidcassert (...)
voidcassert_msg (...)
voidcassert_fatal (...)
voidcassert_fatal_msg (...)
voidcassert_no_null (...)
voidcassert_no_nullf (...)
voidcassert_default (void)
voidcassert_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");
        ...
    }
    
    Captura de la ventana que aparece cuando se lanza un assert.
    Figura 1: Ventana assert mostrada tras producirse un error en tiempo de ejecución.

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.

Captura de la ventana que aparece tras un assert crítico.
Figura 2: Assert crítico causado por el acceso a un puntero nulo.
❮ Anterior
Siguiente ❯

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.

❮ Anterior
Siguiente ❯