Представление Trap, без знака char и IA64 NaT

Источник: Неинициализированный мусор на ia64 может быть смертельным

На ia64 каждый 64-разрядный регистр на самом деле составляет 65 бит. Дополнительный бит называется "NaT", что означает "не вещь". Бит устанавливается, когда регистр не содержит допустимого значения. Подумайте об этом как о целочисленная версия с плавающей запятой NaN.

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

Все математические операции над NaT снова производят NaT.

В исходной статье объяснялось, как регистр может иметь представление NaT во время спекулятивной загрузки и делает следующее замечание:

Вы видите, если у вас есть регистр, значение которого NaT, и вы так сильно как дышать на нем неправильным способом (например, попытайтесь сохранить его значение для памяти), процессор поднимет STATUS_REG_NAT_CONSUMPTION исключение.

похоже, из других ответов на представления Trap, которые,
"Любой тип (кроме unsigned char) может иметь ловушечные представления".

Эта ссылка

Следующая функция имеет поведение undefined под C90, но появляется строго соответствовать требованиям C99

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

Ответы

Ответ 1

Во-первых, если вы этого не видели, вы можете взять окончательный проект стандарта C11 из здесь (см. также).

Текст из DR действительно был добавлен в раздел 6.3.2.1 p2, что делает код отрезанным undefined в соответствии с C11.

Разделы стандарта о представлениях ловушек продолжают исключать возможность того, что unsigned char может иметь ловушечное представление, но это не имеет значения. Здесь следует отметить, что, как отмечается в примечании Spring 2008 в DR, со стандартной точки зрения, на самом деле не нужно вообще включать в себя представления ловушек (это всего лишь вероятный механизм, с помощью которого UB вызывают проблемы у вас на металле). Проблема действительно в неинициализированных автоматических значениях; исправленный абзац разрешает это, поясняя, что unsigned char не следует считать исключенным из общего типа UB просто из-за одного из его специфических для типа свойств (не путем добавления большей сложности к этому свойству).

Можно предположить, что так же, как биты NaT представляют собой деталь реализации целых чисел на IA64, отсутствие представления ловушки является "деталью реализации" одного конкретного типа в общем семействе типов C. Фактический тип переменной является вторичным по отношению к более общему правилу, в котором вы не должны чувствовать безопасный доступ к любой переменной, неинициализированной; добавление уточняет, что приоритет.