Representación de la trampa, unsigned char y IA64 NaT

Fuente: la basura no inicializada en ia64 puede ser mortal

En el ia64, cada registro de 64 bits es en realidad 65 bits. El bit extra se llama “NaT” que significa “no una cosa”. El bit se establece cuando el registro no contiene un valor válido. Piense en ello como la versión entera de la coma flotante NaN.

El bit NaT se establece más comúnmente a partir de la ejecución especulativa. Hay una forma especial de instrucción de carga en el ia64 que intenta cargar el valor desde la memoria, pero si la carga falla (porque la memoria está paginada o la dirección no es válida), en lugar de generar un error de página, todo esto sucede. Es que el bit NaT se establece, y la ejecución continúa.

Todas las operaciones matemáticas en NaT simplemente producen NaT de nuevo.

El artículo de origen continuó explicando cómo un registro podría terminar teniendo una representación de NaT durante la carga especulativa y hace el siguiente comentario:

Para ver, si tiene un registro cuyo valor es NaT y lo respira de forma incorrecta (por ejemplo, intente guardar su valor en la memoria), el procesador generará una excepción STATUS_REG_NAT_CONSUMPTION.

De otras respuestas de desbordamiento de stack a las representaciones de Trap, parece que,
“Cualquier tipo (excepto caracteres sin signo) puede tener representaciones de trampa”.

Este enlace dice que

Las únicas garantías que brinda la norma sobre el acceso a datos no inicializados son que el tipo de carácter no firmado no tiene representaciones de captura y que el relleno no tiene representaciones de captura.

Si se asigna un registro de este tipo (un registro con conjunto de bits NaT) para almacenar un carácter no firmado sin inicializar (similar al fragmento de código del informe de defectos a continuación), ¿cómo se maneja esto de acuerdo con la norma ISO C11?

¿El informe de defectos a continuación apunta al mismo problema y se rectifica en ISO C11?

Si no, ¿cómo se maneja este caso especial?

Si el valor de l designa un objeto de duración de almacenamiento automático que podría haberse declarado con la clase de almacenamiento de registro (nunca se tomó su dirección), y ese objeto no está inicializado (no se declaró con un inicializador y no se ha realizado ninguna asignación antes de la fecha). uso), el comportamiento es indefinido

¿La adición anterior al final del informe de defectos en la sección “cambiar para C1X” maneja este caso?

informe_defecto

La siguiente función tiene un comportamiento indefinido bajo C90, pero parece ser estrictamente conforme con C99

int foo(void) { unsigned char uc; return uc + 1 >= 0; } 

Primero, si no lo has visto por ti mismo, puedes tomar el borrador final del estándar C11 desde aquí ( ver también ).

De hecho, el texto de la RD se agregó a la sección 6.3.2.1 p2, lo que hace que el código cortado no esté definido de acuerdo con C11.

Las secciones en el estándar sobre representaciones de trampas continúan excluyendo la posibilidad de que los caracteres unsigned char puedan tener una representación de trampas, pero eso no importa. Lo que hay que tener en cuenta aquí es que, como se menciona en la nota de spring de 2008 en la RD, desde una perspectiva estándar, esto no tiene por qué implicar representaciones de trampa (son solo el mecanismo probable por el cual la UB causaría una problema para ti en el metal). El problema es realmente acerca de los valores automáticos no inicializados; el párrafo enmendado resuelve esto aclarando que los caracteres unsigned char no deben considerarse exentos de un tipo general de UB simplemente debido a una de sus propiedades específicas del tipo (no agregando más complejidad a esa propiedad).

Podría imaginar que así como los bits NaT son un detalle de implementación de enteros en IA64, la ausencia de una representación de trampa es un “detalle de implementación” de un tipo particular dentro de la familia general de tipos C. El tipo real de la variable es secundario a la regla más general de que no debería sentirse seguro al acceder a ninguna variable sin inicializar; La adición aclara esa precedencia.