Wie kommt es, dass ein Hardware-Trap in einem Zeiger mit drei Zeichen nach dem Ende auftritt, auch wenn der Zeiger nie dereferenziert wird?

In seinem1. November 2005 C ++ - Spalte, Schreibt Herb Sutter ...

<code>int A[17];
int* endA = A + 17;
for( int* ptr = A; ptr < endA; ptr += 5 )
{
  // ...
}
</code>

[O] In einigen CPU-Architekturen, einschließlich der aktuellen, kann der oben erwähnte Code dazu führen, dass an dem Punkt, an dem der Zeiger "Drei nach dem Ende" erstellt wird, ein Hardware-Trap auftritt, unabhängig davon, ob dieser Zeiger jemals dereferenziert wird oder nicht.

Wie blockiert eine CPU ein Bitmuster? Wie wäre es mit ...

<code>int A[17];

// (i) hardware will trap this ?
int *pUgly = A + 18; 

// (ii) hardware will trap this, too?
int *pEnd = A + 17;
++pEnd;  

// (iii) will this fool it?
int *precious = A + 17;
unsigned long tricksy = reinterpret_cast<unsigned long>(precious) ; 
++tricksy;
int *pHobbits = reinterpret_cast<int *>(tricksy); 
</code>

Bonusfrage: Sollte der Ausdruck "einige aktuelle CPU-Architekturen" normalerweise nur für Versandprodukte verwendet werden, oder umfasst er auch imaginäre Architekturen, wenn das Werk, in dem sie beschrieben oder angedeutet sind, ein aktuelles Veröffentlichungsdatum hat?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage