Trap Representation, unsigned char und IA64 NaT

Quelle: Nicht initialisierter Müll auf ia64 kann tödlich sein

Auf dem ia64 besteht jedes 64-Bit-Register tatsächlich aus 65 Bits. Das zusätzliche Bit heißt "NaT" und steht für "nichts". Das Bit wird gesetzt, wenn das Register keinen gültigen Wert enthält. Stellen Sie es sich als die ganzzahlige Version des Fließkommas NaN vor.

Das NaT-Bit wird am häufigsten durch spekulative Ausführung gesetzt. Auf dem ia64 gibt es eine spezielle Form der Ladeanweisung, die versucht, den Wert aus dem Speicher zu laden. Wenn das Laden jedoch fehlschlägt (weil der Speicher ausgelagert oder die Adresse ungültig ist), geschieht dies, anstatt einen Seitenfehler auszulösen wird das NaT-Bit gesetzt und die Ausführung fortgesetzt.

Alle mathematischen Operationen mit NaT erzeugen einfach wieder NaT.

Der Quellartikel erläuterte, wie ein Register beim spekulativen Laden eine NaT-Darstellung erhalten könnte, und machte folgende Bemerkung:

Wenn Sie sehen, dass Sie ein Register mit dem Wert NaT haben und es sogar falsch einatmen (z. B. versuchen, den Wert im Speicher zu speichern), löst der Prozessor eine STATUS_REG_NAT_CONSUMPTION-Ausnahme aus.

it scheint von anderen Stapelüberlauf-Antworten auf Trap-Darstellungen zu stammen,
"Jeder Typ (außer vorzeichenlose Zeichen) kann Trap-Darstellungen haben."

DiesVerknüpfun sagt, das

Die einzige Garantie, die der Standard für den Zugriff auf nicht initialisierte Daten gibt, besteht darin, dass der vorzeichenlose Zeichen-Typ keine Trap-Darstellungen und das Auffüllen keine Trap-Darstellungen enthält.

Wie wird gemäß ISO C11 verfahren, wenn ein solches Register (ein Register mit gesetztem NaT-Bit) zum Speichern eines nicht initialisierten vorzeichenlosen Zeichens (ähnlich dem Codefragment aus dem nachstehenden Fehlerbericht) zugeordnet ist?

Weist der unten stehende Fehlerbericht auf dasselbe Problem hin und wurde es in ISO C11 behoben?

Wenn nicht, wie dieser Sonderfall behandelt wird?

Wenn der Wert l ein Objekt mit automatischer Speicherdauer bezeichnet, das mit der Registerspeicherklasse deklariert werden konnte (dessen Adresse nie vergeben wurde), und das Objekt nicht initialisiert ist (nicht mit einem Initialisierer deklariert wurde und dem es zuvor nicht zugewiesen wurde die Verwendung), das Verhalten ist undefiniert

Handelt es sich bei diesem Fall um den obigen Zusatz am Ende des Fehlerberichts im Abschnitt "Änderung für C1X"?

defect_report

Die folgende Funktion hat unter C90 ein undefiniertes Verhalten, scheint jedoch unter C99 strikt konform zu sein.

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage