plusplus - c++ website
¿Puede un simple ''char'' posiblemente tener valores de trampa? (1)
Leer
Un "valor de captura" , o "representación de captura" para el tipoT
, es una combinación de bits (del almacenamiento subyacente) que produce un valor no válido deT.
Intentar interpretar la representación de un valor no válido causará un comportamiento indefinido .
Que comience la batalla.
Otra question ha iniciado una discusión acalorada con respecto al char
, y la posibilidad de que una implementación tenga representaciones trampa para ello.
Pregunta :
- ¿Puede el
char
tener valores de trampa?
Citas que se han mencionado en la discusión anterior:
Estas secciones son las más citadas durante la argumentación anterior, ¿están en contradicción?
3.9.1p1
Tipos fundamentales[basic.fundamental]
Está definido por la implementación si un
char
puede contener valores negativos. Los caracteres pueden ser declarados explícitamentesigned
ounsigned
.Un
char,
unsigned char,
y ununsigned char
ocupan la misma cantidad de almacenamiento y tienen los mismos requisitos de alineación (3.11); Es decir, tienen la misma representación de objeto. Para los tipos de caracteres, todos los bits de la representación del objeto participan en la representación del valor.Para tipos de caracteres sin signo, todos los patrones de bits posibles de la representación del valor representan números. Estos requisitos no son válidos para otros tipos.
En cualquier implementación particular, un objeto
char
simple puede tomar los mismos valores que unsigned char
o ununsigned char;
cuál es la implementación definida.
Tipos 3.9p2
[basic.types]
tipos de[basic.types]
Para cualquier objeto (que no sea un subobjeto de clase base) de tipo
T,
pueda copiar de forma trivialT,
ya sea que el objeto tenga o no un valor válido de tipoT
, los bytes subyacentes (1.7) que forman el objeto se pueden copiar en una matriz de caracteres ounsigned char.
Si el contenido de la matriz de caracteres
char
ounsigned char
se copia nuevamente en el objeto, el objeto mantendrá su valor original.
La norma nos dice que debe haber:
- char, firmado char, unsigned char, todos del mismo tamaño
- el sizeof (char) es 1
- char tiene al menos 8 bits
- Cada combinación de bits es significativa y válida
- La matriz de caracteres está empaquetada (o se comporta si es).
No hay mucho margen de maniobra.
Sin embargo, hay sugerencias de que durante ciertos tipos de operaciones, como la carga de memoria no inicializada o las conversiones, podría ocurrir una trampa.
Sí, creo que una implementación podría tener una representación de captura donde los valores de captura podrían ocurrir como resultado de algún tipo de comportamiento no definido o no especificado, incluida la evaluación de expresiones que involucran valores no especificados / no inicializados. El patrón de bits real que conduce a un valor de captura sería invisible para la implementación.
Dicha CPU podría tener bytes de 9 bits donde solo 8 bits son visibles para el compilador y el tiempo de ejecución, y el noveno bit se usa para detectar memoria no inicializada, y activará una trampa si se carga con instrucciones (no privilegiadas).