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

README

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


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

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

Вопрос:

  • Может ли char иметь значения прерывания?

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

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

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

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

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

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

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

3.9p2 Типы [basic.types]

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

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


person Filip Roséen - refp    schedule 04.06.2014    source источник
comment
Значения ловушки: stackoverflow.com/questions/6725809/trap-presentation/   -  person QuestionC    schedule 04.06.2014
comment
Из стандарта C ++ 11 Объект типа unsigned char с неопределенным значением, присвоенным регистру, может перехватить. - если это так, то я ожидаю, что это будет правдой в отношении char и signed char.   -  person Tony Delroy    schedule 04.06.2014
comment
Филип, можем ли мы рассматривать AddressSanitizer / MemorySanitizer (дополнительная функция в современных LLVM и GCC) как подтверждение языковой реализации? Sanitizers добавляет несколько тегов к каждому слову памяти (хранится в отдельной памяти, по образцу тегов советской архитектуры Эльбруса, аналогичная идея в некоторых крупных Burroughs), а также есть ловушки для некоторых значений тегов, например, чтение неинициализированной памяти.   -  person osgx    schedule 04.06.2014
comment
Стандарт C ++ 11 также явно перечисляет numeric_limits<> специализации для unsigned-, signed- и неуказанных char, а также есть член static constexpr bool traps, чтобы вы могли проверять во время компиляции, утверждать, если вам не все равно, и т. Д.   -  person Tony Delroy    schedule 04.06.2014
comment
Не могли бы проголосовавшие объяснить, почему этот вопрос привлекает -1?   -  person Filip Roséen - refp    schedule 04.06.2014


Ответы (1)


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

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

Здесь не так много места для маневра.

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

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

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

person david.pfx    schedule 05.06.2014
comment
AddressSanitizer - программный эмулятор такого процессора, у него есть дополнительные биты тегов для каждого адреса памяти. - person osgx; 06.06.2014
comment
@osgx: Да, думаю, может. Я работал над большими системами Берроуза, которые помечали слова, а не символы. В архитектуре с тегами такое значение ловушки мне кажется возможным. - person david.pfx; 06.06.2014
comment
Первоначальный IBM PC имел 9-битные байты, из которых только 8 битов обычно были доступны для ЦП; хранилище памяти обычно записывает 9-й бит как бит четности для других 8, а чтение из памяти обычно запускает немаскируемое прерывание, если 9-й бит не соответствует четности других 8, но были какие Я понимаю некоторые редко используемые диагностические регистры, которые могут изменить это поведение. - person supercat; 15.01.2015