Grupo Linuxero del Bajío

La pesadilla de los punteros

Víctor Manuel Jáquez Leal

Cuando uno aprende a programar en C y se adueña del uso de los punteros, uno generalmente se siente capaz de cualquier hazaña. Sin embargo, todo poder es ilusorio, porque esconde una poderosa debilidad. El concepto de puntero es intrínsecamente demasiado frágil. Tan así que es la fuente de muchos de los agujeros de seguridad, en especial el problema conocido como Use-after-Frees.

Supongamos que uno hace uso de un recurso, un objecto por ejemplo, y tiene una referencia a través de un puntero. Digamos

Object *p = get_object();

Pero en algún momento este objeto es liberado mientras retenemos el puntero p. Y entonces, si hacemos:

p->do_action();

Tenemos, en el mejor de los casos, una falla de segmento (segmentation fault). En el peor de los casos, el método es reemplazado, a través de un buffer overflow, por una función maliciosa.

El problema es generalizado y no es, de ninguna manera, excluviso de programadores novatos. Tanto es así que Google, en Chrome, que usa C++, esta proponiendo una clase llamada MagicPtr, para manejar todos los punteros de los cuales la clase responsable no tiene control:

https://docs.google.com/document/d/1pnnOAIz_DMWDI4oIOFoMAqLnf_MZ2GsrJNb_dbQ3ZBg