tour plusplus plus oficial documentacion c++ c++11 language-lawyer c++14

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 tipo T , es una combinación de bits (del almacenamiento subyacente) que produce un valor no válido de T. 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ícitamente signed o unsigned .

Un char, un signed char, y un unsigned 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 un signed char o un unsigned 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 trivial T, ya sea que el objeto tenga o no un valor válido de tipo T , los bytes subyacentes (1.7) que forman el objeto se pueden copiar en una matriz de caracteres o unsigned char.

Si el contenido de la matriz de caracteres char o unsigned 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).