SDK Multiplataforma en C logo

SDK Multiplataforma en C

Punteros

❮ Anterior
Siguiente ❯

Manipulación segura de punteros.


Funciones

voidptr_get (...)
voidptr_dget (...)
voidptr_dget_no_null (...)
voidptr_assign (...)
voidptr_destopt (...)
voidptr_copyopt (...)

La librería sewer proporciona macros y funciones para la manipulación "segura" de punteros. Por "seguro" entendemos el hecho de que el SDK detectará el acceso indebido a un puntero justamente antes de que se produzca una violación de segmento. ¿Que sentido tiene detectar accesos indebidos a memoria, si el programa va a fallar de todos modos? La detección previa juega un papel muy importante al ejecutar tests automatizados. Antes del inevitable cierre del proceso, dejará un apunte en el registro de ejecución log.txt, indicando el motivo del cierre.

  • Utiliza ptr_get para obtener el contenido de un puntero.
  • 1
    2
    3
    4
    5
    6
    7
    8
    
    // v2 = NULL
    // Segmentation fault
    V2Df v1 = *v2;
    
    // "v2 is NULL in file::line" 
    // will be record in log.txt
    // and then, Segmentation fault
    V2Df v1 = ptr_get(v2, V2Df);  
    
❮ Anterior
Siguiente ❯

ptr_get ()

Acceso al contenido del puntero (dereferencia), verificando previamente que no sea NULL.

void
ptr_get(type *ptr,
        type);
1
2
3
4
5
6
void compute(const V2Df *v1, const V2Df *v2)
{
    /* Safer than t = *v1; */
    V2Df t = ptr_get(v1, V2Df);
    ...
}
ptr

Puntero.

type

Tipo de puntero.


ptr_dget ()

Accede al contenido de un doble puntero, invalidándolo posteriormente.

void
ptr_dget(type **ptr,
         type);
1
2
3
4
5
6
7
8
9
Ctrl *create(Model **model, View **view)
{
    Ctrl *ctrl = heap_new(Ctrl);
    ctrl->model = ptr_dget(model, Model);
    ctrl->view = ptr_dget(view, View);
    // *model = NULL
    // *view = NULL
    return ctrl;
}
ptr

Double puntero.

type

Tipo de puntero.


ptr_dget_no_null ()

Igual que ptr_dget, pero el contenido del double puntero (*dptr) no puede ser NULL.

void
ptr_dget_no_null(type **ptr,
                 type);
1
2
3
4
5
6
7
8
Ctrl *create(Model **model, View **view)
{
    // *model and *view can't be NULL
    Ctrl *ctrl = heap_new(Ctrl);
    ctrl->model = ptr_dget_no_null(model, Model);
    ctrl->view = ptr_dget_no_null(view, View);
    return ctrl;
}
ptr

Double puntero.

type

Tipo de puntero.


ptr_assign ()

Asigna el contenido de un puntero a otro, si el destino no es NULL.

void
ptr_assign(dest,
           src);
dest

Puntero destino.

src

Puntero origen.


ptr_destopt ()

Destruye un objeto, si no es NULL.

void
ptr_destopt(FPtr_destroy func_destroy,
            type dptr,
            type);
1
2
3
4
5
6
cassert_no_null(dptr);
if (*dptr != NULL)
{
    func_destroy(*dptr);
    *dptr = NULL;
}
func_destroy

Destructor.

dptr

Doble puntero al objeto a destruir.

type

Tipo de objeto.


ptr_copyopt ()

Copia el objeto si no es NULL.

void
ptr_copyopt(FPtr_copy func_copy,
            type ptr,
            type);
1
2
3
4
if (ptr != NULL)
    return func_copy(ptr);
else
    return NULL;
func_copy

Constructor de copia.

ptr

Objeto a copiar (origen).

type

Tipo de objeto.

❮ Anterior
Siguiente ❯