Источник: Неинициализированный мусор на ia64 может быть смертельным
На ia64 каждый 64-разрядный регистр на самом деле составляет 65 бит. Дополнительный бит называется "NaT", что означает "не вещь". Бит устанавливается, когда регистр не содержит допустимого значения. Подумайте об этом как о целочисленная версия с плавающей запятой NaN.
бит NaT устанавливается чаще всего из спекулятивного исполнения. Там является специальной формой инструкции по загрузке на ia64, которая пытается загрузите значение из памяти, но если сбой загрузки (поскольку память выгружается или адрес недействителен), то вместо повышения ошибка страницы, все, что происходит, это то, что бит NaT устанавливается, и выполнение продолжается.
Все математические операции над NaT снова производят NaT.
В исходной статье объяснялось, как регистр может иметь представление NaT во время спекулятивной загрузки и делает следующее замечание:
Вы видите, если у вас есть регистр, значение которого NaT, и вы так сильно как дышать на нем неправильным способом (например, попытайтесь сохранить его значение для памяти), процессор поднимет STATUS_REG_NAT_CONSUMPTION исключение.
похоже, из других ответов на представления Trap, которые,
"Любой тип (кроме unsigned char) может иметь ловушечные представления".
int foo(void) {
unsigned char uc;
return uc + 1 >= 0;
}