Aliasing (informática)


En informática , el alias describe una situación en la que se puede acceder a una ubicación de datos en la memoria a través de diferentes nombres simbólicos en el programa. Por lo tanto, modificar los datos a través de un nombre modifica implícitamente los valores asociados con todos los nombres con alias, lo que puede no ser esperado por el programador. Como resultado, el alias hace que sea particularmente difícil comprender, analizar y optimizar los programas. Los analizadores de alias tienen la intención de crear y calcular información útil para comprender el alias en los programas.

Por ejemplo, la mayoría de las implementaciones del lenguaje de programación C no realizan la verificación de los límites de la matriz . Luego, se puede explotar la implementación del lenguaje de programación por parte del compilador y las convenciones del lenguaje ensamblador de la arquitectura de la computadora , para lograr efectos de alias escribiendo fuera de la matriz (un tipo de desbordamiento de búfer ). Esto invoca un comportamiento indefinido de acuerdo con la especificación del lenguaje C; sin embargo, muchas implementaciones de C mostrarán los efectos de alias descritos aquí.

Si se crea una matriz en la pila , con una variable dispuesta en la memoria directamente al lado de esa matriz , se podría indexar fuera de la matriz y cambiar directamente la variable cambiando el elemento de la matriz relevante. Por ejemplo, si hay una intmatriz de tamaño 2 (para este ejemplo, llámela arr), junto a otra intvariable (llámela i), arr[2](es decir, el tercer elemento) sería un alias isi son adyacentes en la memoria.

Esto es posible en algunas implementaciones de C porque una matriz es un bloque de memoria contigua, y los elementos de la matriz simplemente se referencian mediante compensaciones de la dirección del comienzo de ese bloque multiplicada por el tamaño de un solo elemento. Dado que C no tiene límites, es posible verificar, indexar y direccionar fuera de la matriz. Tenga en cuenta que el comportamiento de alias antes mencionado es un comportamiento indefinido . Algunas implementaciones pueden dejar espacio entre matrices y variables en la pila, por ejemplo, para alinear variables en ubicaciones de memoria que son un múltiplo del tamaño de palabra nativo de la arquitectura . El estándar C generalmente no especifica cómo se distribuirán los datos en la memoria. (ISO/IEC 9899:1999, sección 6.2.6.1).

No es un error que un compilador omita los efectos de alias para los accesos que se encuentran fuera de los límites de una matriz.

Otra variedad de alias puede ocurrir en cualquier idioma que pueda hacer referencia a una ubicación en la memoria con más de un nombre (por ejemplo, con punteros ). Vea el ejemplo en C del algoritmo de intercambio XOR que es una función; asume que los dos punteros que se le pasan son distintos, pero si de hecho son iguales (o alias entre sí), la función falla. Este es un problema común con las funciones que aceptan argumentos de puntero, y su tolerancia (o la falta de ella) para el alias debe documentarse cuidadosamente, particularmente para las funciones que realizan manipulaciones complejas en las áreas de memoria que se les pasan.