In seiner November 1, 2005 C++ column, Herb Sutter schreibt ...Wie geschieht ein Hardware-Trap in einem Drei-nach-dem-Ende-Zeiger, selbst wenn der Zeiger niemals dereferenziert wird?
int A[17];
int* endA = A + 17;
for(int* ptr = A; ptr < endA; ptr += 5)
{
// ...
}
[O] n einige CPU-Architekturen, einschließlich aktuellen, verursachen die oben genannten Code kann ein Hardware-Falle bei der Punkt zu kommen, wo Der Drei-nach-dem-Ende-Zeiger wird erstellt, unabhängig davon, ob der Zeiger jemals dereferenziert wurde oder nicht.
Wie fängt eine CPU auf einem Bitmuster? Was ist mit ...
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);
Bonus Frage: Sollte der Ausdruck „einige aktuelle CPU-Architekturen“ verstanden werden normalerweise nur zu Versandprodukte beziehen, oder ist es imaginären Architekturen auch wenn das Werk der Fiktion sind, in denen sie beschrieben oder angespielt haben, hat ein neues Veröffentlichungsdatum?
ist es nicht vier-nach-dem-Ende genau wie endA ist eins-nach-dem-Ende? –