Подтвердить что ты не робот

Может ли простая `char` иметь значения ловушки?

README

"Значение ловушки" или "представление ловушки" для типа T представляет собой битовую комбинацию (базового хранилища), которая дает недопустимое значение T. Попытка интерпретировать представление недопустимого значения вызовет undefined поведение.


Пусть начнется битва.

Другой вопрос начал горячую дискуссию относительно char и возможность реализации с ловушками для него.

Вопрос

  • Может ли char иметь значения ловушки?

Цитаты, упомянутые в предыдущем обсуждении:

Эти разделы являются наиболее цитируемыми во время предыдущей аргументации, противоречат ли они?

3.9.1p1 Основные типы [basic.fundamental]

Определяется реализацией, может ли char использовать отрицательные значения. Символы могут быть явно объявлены signed или unsigned.

     

A char, a signed char, и a unsigned char занимают одинаковое количество хранения и имеют одинаковые требования к выравниванию (3.11); то есть они имеют одно и то же представление объекта. Для типов символов в представлении значений участвуют все биты представления объекта.

     

Для неподписанных типов символов все возможные битовые шаблоны представления значений представляют числа. Эти требования не подходят для других типов.

     

В любой конкретной реализации простой объект char может принимать те же значения, что и тег signed char или unsigned char;, который определяется реализацией.

3.9p2 Типы [basic.types]

Для любого объекта (кроме субобъекта базового класса) тривиально-скопируемого типа T,, имеет ли объект допустимое значение типа T, базовые байты (1.7), составляющие объект, могут быть скопированы в массив char или unsigned char.

     

Если содержимое массива char или unsigned char будет скопировано обратно в объект, объект впоследствии сохранит свое исходное значение.

4b9b3361

Ответ 1

Стандарт говорит нам, что должно быть:

  • char, подписанный char, unsigned char, все одинаковый размер
  • sizeof (char) равен 1
  • char имеет не менее 8 бит
  • каждая битовая комбинация имеет смысл и действительна.
  • массив char упакован (или ведет себя, если он есть).

Там мало места для маневра.

Тем не менее есть предложения, что во время определенных видов операций, таких как загрузка неинициализированной памяти или конверсий в ловушку, может произойти.

Да, я думаю, что реализация может иметь представление ловушки, где значения ловушки могут возникать в результате какого-либо типа undefined или неопределенного поведения, включая оценку выражений, которые включают неопределенные/неинициализированные значения. Фактическая битовая диаграмма, ведущая к значению ловушки, будет невидима для реализации.

Такой процессор может иметь 9-битные байты, где только 8 бит видны компилятору и времени выполнения, а 9-й бит используется для обнаружения неинициализированной памяти и запускает ловушку, если она загружается (непривилегированными) инструкциями.