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?