En informática , el intercambio de punteros es la conversión de referencias basadas en el nombre o la posición en referencias de puntero directas ( direcciones de memoria ). Normalmente se realiza durante la deserialización o la carga de un objeto reubicable desde un archivo de disco, como un archivo ejecutable o una estructura de datos basada en punteros .
La operación inversa, que consiste en reemplazar punteros de memoria con símbolos o posiciones independientes de la posición, a veces se denomina " desactivación" y se realiza durante la serialización (almacenamiento). De manera alternativa, ambas operaciones también se pueden denominar "desactivación".
Es fácil crear una estructura de datos de lista enlazada utilizando elementos como este:
struct node { int datos ; struct node * siguiente ; };
Pero guardar la lista en un archivo y luego volver a cargarla romperá (en la mayoría de los sistemas operativos) todos los enlaces y hará que la lista sea inútil porque los nodos casi nunca se cargarán en las mismas ubicaciones de memoria. Una forma de guardar y recuperar la lista de manera útil es asignar un número de identificación único a cada nodo y luego deshacer los punteros convirtiéndolos en un campo que indique el número de identificación del siguiente nodo:
struct node_saved { int datos ; int número_id ; int número_id_del_siguiente_nodo ; };
Los registros como estos se pueden guardar en un archivo en cualquier orden y volver a cargarlos sin interrumpir la lista. Otras opciones incluyen guardar el desplazamiento del archivo del siguiente nodo o un número que indique su posición en la secuencia de registros guardados, o simplemente guardar los nodos en orden en el archivo.
Después de cargar una lista de este tipo, encontrar un nodo en función de su número es complicado e ineficiente (búsqueda en serie). Recorrer la lista era muy rápido con los punteros "next" originales. Para convertir la lista de nuevo a su forma original, o intercambiar los punteros, es necesario encontrar la dirección de cada nodo y convertir los campos id_number_of_next_node de nuevo en punteros directos al nodo correcto.
Hay una cantidad potencialmente ilimitada de formas en las que se puede transformar un puntero, pero algunas de las más populares incluyen:
En general, el swizzling puede ser complicado. El gráfico de referencia de punteros puede contener una cantidad arbitraria de ciclos ; esto complica el mantenimiento de una asignación de los valores antiguos no swizzling a las nuevas direcciones. Las matrices asociativas son útiles para mantener la asignación, mientras que los algoritmos como la búsqueda en amplitud ayudan a recorrer el gráfico, aunque ambos requieren almacenamiento adicional. Varias bibliotecas de serialización proporcionan sistemas generales de swizzling. Sin embargo, en muchos casos, el swizzling se puede realizar con suposiciones simplificadoras, como una estructura de árbol o lista de referencias.
Los diferentes tipos de swizzling son:
Por razones de seguridad, la eliminación de datos y la eliminación de datos se deben implementar con mucho cuidado. En particular, la presentación de un archivo especialmente diseñado por parte de un atacante puede permitir el acceso a direcciones fuera de los límites esperados y adecuados. En sistemas con protección de memoria débil, esto puede provocar la exposición de datos confidenciales o la modificación del código que probablemente se ejecute. Si el sistema no implementa protecciones contra la ejecución de datos, el sistema puede verse gravemente comprometido por la instalación de varios tipos de malware .
Los métodos de protección incluyen verificaciones antes de liberar los datos a una aplicación: