Abordar la forma canónica y la aritmética del puntero

En arquitecturas compatibles con AMD64, las direcciones deben estar en forma canónica antes de ser desreferenciadas.

Desde elManual de Intel, sección 3.3.7.1:

En el modo de 64 bits, se considera que una dirección está en forma canónica si los bits de dirección 63 hasta el bit implementado más significativo por la microarquitectura se establecen en todos o en todos los ceros.

Ahora, el bit implementado más significativo en los sistemas operativos y arquitecturas actuales es el bit 47. Esto nos deja con un espacio de direcciones de 48 bits.

Especialmente cuandoASLR está habilitado, los programas de usuario pueden esperar recibir una dirección con el conjunto de 47 bits.

Si se utilizan optimizaciones como el etiquetado de puntero y los bits superiores se utilizan para almacenar información, el programa debe asegurarse de que los 48 a 63 bits se vuelven a establecer en el 47. bit antes de desreferenciar la dirección.

Pero considere este código:

int main()
{
    int* intArray = new int[100];

    int* it = intArray;

    // Fill the array with any value.
    for (int i = 0; i < 100; i++)
    {
        *it = 20;
        it++;   
    }

    delete [] intArray;
    return 0;
}

Ahora considera esointArray es decir:

0000 0000 0000 00000111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100

Después de configurarit aintArray y aumentandoit una vez, y considerandosizeof(int) == 4, Se convertirá:

0000 0000 0000 00001000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

El bit 47 está en negrita. Lo que sucede aquí es que el segundo puntero recuperado por la aritmética del puntero no es válido porque no está en forma canónica. La dirección correcta debe ser:

1111 1111 1111 11111000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

¿Cómo manejan los programas esto? ¿Existe alguna garantía por parte del sistema operativo de que nunca se le asignará memoria cuyo rango de direcciones no varíe en el bit 47?

Respuestas a la pregunta(1)

Su respuesta a la pregunta